Beispiel #1
0
VParabola * VParabola::GetRightChild	(VParabola * p)
{
	if(!p) return 0;
	VParabola * par = p->Right();
	while(!par->isLeaf) par = par->Left();
	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 << "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; }

	//Vec2d * p = new Vec2d(e->point->x, GetY(p1->site, e->point->x));
	Vec2d * p = new Vec2d(); p->set( 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);
}
Beispiel #3
0
VParabola * VParabola::GetLeftParent	(VParabola * p)
{
	VParabola * par		= p->parent;
	VParabola * pLast	= p;
	while(par->Left() == 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;
}