Categories
Fade2D Examples

Polygons and Zones – Example4

This is the right article if you want to triangulate polygons or carry out polygon clipping. In Fade, a zone defines a specific area of a triangulation and you can use it to combine shapes with the boolean set operations union, difference,symmetric difference and intersection. From the result zone you can easily calculate the total area, obtain its triangles or its contour.

You can define a zone as

  • the area inside or outside a polygon
  • the area grown from a seed point up to defined fences
  • the area of the whole triangulation (global zone)
  • the area of arbitrary triangles

The below example code (examples_2D/ex4_zones.cpp in the download) demonstrates that.

Preparing two initial Polygons

  1. Insert 4 bounding box points into a new Fade_2D object.
  2. Create points on two circles (vCircle0,vCircle1)
  3. Create segments (vSegment0,vSegment1)
  4. Create two polygons (ConstraintGraph2 pCG0, pCG1)
  5. Draw the triangulation
// * 1 *   Insert 4 bounding box points
Fade_2D dt;
dt.insert(Point2(0,0));
dt.insert(Point2(+100,0));
dt.insert(Point2(100,50));
dt.insert(Point2(0,50));

// * 2 *   Create points on two circles
std::vector<Point2> vCircle0;
std::vector<Point2> vCircle1;
int numPoints(8);
double radius(22);
//generateCircle( num,centerX,centerY,radiusX,radiusY,vOut);
generateCircle(numPoints,25.0,25.0,radius,radius,vCircle0);
generateCircle(numPoints,75.0,25.0,radius,radius,vCircle1);

// * 3 *   Create segments
std::vector<Segment2> vSegments0;
std::vector<Segment2> vSegments1;
for(int i=0;i<numPoints;++i)
{
	Segment2 seg0(vCircle0[i],vCircle0[(i+1)%numPoints]);
	Segment2 seg1(vCircle1[i],vCircle1[(i+1)%numPoints]);
	vSegments0.push_back(seg0);
	vSegments1.push_back(seg1);
}

// * 4 *   Insert the segments as constraint graphs
ConstraintGraph2* pCG0=dt.createConstraint(vSegments0,CIS_CONSTRAINED_DELAUNAY);
ConstraintGraph2* pCG1=dt.createConstraint(vSegments1,CIS_CONSTRAINED_DELAUNAY);

// * 5 *  Visualize
dt.show("example4_constraints.ps",true);

Delaunay triangulation with constraint edges
Delaunay triangulation with two constraint graphs

Creating zones inside and outside a polygon

ConstraintGraph pCG1 is the left polygon circle in the above image. Let’s create a Zone2 inside and another one outside this polygon now.

// + Zone inside pCG0:
Zone2* pZoneInside(dt.createZone(pCG0,ZL_INSIDE));
pZoneInside->show("example4_zoneInside.ps",true,true); 

// + Zone outside pCG0:
Zone2* pZoneOutside(dt.createZone(pCG0,ZL_OUTSIDE));
pZoneOutside->show("example4_zoneOutside.ps",true,true);
Zone inside a polygon
Zone inside the polygon
Zone outside a polygon
Zone outside a polygon

Zone grown from a seed point

In addition to zones inside and outside a polygon, zones can also grow from a specific seed point. This is demonstrated by the code below that uses a vector of ConstraintGraph objects (polygons in our case) and a point seedPoint near the lower left corner of the below image. It grows a zone from the seed point. The edges of the ConstraintGraph2 objects in vCG (in our case the two polygon circles) act as fence which stops the growing process.

vector<ConstraintGraph2*> vCG;
vCG.push_back(pCG0);
vCG.push_back(pCG1);
Point2 seedPoint(5.0,5.0); // Point near the lower left corner
Zone2* pZoneGrow(dt.createZone(vCG,ZL_GROW,seedPoint));
pZoneGrow->show("example4_zoneGrow.ps",true,true);
Zone (yellow area) grown from a seed point. The constraint edges (red) act as a fence that stops the growing process

The global zone

A global zone consists of all existing triangles.

Zone2* pZoneGlobal(dt.createZone(NULL,ZL_GLOBAL));
pZoneGlobal->show("example4_zoneGlobal.ps",true,true);
The global zone consist of all triangles

Zone creation from arbitrary triangles

You can create a zone from an arbitrary set of triangles, connected or not. The example code below first fetches all triangles from the triangulation. Then it chooses only half of them to create a zone.

// + Zone defined by specific triangles
vector<Triangle2*> vT;
dt.getTrianglePointers(vT);
vT.resize(vT.size()/2);
Zone2* pZoneRandomTriangles(dt.createZone(vT));
pZoneRandomTriangles->show("example4_zoneFromTriangles.ps",true,true);
A zone that consists just of a selected set of triangles

This article covered creation of zones while the next post Zone Operations computes the union, the intersection, the difference and symmetric difference of such zones.

Leave a Reply

Your email address will not be published. Required fields are marked *