160 void setup(vector<double*>& points);
194 Polygon(vector<double*>& points);
210 Polygon(
const double* center,
double radius,
int nEdges);
235 void removeReference()
237 if (isNotReferenced())
240 os << endl <<
"ERROR in Polygon::removeReference" << endl
241 <<
"Reference count (" << refCount <<
") is already zero." << endl;
268 static double getTolerance()
279 const double*
const getReferencePoint()
281 return referencePoint;
290 const void getReferencePoint(
double *u)
292 u[0] = referencePoint[0];
293 u[1] = referencePoint[1];
294 u[2] = referencePoint[2];
301 bool getReferencePointIn()
312 referenceIn = !referenceIn;
327 void setReferencePoint(
const double* refPoint,
const bool &inside)
329 if (referencePoint == NULL)
330 referencePoint =
new double[3];
332 referencePoint[0] = refPoint[0];
333 referencePoint[1] = refPoint[1];
334 referencePoint[2] = refPoint[2];
335 referenceIn = inside;
347 void setReferencePoint(
double lat,
double lon,
bool inside)
350 GeoTessUtils::getVectorDegrees(lat, lon, r);
351 setReferencePoint(r, inside);
362 bool containsAny(
const vector<double*>& points)
364 for (
int i=0; i<(int)points.size(); ++i)
365 if (contains(points[i]))
376 bool containsAll(
const vector<double*>& positions)
378 for (
int i=0; i<(int)positions.size(); ++i)
379 if (!contains(positions[i]))
390 bool contains(
const double* x)
392 if (global || GeoTessUtils::dot(referencePoint, x) > cos(TOLERANCE))
397 return onBoundary(gcRef) || ((edgeCrossings(gcRef) % 2 == 0) == referenceIn);
410 for (
int i=0; i<(int)edges.size(); ++i)
413 if (GeoTessUtils::dot(gcRef.
getLast(), edges[i]->getFirst()) >= cos(TOLERANCE))
419 if (abs(GeoTessUtils::dot(gcRef.
getNormal(), edges[i]->getNormal())) >= cos(TOLERANCE)
420 && edges[i]->getDistance(gcRef.
getLast()) <= edges[i]->getDistance())
433 bool onBoundary(
const double* x)
436 return onBoundary(gc);
453 void getPoints(vector<double*> &points,
const bool &repeatFirstPoint)
455 points.reserve(points.size()+edges.size()+1);
457 for (
int i = 0; i < (int)edges.size(); ++i)
459 double* point =
new double[3];
460 point[0] = edges[i]->getFirst()[0];
461 point[1] = edges[i]->getFirst()[1];
462 point[2] = edges[i]->getFirst()[2];
463 points.push_back(point);
466 if (repeatFirstPoint)
468 double* point =
new double[3];
469 point[0] = edges[0]->getFirst()[0];
470 point[1] = edges[0]->getFirst()[1];
471 point[2] = edges[0]->getFirst()[2];
472 points.push_back(point);
491 void getPoints(vector<double*> &points,
const bool &repeatFirstPoint,
const double &maxSpacing)
493 points.reserve(points.size()+edges.size()+1);
497 for (
int i = 0; i < (int)edges.size(); ++i)
499 n = (int)ceil(edges[i]->getDistance()/maxSpacing);
500 dx = edges[i]->getDistance()/n;
501 for (
int j=0; j<n; ++j)
502 points.push_back(edges[i]->getPoint(j*dx));
505 if (repeatFirstPoint)
507 double* point =
new double[3];
508 point[0] = edges[0]->getFirst()[0];
509 point[1] = edges[0]->getFirst()[1];
510 point[2] = edges[0]->getFirst()[2];
511 points.push_back(point);
522 const double* getPoint(
int index)
524 return edges[index]->getFirst();
545 for (
int i=0; i<(int)edges.size(); ++i)
558 area -= (edges.size()-2)*PI;
571 double getAreaSmall()
573 double area = getArea();
574 return area <= 2*PI ? area : 4*PI-area;
586 double getAreaLarge()
588 double area = getArea();
589 return area >= 2*PI ? area : 4*PI-area;
610 string str(
const bool& repeatFirstPoint,
const bool& latFirst,
611 const double& minLongitude = -180);
613 virtual void write(
const string& outputFileName);