/** * @param Polygon $polygon * @param bool $inferOuter * * @return $this */ public function addPolygon(Polygon $polygon, $inferOuter = true) { if (!$inferOuter) { $this->innerPolygons[] = $polygon; } else { if (count($this->points) === 0) { foreach ($polygon->getPoints() as $point) { $this->points[] = $point; } $this->isHole = $polygon->isHole(); } else { $this->addPolygon($polygon, false); } } // $this->innerPolygons[] = $polygon; return $this; }
/** * @return Polygon */ public function getResult() { $result = new Polygon(); $numContours = $this->countContours(); if ($numContours > 0) { /** @var PolygonNode $nPolyNode */ $nPolyNode = null; for ($polyNode = $this->topNode; $polyNode != null; $polyNode = $nPolyNode) { $nPolyNode = $polyNode->getNext(); if ($polyNode->getActive() != 0) { $polygon = $result; if ($numContours > 1) { $polygon = new Polygon(); } if ($polyNode->getProxy()->isHole()) { $polygon->setIsHole($polyNode->getProxy()->isHole()); } // --- This algorithm puts the verticies into the Polygon in // reverse order --- for ($vtx = $polyNode->getProxy()->getVertexList()[PolygonUtils::LEFT]; $vtx != null; $vtx = $vtx->getNext()) { $polygon->addVertex(new Point($vtx->getX(), $vtx->getY())); } if ($numContours > 1) { $result->addPolygon($polygon); } } } // --- Sort holes to the end of the list --- $orig = $result; $result = new Polygon(); for ($i = 0; $i < $orig->getNumInnerPoly(); $i++) { $inner = $orig->getInnerPolygon($i); if (!$inner->isHole()) { $result->addPolygon($inner); } } for ($i = 0; $i < $orig->getNumInnerPoly(); $i++) { $inner = $orig->getInnerPolygon($i); if ($inner->isHole()) { $result->addPolygon($inner); } } } return $result; }
/** * @param Polygon $polygon * @param int $i * * @return bool */ private function isOptimal(Polygon $polygon, $i) { return $polygon->getInnerPolygon(0)->getPoints()[self::prevIndex($i, $polygon->nVertices())]->getY() != $polygon->getInnerPolygon(0)->getPoints()[$i]->getY() || $polygon->getInnerPolygon(0)->getPoints()[self::nextIndex($i, $polygon->nVertices())]->getY() != $polygon->getInnerPolygon(0)->getPoints()[$i]->getY(); }