152 void setup(vector<double*>& points);
223 void removeReference()
225 if (isNotReferenced())
228 os << endl <<
"ERROR in Polygon::removeReference" << endl
229 <<
"Reference count (" << refCount <<
") is already zero." << endl;
258 static double getTolerance()
269 const double*
const getReferencePoint()
271 return referencePoint;
280 const void getReferencePoint(
double *u)
282 u[0] = referencePoint[0];
283 u[1] = referencePoint[1];
284 u[2] = referencePoint[2];
291 bool getReferencePointIn()
302 referenceIn = !referenceIn;
317 void setReferencePoint(
const double* refPoint,
const bool &inside)
319 if (referencePoint == NULL)
320 referencePoint =
new double[3];
322 referencePoint[0] = refPoint[0];
323 referencePoint[1] = refPoint[1];
324 referencePoint[2] = refPoint[2];
325 referenceIn = inside;
337 void setReferencePoint(
double lat,
double lon,
bool inside)
340 GeoTessUtils::getVectorDegrees(lat, lon, r);
341 setReferencePoint(r, inside);
352 bool containsAny(
const vector<double*>& points)
354 for (
int i=0; i<(int)points.size(); ++i)
355 if (contains(points[i]))
366 bool containsAll(
const vector<double*>& positions)
368 for (
int i=0; i<(int)positions.size(); ++i)
369 if (!contains(positions[i]))
380 bool contains(
const double* x)
382 if (global || GeoTessUtils::dot(referencePoint, x) > cos(TOLERANCE))
387 return onBoundary(gcRef) || ((edgeCrossings(gcRef) % 2 == 0) == referenceIn);
400 for (
int i=0; i<(int)edges.size(); ++i)
403 if (GeoTessUtils::dot(gcRef.
getLast(), edges[i]->getFirst()) >= cos(TOLERANCE))
409 if (abs(GeoTessUtils::dot(gcRef.
getNormal(), edges[i]->getNormal())) >= cos(TOLERANCE)
410 && edges[i]->getDistance(gcRef.
getLast()) <= edges[i]->getDistance())
423 bool onBoundary(
const double* x)
426 return onBoundary(gc);
443 void getPoints(vector<double*> &points,
const bool &repeatFirstPoint)
445 points.reserve(points.size()+edges.size()+1);
447 for (
int i = 0; i < (int)edges.size(); ++i)
449 double* point =
new double[3];
450 point[0] = edges[i]->getFirst()[0];
451 point[1] = edges[i]->getFirst()[1];
452 point[2] = edges[i]->getFirst()[2];
453 points.push_back(point);
456 if (repeatFirstPoint)
458 double* point =
new double[3];
459 point[0] = edges[0]->getFirst()[0];
460 point[1] = edges[0]->getFirst()[1];
461 point[2] = edges[0]->getFirst()[2];
462 points.push_back(point);
481 void getPoints(vector<double*> &points,
const bool &repeatFirstPoint,
const double &maxSpacing)
483 points.reserve(points.size()+edges.size()+1);
487 for (
int i = 0; i < (int)edges.size(); ++i)
489 n = (int)ceil(edges[i]->getDistance()/maxSpacing);
490 dx = edges[i]->getDistance()/n;
491 for (
int j=0; j<n; ++j)
492 points.push_back(edges[i]->getPoint(j*dx));
495 if (repeatFirstPoint)
497 double* point =
new double[3];
498 point[0] = edges[0]->getFirst()[0];
499 point[1] = edges[0]->getFirst()[1];
500 point[2] = edges[0]->getFirst()[2];
501 points.push_back(point);
512 const double* getPoint(
int index)
514 return edges[index]->getFirst();
535 for (
int i=0; i<(int)edges.size(); ++i)
548 area -= (edges.size()-2)*PI;
561 double getAreaSmall()
563 double area = getArea();
564 return area <= 2*PI ? area : 4*PI-area;
576 double getAreaLarge()
578 double area = getArea();
579 return area >= 2*PI ? area : 4*PI-area;
600 string str(
const bool& repeatFirstPoint,
const bool& latFirst,
601 const double& minLongitude = -180);
603 virtual void write(
const string& outputFileName);
607 virtual void loadAscii(vector<string>& records);