Implementation of PlanarFigure representing a polygon with two or more control points. More...
#include <mitkPlanarPolygon.h>
Public Types | |
typedef PlanarPolygon | Self |
typedef PlanarFigure | Superclass |
typedef itk::SmartPointer< Self > | Pointer |
typedef itk::SmartPointer < const Self > | ConstPointer |
Public Member Functions | |
virtual const char * | GetClassName () const |
virtual void | SetClosed (bool closed) |
Set whether the polygon should be closed between first and last control point or not. | |
virtual void | ClosedOn () |
virtual void | ClosedOff () |
unsigned int | GetMinimumNumberOfControlPoints () const |
Place figure in its minimal configuration (a point at least) onto the given 2D geometry. | |
unsigned int | GetMaximumNumberOfControlPoints () const |
Polygon maximum number of control points is principally not limited. | |
Static Public Member Functions | |
static Pointer | New () |
Protected Member Functions | |
PlanarPolygon () | |
virtual | ~PlanarPolygon () |
virtual void | GeneratePolyLine () |
Generates the poly-line representation of the planar figure. | |
virtual void | GenerateHelperPolyLine (double mmPerDisplayUnit, unsigned int displayHeight) |
Generates the poly-lines that should be drawn the same size regardless of zoom. | |
virtual void | EvaluateFeaturesInternal () |
Calculates feature quantities of the planar figure. | |
bool | CheckForLineIntersection (Point2D p1, Point2D p2, Point2D p3, Point2D p4) |
virtual void | PrintSelf (std::ostream &os, itk::Indent indent) const |
Protected Attributes | |
const unsigned int | FEATURE_ID_CIRCUMFERENCE |
const unsigned int | FEATURE_ID_AREA |
Implementation of PlanarFigure representing a polygon with two or more control points.
Definition at line 35 of file mitkPlanarPolygon.h.
typedef itk::SmartPointer<const Self> mitk::PlanarPolygon::ConstPointer |
Reimplemented from mitk::PlanarFigure.
Definition at line 38 of file mitkPlanarPolygon.h.
typedef itk::SmartPointer<Self> mitk::PlanarPolygon::Pointer |
Reimplemented from mitk::PlanarFigure.
Definition at line 38 of file mitkPlanarPolygon.h.
Reimplemented from mitk::PlanarFigure.
Definition at line 38 of file mitkPlanarPolygon.h.
Reimplemented from mitk::PlanarFigure.
Definition at line 38 of file mitkPlanarPolygon.h.
mitk::PlanarPolygon::PlanarPolygon | ( | ) | [protected] |
Definition at line 27 of file mitkPlanarPolygon.cpp.
References mitk::PlanarFigure::m_PolyLines, mitk::BoolProperty::New(), mitk::PlanarFigure::ResetNumberOfControlPoints(), and mitk::BaseData::SetProperty().
: FEATURE_ID_CIRCUMFERENCE( this->AddFeature( "Circumference", "mm" ) ), FEATURE_ID_AREA( this->AddFeature( "Area", "mm^2" ) ) { // Polygon has at least two control points this->ResetNumberOfControlPoints( 2 ); // Polygon is closed by default this->SetProperty( "closed", mitk::BoolProperty::New( true ) ); m_PolyLines->InsertElement( 0, VertexContainerType::New()); }
mitk::PlanarPolygon::~PlanarPolygon | ( | ) | [protected, virtual] |
Definition at line 41 of file mitkPlanarPolygon.cpp.
{ }
bool mitk::PlanarPolygon::CheckForLineIntersection | ( | Point2D | p1, |
Point2D | p2, | ||
Point2D | p3, | ||
Point2D | p4 | ||
) | [protected] |
Definition at line 213 of file mitkPlanarPolygon.cpp.
References QuadProgPP::max(), and min.
{ // do not check for intersections with control points if(p1 == p2 || p1 == p3 || p1 == p4 || p2 == p3 || p2 == p4 || p3 == p4) return false; // Store the values for fast access and easy // equations-to-code conversion float x1 = p1[0], x2 = p2[0], x3 = p3[0], x4 = p4[0]; float y1 = p1[1], y2 = p2[1], y3 = p3[1], y4 = p4[1]; float d = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4); // If d is zero, there is no intersection //if (d < mitk::eps) return false; if (d == 0) return false; // Get the x and y float pre = (x1*y2 - y1*x2), post = (x3*y4 - y3*x4); float x = ( pre * (x3 - x4) - (x1 - x2) * post ) / d; float y = ( pre * (y3 - y4) - (y1 - y2) * post ) / d; // Check if the x and y coordinates are within both lines if ( x < std::min(x1, x2) || x > std::max(x1, x2) || x < std::min(x3, x4) || x > std::max(x3, x4) ) return false; if ( y < std::min(y1, y2) || y > std::max(y1, y2) || y < std::min(y3, y4) || y > std::max(y3, y4) ) return false; // point of intersection Point2D ret; ret[0] = x; ret[1] = y; return true; }
virtual void mitk::PlanarPolygon::ClosedOff | ( | ) | [virtual] |
virtual void mitk::PlanarPolygon::ClosedOn | ( | ) | [virtual] |
void mitk::PlanarPolygon::EvaluateFeaturesInternal | ( | ) | [protected, virtual] |
Calculates feature quantities of the planar figure.
Implements mitk::PlanarFigure.
Definition at line 121 of file mitkPlanarPolygon.cpp.
References int().
{ // Calculate circumference double circumference = 0.0; unsigned int i,j; for ( i = 0; i < this->GetNumberOfControlPoints() - 1; ++i ) { circumference += this->GetWorldControlPoint( i ).EuclideanDistanceTo( this->GetWorldControlPoint( i + 1 ) ); } if ( this->IsClosed() ) { circumference += this->GetWorldControlPoint( i ).EuclideanDistanceTo( this->GetWorldControlPoint( 0 ) ); } this->SetQuantity( FEATURE_ID_CIRCUMFERENCE, circumference ); // Calculate polygon area (if closed) double area = 0.0; bool intersection = false; if ( this->IsClosed() && (this->GetGeometry2D() != NULL) ) { // does PlanarPolygon overlap/intersect itself? unsigned int numberOfPoints = (unsigned int)GetNumberOfControlPoints(); if( numberOfPoints >= 4) { for ( i = 0; i < (numberOfPoints - 1); ++i ) { // line 1 Point2D p0 = this->GetControlPoint( i ); Point2D p1 = this->GetControlPoint(i + 1); // check for intersection with all other lines for (j = i+1; j < (numberOfPoints - 1); ++j ) { Point2D p2 = this->GetControlPoint(j); Point2D p3 = this->GetControlPoint(j + 1); intersection = CheckForLineIntersection(p0,p1,p2,p3); if (intersection) break; } if (intersection) break; // only because the inner loop might have changed "intersection" // last line from p_x to p_0 Point2D p2 = this->GetControlPoint(0); Point2D p3 = this->GetControlPoint(numberOfPoints - 1); intersection = CheckForLineIntersection(p0,p1,p2,p3); if (intersection) break; } } // calculate area for ( i = 0; i < this->GetNumberOfControlPoints(); ++i ) { Point2D p0 = this->GetControlPoint( i ); Point2D p1 = this->GetControlPoint( (i + 1) % this->GetNumberOfControlPoints() ); area += p0[0] * p1[1] - p1[0] * p0[1]; } area /= 2.0; } // set area if appropiate (i.e. closed and not intersected) if(this->IsClosed() && !intersection) { SetQuantity( FEATURE_ID_AREA, fabs( area ) ); this->ActivateFeature( FEATURE_ID_AREA ); } else { SetQuantity( FEATURE_ID_AREA, 0 ); this->DeactivateFeature( FEATURE_ID_AREA ); } }
void mitk::PlanarPolygon::GenerateHelperPolyLine | ( | double | mmPerDisplayUnit, |
unsigned int | displayHeight | ||
) | [protected, virtual] |
Generates the poly-lines that should be drawn the same size regardless of zoom.
Implements mitk::PlanarFigure.
Definition at line 116 of file mitkPlanarPolygon.cpp.
{
// A polygon does not require helper objects
}
void mitk::PlanarPolygon::GeneratePolyLine | ( | ) | [protected, virtual] |
Generates the poly-line representation of the planar figure.
Implements mitk::PlanarFigure.
Definition at line 94 of file mitkPlanarPolygon.cpp.
{ // if more elements are needed that have been reserved -> reserve if ( m_PolyLines->ElementAt( 0 )->size() < this->GetNumberOfControlPoints() ) { m_PolyLines->ElementAt( 0 )->Reserve( this->GetNumberOfControlPoints() ); } // if more elements have been reserved/set before than are needed now -> clear vector else if (m_PolyLines->ElementAt( 0 )->size() > this->GetNumberOfControlPoints()) { m_PolyLines->ElementAt( 0 )->clear(); } // TODO: start polygon at specified initalize point... m_PolyLines->ElementAt( 0 )->Reserve( this->GetNumberOfControlPoints() ); for ( unsigned int i = 0; i < this->GetNumberOfControlPoints(); ++i ) { m_PolyLines->ElementAt( 0 )->ElementAt( i ) = m_ControlPoints->ElementAt( i ); } }
virtual const char* mitk::PlanarPolygon::GetClassName | ( | ) | const [virtual] |
Reimplemented from mitk::PlanarFigure.
unsigned int mitk::PlanarPolygon::GetMaximumNumberOfControlPoints | ( | ) | const [inline, virtual] |
Polygon maximum number of control points is principally not limited.
Implements mitk::PlanarFigure.
Definition at line 65 of file mitkPlanarPolygon.h.
{
return 1000;
}
unsigned int mitk::PlanarPolygon::GetMinimumNumberOfControlPoints | ( | ) | const [inline, virtual] |
Place figure in its minimal configuration (a point at least) onto the given 2D geometry.
Must be implemented in sub-classes.Polygon has 2 control points per definition.
Implements mitk::PlanarFigure.
Definition at line 58 of file mitkPlanarPolygon.h.
{
return 2;
}
static Pointer mitk::PlanarPolygon::New | ( | ) | [static] |
void mitk::PlanarPolygon::PrintSelf | ( | std::ostream & | os, |
itk::Indent | indent | ||
) | const [protected, virtual] |
Reimplemented from mitk::PlanarFigure.
Definition at line 201 of file mitkPlanarPolygon.cpp.
{ Superclass::PrintSelf( os, indent ); if (this->IsClosed()) os << indent << "Polygon is closed\n"; else os << indent << "Polygon is not closed\n"; }
void mitk::PlanarPolygon::SetClosed | ( | bool | closed ) | [virtual] |
Set whether the polygon should be closed between first and last control point or not.
Definition at line 46 of file mitkPlanarPolygon.cpp.
References mitk::BoolProperty::New().
{ this->SetProperty( "closed", mitk::BoolProperty::New( closed ) ); if ( !closed ) { // For non-closed polygons: use "Length" as feature name; disable area this->SetFeatureName( FEATURE_ID_CIRCUMFERENCE, "Length" ); this->DeactivateFeature( FEATURE_ID_AREA ); } else { // For closed polygons: use "Circumference" as feature name; enable area this->SetFeatureName( FEATURE_ID_CIRCUMFERENCE, "Circumference" ); this->ActivateFeature( FEATURE_ID_AREA ); } this->Modified(); }
const unsigned int mitk::PlanarPolygon::FEATURE_ID_AREA [protected] |
Definition at line 89 of file mitkPlanarPolygon.h.
const unsigned int mitk::PlanarPolygon::FEATURE_ID_CIRCUMFERENCE [protected] |
Definition at line 88 of file mitkPlanarPolygon.h.