123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 |
- #define Global
- #include "object.h"
- #include <limits>
- Object::Object( QString id, int classId )
- : id( id ),
- classId( classId )
- {}
- // Setzt die Objekt-ID
- void Object::setId( QString id )
- {
- this->id = id;
- }
- // Gibt die Objekt-ID zurück
- QString Object::getId() const
- {
- return id;
- }
- // Setzt die ID der Klasse
- void Object::setClassId( int id )
- {
- classId = id;
- }
- // Gibt die ID der Klasse zurück
- int Object::getClassId() const
- {
- return classId;
- }
- // Vergleicht zwei Objekte anhand ihrer ID
- bool operator == (const Object &p1, const Object &p2)
- {
- return p1.getId() == p2.getId();
- }
- // Inhalt der _ObjektPolygon Klasse
- //----------------------------------
- _ObjectPolygon::_ObjectPolygon( QString id, QPolygon po, bool truncated, int index, FrameTreeNode *parent )
- : FrameTreeNode( index, parent, 2 ),
- id( id ),
- truncated( truncated ),
- selected( 1 ),
- ref( 1 )
- {
- polygon.append( po );
- }
- // Setzt die Objekt-ID
- void _ObjectPolygon::setId( QString id )
- {
- this->id = id;
- }
- // Legt fest, ob das Objekt versteckt ist (falls s = 0)
- void _ObjectPolygon::setSelected( bool s )
- {
- this->selected = s;
- }
- // Entfernt alle Ecken in einer Region r. Gibt 0 zurück, fall das Objekt komplett entfernt werden soll
- bool _ObjectPolygon::removeVertices( QRect r )
- {
- for( auto p = polygon.begin(); p != polygon.end(); p++ )
- {
- QPolygon &pol = *p;
- int anz = pol.size();
- for( int i = 0; i < anz; i++ )
- {
- QPoint v = pol.at( i );
- if( r.contains( v ) )
- {
- pol.removeAt( i );
- i--;
- anz--;
- }
- }
- }
- int pAnz = polygon.size();
- for( int j = 0; j < pAnz; j++ )
- {
- int anz = polygon.at( j ).size();
- if( anz < 3 )
- {
- polygon.removeAt( j );
- j--;
- pAnz--;
- }
- }
- return pAnz >= 1;
- }
- // Verschiebt den intex-ten Vertex aus dem pIndex-ten Polygon auf Position newPos.
- // max: Die maximale Größe des Bildes. Falls newPos außerhalb des Bildes liegt, wird automatisch der nächste Punkt im Bild genommen.
- void _ObjectPolygon::moveVertex( int index, QPoint newPos, QSize max, int pIndex )
- {
- int pI = 0;
- for( auto p = polygon.begin(); p != polygon.end(); p++ )
- {
- QPolygon &pol = *p;
- if( pI == pIndex )
- {
- int i = 0;
- for( auto point = pol.begin(); point != pol.end(); point++, i++ )
- {
- if( i == index )
- {
- *point = newPos;
- if( point->x() < 0 )
- point->setX( 0 );
- if( point->y() < 0 )
- point->setY( 0 );
- if( point->x() >= max.width() )
- point->setX( max.width() - 1 );
- if( point->y() >= max.height() )
- point->setY( max.height() - 1 );
- }
- }
- }
- pI++;
- }
- }
- // Fügt an Slette index im pIndexten Polygon den Eckpunkt v ein
- void _ObjectPolygon::insertVertex( int index, QPoint v, int pIndex )
- {
- int pI = 0;
- for( auto p = polygon.begin(); p != polygon.end(); p++ )
- {
- QPolygon &pol = *p;
- if( pI == pIndex )
- pol.insert( index, v );
- pI++;
- }
- }
- // Spaltet das pIndexte Polygon indem zwischen dem begin-ten Eckpunkt und dem end-ten Eckpunkt geschnitten wird.
- // Gibt das neu entstandene Polygon zurück (eine hälfte des alten, die aus diesem entfernt wurde)
- QPolygon _ObjectPolygon::split( int begin, int end, int pIndex )
- {
- int pI = 0;
- for( auto p = polygon.begin(); p != polygon.end(); p++ )
- {
- QPolygon &pol = *p;
- if( pI == pIndex )
- {
- QPolygon newP;
- int size = pol.size();
- for( int i = begin; true; i++ )
- {
- if( i >= size )
- i = 0;
- newP.append( pol.at( i ) );
- if( i == end )
- break;
- }
- int removeIndex = begin + 1;
- for( int i = begin + 1; true; i++ )
- {
- if( i >= size )
- {
- i = 0;
- removeIndex = 0;
- }
- if( i == end )
- break;
- pol.removeAt( removeIndex );
- }
- return newP;
- }
- }
- }
- // Setzt den Truncated Flag
- void _ObjectPolygon::setTruncated( bool truncated )
- {
- this->truncated = truncated;
- }
- // Gibt 1 zurück, wenn das Objekt nicht Versteckt ist
- bool _ObjectPolygon::isSelected() const
- {
- return selected;
- }
- // Gibt die Bounding Box zurück
- QRect _ObjectPolygon::getBoundingBox() const
- {
- int minX = INT_MAX, minY = INT_MAX, maxX = 0, maxY = 0;
- for( QPolygon pol : polygon )
- {
- for( QPoint point : pol )
- {
- if( point.x() < minX )
- minX = point.x();
- if( point.y() < minY )
- minY = point.y();
- if( point.x() > maxX )
- maxX = point.x();
- if( point.y() > maxY )
- maxY = point.y();
- }
- }
- return QRect( minX, minY, maxX - minX, maxY - minY );
- }
- // Gibt this zurück
- void *_ObjectPolygon::getNodeObject() const
- {
- return (void*)this;
- }
- // Gibt 1 zurück, falls Truncated gesetzt wurde
- bool _ObjectPolygon::isTruncated() const
- {
- return truncated;
- }
- // Gibt die Objekt-ID zurück
- QString _ObjectPolygon::getId() const
- {
- return id;
- }
- // Gibt eine Liste mit den Polygonen zurück
- QList< QPolygon > &_ObjectPolygon::getPolygonList()
- {
- return polygon;
- }
- // Inhalt der ObjektPolygon Klasse
- //---------------------------------
- // Erstellt ein auf Null zeigendes ObjektPolygon
- ObjectPolygon::ObjectPolygon()
- {
- ptr = 0;
- }
- // Erzeugt ein neues Objekt Polygon, welches auf ein bestimmtes Objekt zeigt
- ObjectPolygon::ObjectPolygon( _ObjectPolygon *ptr )
- {
- this->ptr = ptr;
- if( this->ptr )
- this->ptr->ref++;
- }
- // Erzeugt ein neues Objekt Polygon mit neuem Objekt
- // id: Die Objekt ID
- // po: Das Polygon
- // truncated: 1, falls das Objekt abgeschnitten ist
- // parent: Der Elternknoten im Baum der Sequenz (das Bild zu dem das Objekt gehört)
- ObjectPolygon::ObjectPolygon( QString id, QPolygon po, bool truncated, int index, FrameTreeNode *parent )
- {
- ptr = new _ObjectPolygon( id, po, truncated, index, parent );
- numObjects++;
- }
- // Copy Constructor
- ObjectPolygon::ObjectPolygon( const ObjectPolygon &op )
- : ObjectPolygon( op.ptr )
- {}
- ObjectPolygon::~ObjectPolygon()
- {
- if( ptr && !--ptr->ref )
- {
- delete ptr;
- numObjects--;
- }
- }
- // Operator um auf das unterliegende _ObjectPolygon zuzugreifen
- _ObjectPolygon *ObjectPolygon::operator->() const
- {
- return ptr;
- }
- // Gibt 1 zurück, falls auf das gleiche Objekt verwiesen wird
- bool ObjectPolygon::operator==( const ObjectPolygon &op ) const
- {
- return ptr == op.ptr;
- }
- // Gibt 1 zurück, falls nicht auf das gleiche Objekt verwiesen wird
- bool ObjectPolygon::operator!=( const ObjectPolygon &op ) const
- {
- return ptr != op.ptr;
- }
- // Setzt den Zeiger auf das _ObjectPolygon Objekt
- bool ObjectPolygon::operator=( const ObjectPolygon &op )
- {
- if( ptr && !--ptr->ref )
- {
- delete ptr;
- numObjects--;
- }
- ptr = op.ptr;
- if( ptr )
- ptr->ref++;
- }
- // Gibt 1 zurück, falls der Zeiger nicht inizialisiert wurde
- bool ObjectPolygon::isNull() const
- {
- return ptr == 0;
- }
|