delaunay.c
上传用户:banwdc
上传日期:2016-06-25
资源大小:2871k
文件大小:6k
源码类别:

OpenCV

开发平台:

Visual C++

  1. #include "cv.h"
  2. #include "highgui.h"
  3. #include <stdio.h>
  4. /* the script demostrates iterative construction of
  5.    delaunay triangulation and voronoi tesselation */
  6. CvSubdiv2D* init_delaunay( CvMemStorage* storage,
  7.                            CvRect rect )
  8. {
  9.     CvSubdiv2D* subdiv;
  10.     subdiv = cvCreateSubdiv2D( CV_SEQ_KIND_SUBDIV2D, sizeof(*subdiv),
  11.                                sizeof(CvSubdiv2DPoint),
  12.                                sizeof(CvQuadEdge2D),
  13.                                storage );
  14.     cvInitSubdivDelaunay2D( subdiv, rect );
  15.     return subdiv;
  16. }
  17. void draw_subdiv_point( IplImage* img, CvPoint2D32f fp, CvScalar color )
  18. {
  19.     cvCircle( img, cvPoint(cvRound(fp.x), cvRound(fp.y)), 3, color, CV_FILLED, 8, 0 );
  20. }
  21. void draw_subdiv_edge( IplImage* img, CvSubdiv2DEdge edge, CvScalar color )
  22. {
  23.     CvSubdiv2DPoint* org_pt;
  24.     CvSubdiv2DPoint* dst_pt;
  25.     CvPoint2D32f org;
  26.     CvPoint2D32f dst;
  27.     CvPoint iorg, idst;
  28.     org_pt = cvSubdiv2DEdgeOrg(edge);
  29.     dst_pt = cvSubdiv2DEdgeDst(edge);
  30.     if( org_pt && dst_pt )
  31.     {
  32.         org = org_pt->pt;
  33.         dst = dst_pt->pt;
  34.         iorg = cvPoint( cvRound( org.x ), cvRound( org.y ));
  35.         idst = cvPoint( cvRound( dst.x ), cvRound( dst.y ));
  36.         cvLine( img, iorg, idst, color, 1, CV_AA, 0 );
  37.     }
  38. }
  39. void draw_subdiv( IplImage* img, CvSubdiv2D* subdiv,
  40.                   CvScalar delaunay_color, CvScalar voronoi_color )
  41. {
  42.     CvSeqReader  reader;
  43.     int i, total = subdiv->edges->total;
  44.     int elem_size = subdiv->edges->elem_size;
  45.     cvStartReadSeq( (CvSeq*)(subdiv->edges), &reader, 0 );
  46.     for( i = 0; i < total; i++ )
  47.     {
  48.         CvQuadEdge2D* edge = (CvQuadEdge2D*)(reader.ptr);
  49.         if( CV_IS_SET_ELEM( edge ))
  50.         {
  51.             draw_subdiv_edge( img, (CvSubdiv2DEdge)edge + 1, voronoi_color );
  52.             draw_subdiv_edge( img, (CvSubdiv2DEdge)edge, delaunay_color );
  53.         }
  54.         CV_NEXT_SEQ_ELEM( elem_size, reader );
  55.     }
  56. }
  57. void locate_point( CvSubdiv2D* subdiv, CvPoint2D32f fp, IplImage* img,
  58.                    CvScalar active_color )
  59. {
  60.     CvSubdiv2DEdge e;
  61.     CvSubdiv2DEdge e0 = 0;
  62.     CvSubdiv2DPoint* p = 0;
  63.     cvSubdiv2DLocate( subdiv, fp, &e0, &p );
  64.     if( e0 )
  65.     {
  66.         e = e0;
  67.         do
  68.         {
  69.             draw_subdiv_edge( img, e, active_color );
  70.             e = cvSubdiv2DGetEdge(e,CV_NEXT_AROUND_LEFT);
  71.         }
  72.         while( e != e0 );
  73.     }
  74.     draw_subdiv_point( img, fp, active_color );
  75. }
  76. void draw_subdiv_facet( IplImage* img, CvSubdiv2DEdge edge )
  77. {
  78.     CvSubdiv2DEdge t = edge;
  79.     int i, count = 0;
  80.     CvPoint* buf = 0;
  81.     // count number of edges in facet
  82.     do
  83.     {
  84.         count++;
  85.         t = cvSubdiv2DGetEdge( t, CV_NEXT_AROUND_LEFT );
  86.     } while (t != edge );
  87.     buf = (CvPoint*)malloc( count * sizeof(buf[0]));
  88.     // gather points
  89.     t = edge;
  90.     for( i = 0; i < count; i++ )
  91.     {
  92.         CvSubdiv2DPoint* pt = cvSubdiv2DEdgeOrg( t );
  93.         if( !pt ) break;
  94.         buf[i] = cvPoint( cvRound(pt->pt.x), cvRound(pt->pt.y));
  95.         t = cvSubdiv2DGetEdge( t, CV_NEXT_AROUND_LEFT );
  96.     }
  97.     if( i == count )
  98.     {
  99.         CvSubdiv2DPoint* pt = cvSubdiv2DEdgeDst( cvSubdiv2DRotateEdge( edge, 1 ));
  100.         cvFillConvexPoly( img, buf, count, CV_RGB(rand()&255,rand()&255,rand()&255), CV_AA, 0 );
  101.         cvPolyLine( img, &buf, &count, 1, 1, CV_RGB(0,0,0), 1, CV_AA, 0);
  102.         draw_subdiv_point( img, pt->pt, CV_RGB(0,0,0));
  103.     }
  104.     free( buf );
  105. }
  106. void paint_voronoi( CvSubdiv2D* subdiv, IplImage* img )
  107. {
  108.     CvSeqReader  reader;
  109.     int i, total = subdiv->edges->total;
  110.     int elem_size = subdiv->edges->elem_size;
  111.     cvCalcSubdivVoronoi2D( subdiv );
  112.     cvStartReadSeq( (CvSeq*)(subdiv->edges), &reader, 0 );
  113.     for( i = 0; i < total; i++ )
  114.     {
  115.         CvQuadEdge2D* edge = (CvQuadEdge2D*)(reader.ptr);
  116.         if( CV_IS_SET_ELEM( edge ))
  117.         {
  118.             CvSubdiv2DEdge e = (CvSubdiv2DEdge)edge;
  119.             // left
  120.             draw_subdiv_facet( img, cvSubdiv2DRotateEdge( e, 1 ));
  121.             // right
  122.             draw_subdiv_facet( img, cvSubdiv2DRotateEdge( e, 3 ));
  123.         }
  124.         CV_NEXT_SEQ_ELEM( elem_size, reader );
  125.     }
  126. }
  127. void run(void)
  128. {
  129.     char win[] = "source";
  130.     int i;
  131.     CvRect rect = { 0, 0, 600, 600 };
  132.     CvMemStorage* storage;
  133.     CvSubdiv2D* subdiv;
  134.     IplImage* img;
  135.     CvScalar active_facet_color, delaunay_color, voronoi_color, bkgnd_color;
  136.     active_facet_color = CV_RGB( 255, 0, 0 );
  137.     delaunay_color  = CV_RGB( 0,0,0);
  138.     voronoi_color = CV_RGB(0, 180, 0);
  139.     bkgnd_color = CV_RGB(255,255,255);
  140.     img = cvCreateImage( cvSize(rect.width,rect.height), 8, 3 );
  141.     cvSet( img, bkgnd_color, 0 );
  142.     cvNamedWindow( win, 1 );
  143.     storage = cvCreateMemStorage(0);
  144.     subdiv = init_delaunay( storage, rect );
  145.     printf("Delaunay triangulation will be build now interactively.n"
  146.            "To stop the process, press any keynn");
  147.     for( i = 0; i < 200; i++ )
  148.     {
  149.         CvPoint2D32f fp = cvPoint2D32f( (float)(rand()%(rect.width-10)+5),
  150.                                         (float)(rand()%(rect.height-10)+5));
  151.         locate_point( subdiv, fp, img, active_facet_color );
  152.         cvShowImage( win, img );
  153.         if( cvWaitKey( 100 ) >= 0 )
  154.             break;
  155.         cvSubdivDelaunay2DInsert( subdiv, fp );
  156.         cvCalcSubdivVoronoi2D( subdiv );
  157.         cvSet( img, bkgnd_color, 0 );
  158.         draw_subdiv( img, subdiv, delaunay_color, voronoi_color );
  159.         cvShowImage( win, img );
  160.         if( cvWaitKey( 100 ) >= 0 )
  161.             break;
  162.     }
  163.     cvSet( img, bkgnd_color, 0 );
  164.     paint_voronoi( subdiv, img );
  165.     cvShowImage( win, img );
  166.     cvWaitKey(0);
  167.     cvReleaseMemStorage( &storage );
  168.     cvReleaseImage(&img);
  169.     cvDestroyWindow( win );
  170. }
  171. int main( int argc, char** argv )
  172. {
  173.     run();
  174.     return 0;
  175. }