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