13#include <geos/util/TopologyException.h> 
   15#include "IException.h" 
   16#include "LimitPolygonSeeder.h" 
   17#include "PolygonTools.h" 
   50    std::vector<geos::geom::Point *> points;
 
   53    const geos::geom::Envelope *polyBoundBox = multiPoly->getEnvelopeInternal();
 
   68    if(fabs(polyBoundBox->getMaxX() - polyBoundBox->getMinX()) > fabs((polyBoundBox->getMaxY() - polyBoundBox->getMinY()))) {
 
   77    double xSpacing = (polyBoundBox->getMaxX() - polyBoundBox->getMinX()) / (xSteps);
 
   78    double ySpacing = (polyBoundBox->getMaxY() - polyBoundBox->getMinY()) / (ySteps);
 
   80    double realMinX = polyBoundBox->getMinX() + xSpacing / 2;
 
   81    double realMinY = polyBoundBox->getMinY() + ySpacing / 2;
 
   82    double maxY = polyBoundBox->getMaxY();
 
   83    double maxX = polyBoundBox->getMaxX();
 
   85    for(
double y = realMinY; y < maxY; y += ySpacing) {
 
   86      for(
double x = realMinX; x < maxX; x += xSpacing) {
 
   87        geos::geom::Geometry *gridSquarePolygon = 
GetMultiPolygon(x - xSpacing / 2.0, y - ySpacing / 2,
 
   88            x + xSpacing / 2.0, y + ySpacing / 2, *multiPoly);
 
   90        geos::geom::Point *centroid = gridSquarePolygon->getCentroid().release();
 
   92        delete gridSquarePolygon;
 
   93        if(centroid->isEmpty()) 
continue;
 
   95        double gridCenterX = centroid->getX();
 
   96        double gridCenterY = centroid->getY();
 
   99        geos::geom::Coordinate c(gridCenterX, gridCenterY);
 
  100        points.push_back(Isis::globalFactory->createPoint(c).release());
 
 
  122      double dMaxX, 
double dMaxY,
 
  123      const geos::geom::MultiPolygon &orig) {
 
  124    geos::geom::CoordinateSequence *points = 
new geos::geom::CoordinateSequence();
 
  126    points->add(geos::geom::Coordinate(dMinX, dMinY));
 
  127    points->add(geos::geom::Coordinate(dMaxX, dMinY));
 
  128    points->add(geos::geom::Coordinate(dMaxX, dMaxY));
 
  129    points->add(geos::geom::Coordinate(dMinX, dMaxY));
 
  130    points->add(geos::geom::Coordinate(dMinX, dMinY));
 
  132    std::unique_ptr<geos::geom::Polygon> poly = Isis::globalFactory->createPolygon(Isis::globalFactory->createLinearRing(*points));
 
  133    geos::geom::Geometry *overlap = poly->intersection(&orig).release();
 
 
  157      if(algo.hasKeyword(
"MajorAxisPoints")) {
 
  159        if(invalgo.hasKeyword(
"MajorAxisPoints")) {
 
  160          invalgo.deleteKeyword(
"MajorAxisPoints");
 
  164        QString msg = 
"PVL for LimitPolygonSeeder must contain [MajorAxisPoints] in [";
 
  165        msg += pvl.fileName() + 
"]";
 
  170      if(algo.hasKeyword(
"MinorAxisPoints")) {
 
  172        if(invalgo.hasKeyword(
"MinorAxisPoints")) {
 
  173          invalgo.deleteKeyword(
"MinorAxisPoints");
 
  177        QString msg = 
"PVL for LimitPolygonSeeder must contain [MinorAxisPoints] in [";
 
  178        msg += pvl.fileName() + 
"]";
 
  183      QString msg = 
"Improper format for PolygonSeeder PVL [" + pvl.fileName() + 
"]";
 
 
  207    pluginInfo.addKeyword(name);
 
  208    pluginInfo.addKeyword(minThickness);
 
  209    pluginInfo.addKeyword(minArea);
 
  210    pluginInfo.addKeyword(majAxis);
 
  211    pluginInfo.addKeyword(minAxis);
 
 
@ User
A type of error that could only have occurred due to a mistake on the user's part (e....
 
Adds specific functionality to C++ strings.
 
Seed points using a grid.
 
int p_majorAxisPts
Number of points to place on major axis.
 
LimitPolygonSeeder(Pvl &pvl)
Construct a LimitPolygonSeeder algorithm.
 
int p_minorAxisPts
Number of points to place on minor axis.
 
virtual PvlGroup PluginParameters(QString grpName)
Plugin parameters.
 
geos::geom::Geometry * GetMultiPolygon(double dMinX, double dMinY, double dMaxX, double dMaxY, const geos::geom::MultiPolygon &orig)
This method returns the overlap between the x/y range specified and the "orig" polygon.
 
virtual void Parse(Pvl &pvl)
Parse the LimitPolygonSeeder spicific parameters from the PVL.
 
std::vector< geos::geom::Point * > Seed(const geos::geom::MultiPolygon *mp)
Seed a polygon with points.
 
This class is used as the base class for all PolygonSeeder objects.
 
virtual void Parse(Pvl &pvl)
Initialize parameters in the PolygonSeeder class using a PVL specification.
 
Pvl * invalidInput
The Pvl passed in by the constructor minus what was used.
 
QString StandardTests(const geos::geom::MultiPolygon *multiPoly, const geos::geom::Envelope *polyBoundBox)
Check the polygon to see if it meets standard criteria.
 
double MinimumArea()
Return the minimum allowed area of the polygon.
 
double MinimumThickness()
Return the minimum allowed thickness of the polygon.
 
QString Algorithm() const
The name of the algorithm, read from the Name Keyword in the PolygonSeeder Pvl passed into the constr...
 
Contains multiple PvlContainers.
 
Container for cube-like labels.
 
A single keyword-value pair.
 
@ Traverse
Search child objects.
 
PvlGroupIterator findGroup(const QString &name, PvlGroupIterator beg, PvlGroupIterator end)
Find a group with the specified name, within these indexes.
 
This is free and unencumbered software released into the public domain.
 
QString toString(bool boolToConvert)
Global function to convert a boolean to a string.