예제 #1
0
 public function addNode($x, $y)
 {
     $node = new EdgeNode();
     $node->getVertex()->setX($x);
     $node->getVertex()->setY($y);
     $this->mList[] = $node;
 }
예제 #2
0
 /**
  * @param StNode $st
  * @param ItNodeTable $it
  * @param EdgeNode $edge
  * @param float $dy
  *
  * @returns StNode
  */
 private function addStEdge($st, $it, $edge, $dy)
 {
     if ($st === null) {
         /* Append edge onto the tail end of the ST */
         $st = new StNode($edge, null);
     } else {
         $den = $st->getXt() - $st->getXb() - ($edge->getXt() - $edge->getXb());
         /* If new edge and ST edge don't cross */
         if ($edge->getXt() >= $st->getXt() || $edge->getDx() === $st->getDx() || abs($den) <= self::EPSILON) {
             /* No intersection - insert edge here (before the ST edge) */
             $existingNode = $st;
             $st = new StNode($edge, $existingNode);
         } else {
             /* Compute intersection between new edge and ST edge */
             $r = ($edge->getXb() - $st->getXb()) / $den;
             $x = $st->getXb() + $r * ($st->getXt() - $st->getXb());
             $y = $r * $dy;
             /* Insert the edge pointers and the intersection point in the IT */
             $it->setTopNode($this->addIntersection($it->getTopNode(), $st->getEdge(), $edge, $x, $y));
             /* Head further into the ST */
             $st->setPrev($this->addStEdge($st->getPrev(), $it, $edge, $dy));
         }
     }
     return $st;
 }