VParabola * Voronoi::getParabolaByX(double xx) { VParabola *par = root; double x = 0.0; // TRANSLATEME projdu stromem dokud nenarazím na vhodný list while (!par->isLeaf) { x = getXOfEdge(par, ly); if (x > xx) par = par->left(); else par = par->right(); } return par; }
void Voronoi::removeParabola(VEvent *e) { VParabola *p1 = e->arch; VParabola *xl = VParabola::getLeftParent(p1); VParabola *xr = VParabola::getRightParent(p1); VParabola *p0 = VParabola::getLeftChild(xl); VParabola *p2 = VParabola::getRightChild(xr); if (p0 == p2) std::cout << "TRANSLATEME chyba - pravá a levá parabola má stejné ohnisko!\n"; if (p0->cEvent) { deleted.insert(p0->cEvent); p0->cEvent = 0; } if (p2->cEvent) { deleted.insert(p2->cEvent); p2->cEvent = 0; } VPoint *p = new VPoint(e->point->x, getY(p1->site, e->point->x)); points.push_back(p); xl->edge->end = p; xr->edge->end = p; VParabola *higher; VParabola *par = p1; while (par != root) { par = par->parent; if (par == xl) higher = xl; if (par == xr) higher = xr; } higher->edge = new VEdge(p, p0->site, p2->site); edges->push_back(higher->edge); VParabola *gparent = p1->parent->parent; if (p1->parent->left() == p1) { if (gparent->left() == p1->parent) gparent->setLeft(p1->parent->right()); if (gparent->right() == p1->parent) gparent->setRight(p1->parent->right()); } else { if (gparent->left() == p1->parent) gparent->setLeft(p1->parent->left()); if (gparent->right() == p1->parent) gparent->setRight(p1->parent->left()); } delete p1->parent; delete p1; checkCircle(p0); checkCircle(p2); }