154 void setup(vector<double*>& points);
227 if (isNotReferenced())
230 os << endl <<
"ERROR in Polygon::removeReference" << endl
231 <<
"Reference count (" << refCount <<
") is already zero." << endl;
273 return referencePoint;
284 u[0] = referencePoint[0];
285 u[1] = referencePoint[1];
286 u[2] = referencePoint[2];
304 referenceIn = !referenceIn;
321 if (referencePoint == NULL)
322 referencePoint =
new double[3];
324 referencePoint[0] = refPoint[0];
325 referencePoint[1] = refPoint[1];
326 referencePoint[2] = refPoint[2];
327 referenceIn = inside;
342 GeoTessUtils::getVectorDegrees(lat, lon, r);
343 setReferencePoint(r, inside);
356 for (
int i=0; i<(int)points.size(); ++i)
357 if (contains(points[i]))
370 for (
int i=0; i<(int)positions.size(); ++i)
371 if (!contains(positions[i]))
384 if (global || GeoTessUtils::dot(referencePoint, x) > cos(TOLERANCE))
389 return onBoundary(gcRef) || ((edgeCrossings(gcRef) % 2 == 0) == referenceIn);
402 for (
int i=0; i<(int)edges.size(); ++i)
405 if (GeoTessUtils::dot(gcRef.
getLast(), edges[i]->getFirst()) >= cos(TOLERANCE))
411 if (abs(GeoTessUtils::dot(gcRef.
getNormal(), edges[i]->getNormal())) >= cos(TOLERANCE)
412 && edges[i]->getDistance(gcRef.
getLast()) <= edges[i]->getDistance())
428 return onBoundary(gc);
445 void getPoints(vector<double*> &points,
const bool &repeatFirstPoint)
447 points.reserve(points.size()+edges.size()+1);
449 for (
int i = 0; i < (int)edges.size(); ++i)
451 double* point =
new double[3];
452 point[0] = edges[i]->getFirst()[0];
453 point[1] = edges[i]->getFirst()[1];
454 point[2] = edges[i]->getFirst()[2];
455 points.push_back(point);
458 if (repeatFirstPoint)
460 double* point =
new double[3];
461 point[0] = edges[0]->getFirst()[0];
462 point[1] = edges[0]->getFirst()[1];
463 point[2] = edges[0]->getFirst()[2];
464 points.push_back(point);
483 void getPoints(vector<double*> &points,
const bool &repeatFirstPoint,
const double &maxSpacing)
485 points.reserve(points.size()+edges.size()+1);
489 for (
int i = 0; i < (int)edges.size(); ++i)
491 n = (int)ceil(edges[i]->getDistance()/maxSpacing);
492 dx = edges[i]->getDistance()/n;
493 for (
int j=0; j<n; ++j)
494 points.push_back(edges[i]->getPoint(j*dx));
497 if (repeatFirstPoint)
499 double* point =
new double[3];
500 point[0] = edges[0]->getFirst()[0];
501 point[1] = edges[0]->getFirst()[1];
502 point[2] = edges[0]->getFirst()[2];
503 points.push_back(point);
516 return edges[index]->getFirst();
537 for (
int i=0; i<(int)edges.size(); ++i)
550 area -= (edges.size()-2)*PI;
565 double area = getArea();
566 return area <= 2*PI ? area : 4*PI-area;
580 double area = getArea();
581 return area >= 2*PI ? area : 4*PI-area;
602 string str(
const bool& repeatFirstPoint,
const bool& latFirst,
603 const double& minLongitude = -180);
605 virtual void write(
const string& outputFileName);
609 virtual void loadAscii(vector<string>& records);