Beispiel #1
0
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;
}
Beispiel #2
0
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);
}