public function addNode($x, $y) { $node = new EdgeNode(); $node->getVertex()->setX($x); $node->getVertex()->setY($y); $this->mList[] = $node; }
/** * @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; }