bool VoronoiDiagramChecker::check_edge(HEEdge e) const { HEVertex src = g.source(e); HEVertex trg = g.target(e); HEEdge twine = g[e].twin; if (twine == HEEdge() ) { return true; } else if ( !( e == g[twine].twin ) ) { std::cout << " VoronoiDiagramChecker::check_edge() twinning error!\n"; return false; } HEVertex tw_src = g.source(twine); HEVertex tw_trg = g.target(twine); //std::cout << (src==tw_trg) << " && " << (trg==tw_src) << "\n"; if ( !((src==tw_trg) && (trg==tw_src)) ) { std::cout << "VoronoiDiagramChecker::check_edge() ERROR: \n"; std::cout << " edge: " << g[src].index << "("<< g[src].type << ")"; std::cout << " - " << g[trg].index << "("<< g[trg].type << ")" << "\n"; //std::cout << " twin: " << g[tw_src].index << " - " << g[tw_src].index << "\n"; std::cout << " edge: " << e << "\n"; std::cout << " twin: " << twine << "\n"; std::cout << " edge: " << src << " - " << trg << "\n"; std::cout << " twin: " << tw_src << " - " << tw_trg << "\n"; } return ( (src==tw_trg) && (trg==tw_src) ); }
// add one vertex at origo and three vertices at 'infinity' and their associated edges void VoronoiDiagram::init() { //std::cout << "VD init() \n"; double far_multiplier = 6; // add vertices HEVertex v0; VertexProps v0prop(Point(0,0), UNDECIDED); VertexProps v1prop(Point(0, far_multiplier*far_radius), OUT); VertexProps v2prop(Point( cos(-5*PI/6)*far_multiplier*far_radius, sin(-5*PI/6)*far_multiplier*far_radius), OUT); VertexProps v3prop(Point( cos(-PI/6)*far_multiplier*far_radius, sin(-PI/6)*far_multiplier*far_radius), OUT); v0 = hedi::add_vertex( v0prop, g ); v01 = hedi::add_vertex( v1prop, g ); v02 = hedi::add_vertex( v2prop, g ); v03 = hedi::add_vertex( v3prop, g ); // the locations of the initial generators: double gen_mutliplier = 3; gen2 = Point(cos(PI/6)*gen_mutliplier*far_radius, sin(PI/6)*gen_mutliplier*far_radius); gen3 = Point(cos(5*PI/6)*gen_mutliplier*far_radius, sin(5*PI/6)*gen_mutliplier*far_radius); gen1 = Point( 0,-gen_mutliplier*far_radius); g[v0].set_J( gen1, gen2, gen3 ); // this sets J2,J3,J4 and pk, so that detH(pl) can be called later // add face 1: v0-v1-v2 HEEdge e1 = hedi::add_edge( v0 , v01 , g); HEEdge e2 = hedi::add_edge( v01, v02 , g); HEEdge e3 = hedi::add_edge( v02, v0 , g); HEFace f1 = hedi::add_face( FaceProps(e2, gen3, NONINCIDENT), g ); fgrid->add_face( g[f1] ); g[e1].face = f1; g[e2].face = f1; g[e3].face = f1; g[e1].next = e2; g[e2].next = e3; g[e3].next = e1; // add face 2: v0-v2-v3 HEEdge e4 = hedi::add_edge( v0, v02 , g ); HEEdge e5 = hedi::add_edge( v02, v03 , g ); HEEdge e6 = hedi::add_edge( v03, v0 , g ); HEFace f2 = hedi::add_face( FaceProps(e5, gen1, NONINCIDENT), g ); fgrid->add_face( g[f2] ); g[e4].face = f2; g[e5].face = f2; g[e6].face = f2; g[e4].next = e5; g[e5].next = e6; g[e6].next = e4; // add face 3: v0-v3-v1 HEEdge e7 = hedi::add_edge( v0 , v03 , g); HEEdge e8 = hedi::add_edge( v03, v01 , g); HEEdge e9 = hedi::add_edge( v01, v0 , g); HEFace f3 = hedi::add_face( FaceProps(e8, gen2, NONINCIDENT), g ); fgrid->add_face( g[f3] ); g[e7].face = f3; g[e8].face = f3; g[e9].face = f3; g[e7].next = e8; g[e8].next = e9; g[e9].next = e7; // twin edges g[e1].twin = e9; g[e9].twin = e1; g[e2].twin = HEEdge(); // the outermost edges have invalid twins g[e5].twin = HEEdge(); g[e8].twin = HEEdge(); g[e3].twin = e4; g[e4].twin = e3; g[e6].twin = e7; g[e7].twin = e6; assert( vdChecker.isValid(this) ); //std::cout << " VD init() done.\n"; }
HEFace VoronoiDiagram::split_faces(const Point& p) { HEFace newface = hedi::add_face( FaceProps( HEEdge(), p, NONINCIDENT ), g ); fgrid->add_face( g[newface] ); BOOST_FOREACH( HEFace f, incident_faces ) { split_face(newface, f); // each INCIDENT face is split into two parts: newface and f }