Update to 2.0.0 tree from current Fremantle build
[opencv] / samples / swig_python / delaunay.py
diff --git a/samples/swig_python/delaunay.py b/samples/swig_python/delaunay.py
new file mode 100755 (executable)
index 0000000..09a6318
--- /dev/null
@@ -0,0 +1,149 @@
+#!/usr/bin/python
+"""
+the script demostrates iterative construction of
+delaunay triangulation and voronoi tesselation
+
+Original Author (C version): ?
+Converted to Python by: Roman Stanchak
+"""
+from opencv.cv import *
+from opencv.highgui import *
+from random import random,randint
+
+def draw_subdiv_point( img, fp, color ):
+    cvCircle( img, cvPoint(cvRound(fp.x), cvRound(fp.y)), 3, color, CV_FILLED, 8, 0 );
+
+
+
+def draw_subdiv_edge( img, edge, color ):
+    org_pt = cvSubdiv2DEdgeOrg(edge);
+    dst_pt = cvSubdiv2DEdgeDst(edge);
+
+    if org_pt and dst_pt :
+    
+        org = org_pt.pt;
+        dst = dst_pt.pt;
+
+        iorg = cvPoint( cvRound( org.x ), cvRound( org.y ));
+        idst = cvPoint( cvRound( dst.x ), cvRound( dst.y ));
+
+        cvLine( img, iorg, idst, color, 1, CV_AA, 0 );
+
+
+def draw_subdiv( img, subdiv, delaunay_color, voronoi_color ):
+    
+    total = subdiv.edges.total;
+    elem_size = subdiv.edges.elem_size;
+
+    for edge in subdiv.edges:
+        edge_rot = cvSubdiv2DRotateEdge( edge, 1 )
+
+        if( CV_IS_SET_ELEM( edge )):
+            draw_subdiv_edge( img, edge_rot, voronoi_color );
+            draw_subdiv_edge( img, edge, delaunay_color );
+
+
+def locate_point( subdiv, fp, img, active_color ):
+
+    [res, e0, p] = cvSubdiv2DLocate( subdiv, fp );
+
+    if e0:
+        e = e0
+        while True:
+            draw_subdiv_edge( img, e, active_color );
+            e = cvSubdiv2DGetEdge(e,CV_NEXT_AROUND_LEFT);
+            if e == e0:
+                break
+
+    draw_subdiv_point( img, fp, active_color );
+
+
+def draw_subdiv_facet( img, edge ):
+
+    t = edge;
+    count = 0;
+
+    # count number of edges in facet
+    while count == 0 or t != edge:
+        count+=1
+        t = cvSubdiv2DGetEdge( t, CV_NEXT_AROUND_LEFT );
+
+    buf = []
+
+    # gather points
+    t = edge;
+    for i in range(count):
+        assert t>4
+        pt = cvSubdiv2DEdgeOrg( t );
+        if not pt: 
+            break;
+        buf.append( cvPoint( cvRound(pt.pt.x), cvRound(pt.pt.y) ) );
+        t = cvSubdiv2DGetEdge( t, CV_NEXT_AROUND_LEFT );
+
+    if( len(buf)==count ):
+        pt = cvSubdiv2DEdgeDst( cvSubdiv2DRotateEdge( edge, 1 ));
+        cvFillConvexPoly( img, buf, CV_RGB(randint(0,255),randint(0,255),randint(0,255)), CV_AA, 0 );
+        cvPolyLine( img, [buf], 1, CV_RGB(0,0,0), 1, CV_AA, 0);
+        draw_subdiv_point( img, pt.pt, CV_RGB(0,0,0));
+
+def paint_voronoi( subdiv, img ):
+    total = subdiv.edges.total;
+    elem_size = subdiv.edges.elem_size;
+
+    cvCalcSubdivVoronoi2D( subdiv );
+
+    for edge in subdiv.edges:
+
+        if( CV_IS_SET_ELEM( edge )):
+            # left
+            draw_subdiv_facet( img, cvSubdiv2DRotateEdge( edge, 1 ));
+
+            # right
+            draw_subdiv_facet( img, cvSubdiv2DRotateEdge( edge, 3 ));
+
+if __name__ == '__main__':
+    win = "source";
+    rect = cvRect( 0, 0, 600, 600 );
+
+    active_facet_color = CV_RGB( 255, 0, 0 );
+    delaunay_color  = CV_RGB( 0,0,0);
+    voronoi_color = CV_RGB(0, 180, 0);
+    bkgnd_color = CV_RGB(255,255,255);
+
+    img = cvCreateImage( cvSize(rect.width,rect.height), 8, 3 );
+    cvSet( img, bkgnd_color );
+
+    cvNamedWindow( win, 1 );
+
+    storage = cvCreateMemStorage(0);
+    subdiv = cvCreateSubdivDelaunay2D( rect, storage );
+
+    print "Delaunay triangulation will be build now interactively."
+    print "To stop the process, press any key\n";
+
+    for i in range(200):
+        fp = cvPoint2D32f( random()*(rect.width-10)+5, random()*(rect.height-10)+5 )
+
+        locate_point( subdiv, fp, img, active_facet_color );
+        cvShowImage( win, img );
+
+        if( cvWaitKey( 100 ) >= 0 ):
+            break;
+
+        cvSubdivDelaunay2DInsert( subdiv, fp );
+        cvCalcSubdivVoronoi2D( subdiv );
+        cvSet( img, bkgnd_color );
+        draw_subdiv( img, subdiv, delaunay_color, voronoi_color );
+        cvShowImage( win, img );
+
+        if( cvWaitKey( 100 ) >= 0 ):
+            break;
+    
+
+    cvSet( img, bkgnd_color );
+    paint_voronoi( subdiv, img );
+    cvShowImage( win, img );
+
+    cvWaitKey(0);
+
+    cvDestroyWindow( win );