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 << "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 = nullptr; 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); }
VParabola * VParabola::GetLeftChild (VParabola * p) { if(!p) return 0; VParabola * par = p->Left(); while(!par->isLeaf) par = par->Right(); return par; }
VParabola * VParabola::GetRightParent (VParabola * p) { VParabola * par = p->parent; VParabola * pLast = p; while(par->Right() == pLast) { if(!par->parent) return 0; pLast = par; par = par->parent; } return par; }
VParabola * Voronoi::GetParabolaByX(double xx) { VParabola * par = root; double x = 0.0; while(!par->isLeaf) { x = GetXOfEdge(par, ly); if(x>xx) par = par->Left(); else par = par->Right(); } return par; }
VParabola * Voronoi::GetParabolaByX(double xx){ VParabola * par = root; double x = 0.0; while(!par->isLeaf) { // projdu stromem dokud nenarazím na vhodný list x = GetXOfEdge(par, ly); if(x>xx){ par = par->Left(); }else{ par = par->Right(); } } return par; }