152 void setup(vector<double*>& points);
227 void removeReference()
229 if (isNotReferenced())
232 os << endl <<
"ERROR in Polygon::removeReference" << endl
233 <<
"Reference count (" << refCount <<
") is already zero." << endl;
262 static double getTolerance()
273 const double*
const getReferencePoint()
275 return referencePoint;
284 const void getReferencePoint(
double *u)
286 u[0] = referencePoint[0];
287 u[1] = referencePoint[1];
288 u[2] = referencePoint[2];
295 bool getReferencePointIn()
306 referenceIn = !referenceIn;
321 void setReferencePoint(
const double* refPoint,
const bool &inside)
323 if (referencePoint == NULL)
324 referencePoint =
new double[3];
326 referencePoint[0] = refPoint[0];
327 referencePoint[1] = refPoint[1];
328 referencePoint[2] = refPoint[2];
329 referenceIn = inside;
341 void setReferencePoint(
double lat,
double lon,
bool inside)
344 GeoTessUtils::getVectorDegrees(lat, lon, r);
345 setReferencePoint(r, inside);
356 bool containsAny(
const vector<double*>& points)
358 for (
int i=0; i<(int)points.size(); ++i)
359 if (contains(points[i]))
370 bool containsAll(
const vector<double*>& positions)
372 for (
int i=0; i<(int)positions.size(); ++i)
373 if (!contains(positions[i]))
384 bool contains(
const double* x)
386 if (global || GeoTessUtils::dot(referencePoint, x) > cos(TOLERANCE))
391 return onBoundary(gcRef) || ((edgeCrossings(gcRef) % 2 == 0) == referenceIn);
404 for (
int i=0; i<(int)edges.size(); ++i)
407 if (GeoTessUtils::dot(gcRef.
getLast(), edges[i]->getFirst()) >= cos(TOLERANCE))
413 if (abs(GeoTessUtils::dot(gcRef.
getNormal(), edges[i]->getNormal())) >= cos(TOLERANCE)
414 && edges[i]->getDistance(gcRef.
getLast()) <= edges[i]->getDistance())
427 bool onBoundary(
const double* x)
430 return onBoundary(gc);
447 void getPoints(vector<double*> &points,
const bool &repeatFirstPoint)
449 points.reserve(points.size()+edges.size()+1);
451 for (
int i = 0; i < (int)edges.size(); ++i)
453 double* point =
new double[3];
454 point[0] = edges[i]->getFirst()[0];
455 point[1] = edges[i]->getFirst()[1];
456 point[2] = edges[i]->getFirst()[2];
457 points.push_back(point);
460 if (repeatFirstPoint)
462 double* point =
new double[3];
463 point[0] = edges[0]->getFirst()[0];
464 point[1] = edges[0]->getFirst()[1];
465 point[2] = edges[0]->getFirst()[2];
466 points.push_back(point);
485 void getPoints(vector<double*> &points,
const bool &repeatFirstPoint,
const double &maxSpacing)
487 points.reserve(points.size()+edges.size()+1);
491 for (
int i = 0; i < (int)edges.size(); ++i)
493 n = (int)ceil(edges[i]->getDistance()/maxSpacing);
494 dx = edges[i]->getDistance()/n;
495 for (
int j=0; j<n; ++j)
496 points.push_back(edges[i]->getPoint(j*dx));
499 if (repeatFirstPoint)
501 double* point =
new double[3];
502 point[0] = edges[0]->getFirst()[0];
503 point[1] = edges[0]->getFirst()[1];
504 point[2] = edges[0]->getFirst()[2];
505 points.push_back(point);
516 const double* getPoint(
int index)
518 return edges[index]->getFirst();
539 for (
int i=0; i<(int)edges.size(); ++i)
552 area -= (edges.size()-2)*PI;
565 double getAreaSmall()
567 double area = getArea();
568 return area <= 2*PI ? area : 4*PI-area;
580 double getAreaLarge()
582 double area = getArea();
583 return area >= 2*PI ? area : 4*PI-area;
604 string str(
const bool& repeatFirstPoint,
const bool& latFirst,
605 const double& minLongitude = -180);
607 virtual void write(
const string& outputFileName);
611 virtual void loadAscii(vector<string>& records);