CvSubdiv2D* init_delaunay( CvMemStorage* storage, CvRect rect ) { CvSubdiv2D* subdiv; subdiv = cvCreateSubdiv2D( CV_SEQ_KIND_SUBDIV2D, sizeof(*subdiv), sizeof(CvSubdiv2DPoint), sizeof(CvQuadEdge2D), storage ); cvInitSubdivDelaunay2D( subdiv, rect ); return subdiv; }
void cvDecompPoly( CvContour* cont, CvSubdiv2D** subdiv, CvMemStorage* storage ) { int* memory; CvPoint* contour; int* outEdges; int* refer; CvSubdiv2DPoint** pntsPtrs; CvQuadEdge2D** edgesPtrs; int numVtx; int numEdges; int i; CvSeqReader reader; CvPoint2D32f pnt; CvQuadEdge2D* quadEdge; numVtx = cont -> total; if( numVtx < 3 ) { return; } *subdiv = ( CvSubdiv2D* )0; memory = ( int* )malloc( sizeof( int ) * ( numVtx * 2 + numVtx * numVtx * 2 * 5 ) + sizeof( CvQuadEdge2D* ) * ( numVtx * numVtx ) + sizeof( CvSubdiv2DPoint* ) * ( numVtx * 2 ) ); contour = ( CvPoint* )memory; outEdges = ( int* )( contour + numVtx ); refer = outEdges + numVtx * numVtx * 2; edgesPtrs = ( CvQuadEdge2D** )( refer + numVtx * numVtx * 4 ); pntsPtrs = ( CvSubdiv2DPoint** )( edgesPtrs + numVtx * numVtx ); cvStartReadSeq( ( CvSeq* )cont, &reader, 0 ); for( i = 0; i < numVtx; i ++ ) { CV_READ_SEQ_ELEM( (contour[ i ]), reader ); } // for( i = 0; i < numVtx; i ++ ) if( !icvFindReferences( contour, numVtx, outEdges, refer, &numEdges ) ) { free( memory ); return; } // if( !icvFindReferences( contour, numVtx, outEdges, refer, ... *subdiv = cvCreateSubdiv2D( CV_SEQ_KIND_SUBDIV2D, sizeof( CvSubdiv2D ), sizeof( CvSubdiv2DPoint ), sizeof( CvQuadEdge2D ), storage ); for( i = 0; i < numVtx; i ++ ) { pnt.x = ( float )contour[ i ].x; pnt.y = ( float )contour[ i ].y; pntsPtrs[ i ] = cvSubdiv2DAddPoint( *subdiv, pnt, 0 ); } // for( i = 0; i < numVtx; i ++ ) for( i = 0; i < numEdges; i ++ ) { edgesPtrs[ i ] = ( CvQuadEdge2D* ) ( cvSubdiv2DMakeEdge( *subdiv ) & 0xfffffffc ); } // for( i = 0; i < numEdges; i ++ ) for( i = 0; i < numEdges; i ++ ) { quadEdge = edgesPtrs[ i ]; quadEdge -> next[ 0 ] = ( ( CvSubdiv2DEdge )edgesPtrs[ refer[ i * 4 ] >> 2 ] ) | ( refer[ i * 4 ] & 3 ); quadEdge -> next[ 1 ] = ( ( CvSubdiv2DEdge )edgesPtrs[ refer[ i * 4 + 1 ] >> 2 ] ) | ( refer[ i * 4 + 1 ] & 3 ); quadEdge -> next[ 2 ] = ( ( CvSubdiv2DEdge )edgesPtrs[ refer[ i * 4 + 2 ] >> 2 ] ) | ( refer[ i * 4 + 2 ] & 3 ); quadEdge -> next[ 3 ] = ( ( CvSubdiv2DEdge )edgesPtrs[ refer[ i * 4 + 3 ] >> 2 ] ) | ( refer[ i * 4 + 3 ] & 3 ); quadEdge -> pt[ 0 ] = pntsPtrs[ outEdges[ i * 2 ] ]; quadEdge -> pt[ 1 ] = ( CvSubdiv2DPoint* )0; quadEdge -> pt[ 2 ] = pntsPtrs[ outEdges[ i * 2 + 1 ] ]; quadEdge -> pt[ 3 ] = ( CvSubdiv2DPoint* )0; } // for( i = 0; i < numEdges; i ++ ) (*subdiv) -> topleft.x = ( float )cont -> rect.x; (*subdiv) -> topleft.y = ( float )cont -> rect.y; (*subdiv) -> bottomright.x = ( float )( cont -> rect.x + cont -> rect.width ); (*subdiv) -> bottomright.y = ( float )( cont -> rect.y + cont -> rect.height ); free( memory ); return; } // cvDecompPoly