📄 cxdrawing.cpp
字号:
0.5877853f, 0.5735764f, 0.5591929f, 0.5446390f, 0.5299193f, 0.5150381f, 0.5000000f, 0.4848096f, 0.4694716f, 0.4539905f, 0.4383711f, 0.4226183f, 0.4067366f, 0.3907311f, 0.3746066f, 0.3583679f, 0.3420201f, 0.3255682f, 0.3090170f, 0.2923717f, 0.2756374f, 0.2588190f, 0.2419219f, 0.2249511f, 0.2079117f, 0.1908090f, 0.1736482f, 0.1564345f, 0.1391731f, 0.1218693f, 0.1045285f, 0.0871557f, 0.0697565f, 0.0523360f, 0.0348995f, 0.0174524f, 0.0000000f, -0.0174524f, -0.0348995f, -0.0523360f, -0.0697565f, -0.0871557f, -0.1045285f, -0.1218693f, -0.1391731f, -0.1564345f, -0.1736482f, -0.1908090f, -0.2079117f, -0.2249511f, -0.2419219f, -0.2588190f, -0.2756374f, -0.2923717f, -0.3090170f, -0.3255682f, -0.3420201f, -0.3583679f, -0.3746066f, -0.3907311f, -0.4067366f, -0.4226183f, -0.4383711f, -0.4539905f, -0.4694716f, -0.4848096f, -0.5000000f, -0.5150381f, -0.5299193f, -0.5446390f, -0.5591929f, -0.5735764f, -0.5877853f, -0.6018150f, -0.6156615f, -0.6293204f, -0.6427876f, -0.6560590f, -0.6691306f, -0.6819984f, -0.6946584f, -0.7071068f, -0.7193398f, -0.7313537f, -0.7431448f, -0.7547096f, -0.7660444f, -0.7771460f, -0.7880108f, -0.7986355f, -0.8090170f, -0.8191520f, -0.8290376f, -0.8386706f, -0.8480481f, -0.8571673f, -0.8660254f, -0.8746197f, -0.8829476f, -0.8910065f, -0.8987940f, -0.9063078f, -0.9135455f, -0.9205049f, -0.9271839f, -0.9335804f, -0.9396926f, -0.9455186f, -0.9510565f, -0.9563048f, -0.9612617f, -0.9659258f, -0.9702957f, -0.9743701f, -0.9781476f, -0.9816272f, -0.9848078f, -0.9876883f, -0.9902681f, -0.9925462f, -0.9945219f, -0.9961947f, -0.9975641f, -0.9986295f, -0.9993908f, -0.9998477f, -1.0000000f, -0.9998477f, -0.9993908f, -0.9986295f, -0.9975641f, -0.9961947f, -0.9945219f, -0.9925462f, -0.9902681f, -0.9876883f, -0.9848078f, -0.9816272f, -0.9781476f, -0.9743701f, -0.9702957f, -0.9659258f, -0.9612617f, -0.9563048f, -0.9510565f, -0.9455186f, -0.9396926f, -0.9335804f, -0.9271839f, -0.9205049f, -0.9135455f, -0.9063078f, -0.8987940f, -0.8910065f, -0.8829476f, -0.8746197f, -0.8660254f, -0.8571673f, -0.8480481f, -0.8386706f, -0.8290376f, -0.8191520f, -0.8090170f, -0.7986355f, -0.7880108f, -0.7771460f, -0.7660444f, -0.7547096f, -0.7431448f, -0.7313537f, -0.7193398f, -0.7071068f, -0.6946584f, -0.6819984f, -0.6691306f, -0.6560590f, -0.6427876f, -0.6293204f, -0.6156615f, -0.6018150f, -0.5877853f, -0.5735764f, -0.5591929f, -0.5446390f, -0.5299193f, -0.5150381f, -0.5000000f, -0.4848096f, -0.4694716f, -0.4539905f, -0.4383711f, -0.4226183f, -0.4067366f, -0.3907311f, -0.3746066f, -0.3583679f, -0.3420201f, -0.3255682f, -0.3090170f, -0.2923717f, -0.2756374f, -0.2588190f, -0.2419219f, -0.2249511f, -0.2079117f, -0.1908090f, -0.1736482f, -0.1564345f, -0.1391731f, -0.1218693f, -0.1045285f, -0.0871557f, -0.0697565f, -0.0523360f, -0.0348995f, -0.0174524f, -0.0000000f, 0.0174524f, 0.0348995f, 0.0523360f, 0.0697565f, 0.0871557f, 0.1045285f, 0.1218693f, 0.1391731f, 0.1564345f, 0.1736482f, 0.1908090f, 0.2079117f, 0.2249511f, 0.2419219f, 0.2588190f, 0.2756374f, 0.2923717f, 0.3090170f, 0.3255682f, 0.3420201f, 0.3583679f, 0.3746066f, 0.3907311f, 0.4067366f, 0.4226183f, 0.4383711f, 0.4539905f, 0.4694716f, 0.4848096f, 0.5000000f, 0.5150381f, 0.5299193f, 0.5446390f, 0.5591929f, 0.5735764f, 0.5877853f, 0.6018150f, 0.6156615f, 0.6293204f, 0.6427876f, 0.6560590f, 0.6691306f, 0.6819984f, 0.6946584f, 0.7071068f, 0.7193398f, 0.7313537f, 0.7431448f, 0.7547096f, 0.7660444f, 0.7771460f, 0.7880108f, 0.7986355f, 0.8090170f, 0.8191520f, 0.8290376f, 0.8386706f, 0.8480481f, 0.8571673f, 0.8660254f, 0.8746197f, 0.8829476f, 0.8910065f, 0.8987940f, 0.9063078f, 0.9135455f, 0.9205049f, 0.9271839f, 0.9335804f, 0.9396926f, 0.9455186f, 0.9510565f, 0.9563048f, 0.9612617f, 0.9659258f, 0.9702957f, 0.9743701f, 0.9781476f, 0.9816272f, 0.9848078f, 0.9876883f, 0.9902681f, 0.9925462f, 0.9945219f, 0.9961947f, 0.9975641f, 0.9986295f, 0.9993908f, 0.9998477f, 1.0000000f};static voidicvSinCos( int angle, float *cosval, float *sinval ){ angle += (angle < 0 ? 360 : 0); *sinval = icvSinTable[angle]; *cosval = icvSinTable[450 - angle];}/* constructs polygon that represents elliptic arc.*/CV_IMPL intcvEllipse2Poly( CvPoint center, CvSize axes, int angle, int arc_start, int arc_end, CvPoint* pts, int delta ){ float alpha, beta; double size_a = axes.width, size_b = axes.height; double cx = center.x, cy = center.y; CvPoint *pts_origin = pts; int i; while( angle < 0 ) angle += 360; while( angle > 360 ) angle -= 360; if( arc_start > arc_end ) { i = arc_start; arc_start = arc_end; arc_end = i; } while( arc_start < 0 ) { arc_start += 360; arc_end += 360; } while( arc_end > 360 ) { arc_end -= 360; arc_start -= 360; } if( arc_end - arc_start > 360 ) { arc_start = 0; arc_end = 360; } icvSinCos( angle, &alpha, &beta ); for( i = arc_start; i < arc_end + delta; i += delta ) { double x, y; angle = i; if( angle > arc_end ) angle = arc_end; if( angle < 0 ) angle += 360; x = size_a * icvSinTable[450-angle]; y = size_b * icvSinTable[angle]; pts->x = cvRound( cx + x * alpha - y * beta ); pts->y = cvRound( cy - x * beta - y * alpha ); pts += i == arc_start || pts->x != pts[-1].x || pts->y != pts[-1].y; } i = (int)(pts - pts_origin); for( ; i < 2; i++ ) pts_origin[i] = pts_origin[i-1]; return i;}/****************************************************************************************\* Polygons filling * \****************************************************************************************//* helper macros: filling horizontal row */#define ICV_HLINE( ptr, xl, xr, color, pix_size ) \{ \ uchar* hline_ptr = (uchar*)(ptr) + (xl)*(pix_size); \ uchar* hline_max_ptr = (uchar*)(ptr) + (xr)*(pix_size); \ \ for( ; hline_ptr <= hline_max_ptr; hline_ptr += (pix_size))\ { \ int hline_j; \ for( hline_j = 0; hline_j < (pix_size); hline_j++ ) \ { \ hline_ptr[hline_j] = ((uchar*)color)[hline_j]; \ } \ } \}/* filling convex polygon. v - array of vertices, ntps - number of points */static voidicvFillConvexPoly( CvMat* img, CvPoint *v, int npts, const void* color, int line_type, int shift ){ struct { int idx, di; int x, dx, ye; } edge[2]; int delta = shift ? 1 << (shift - 1) : 0; int i, y, imin = 0, left = 0, right = 1, x1, x2; int edges = npts; int xmin, xmax, ymin, ymax; uchar* ptr = img->data.ptr; CvSize size = cvGetMatSize( img ); int pix_size = CV_ELEM_SIZE(img->type); CvPoint p0; int delta1, delta2; if( line_type < CV_AA ) delta1 = delta2 = XY_ONE >> 1; //delta1 = 0, delta2 = XY_ONE - 1; else delta1 = XY_ONE - 1, delta2 = 0; p0 = v[npts - 1]; p0.x <<= XY_SHIFT - shift; p0.y <<= XY_SHIFT - shift; assert( 0 <= shift && shift <= XY_SHIFT ); xmin = xmax = v[0].x; ymin = ymax = v[0].y; for( i = 0; i < npts; i++ ) { CvPoint p = v[i]; if( p.y < ymin ) { ymin = p.y; imin = i; } ymax = MAX( ymax, p.y ); xmax = MAX( xmax, p.x ); xmin = MIN( xmin, p.x ); p.x <<= XY_SHIFT - shift; p.y <<= XY_SHIFT - shift; if( line_type <= 8 ) { if( shift == 0 ) { CvPoint pt0, pt1; pt0.x = p0.x >> XY_SHIFT; pt0.y = p0.y >> XY_SHIFT; pt1.x = p.x >> XY_SHIFT; pt1.y = p.y >> XY_SHIFT; icvLine( img, pt0, pt1, color, line_type ); } else icvLine2( img, p0, p, color ); } else icvLineAA( img, p0, p, color ); p0 = p; } xmin = (xmin + delta) >> shift; xmax = (xmax + delta) >> shift; ymin = (ymin + delta) >> shift; ymax = (ymax + delta) >> shift; if( npts < 3 || xmax < 0 || ymax < 0 || xmin >= size.width || ymin >= size.height ) return; ymax = MIN( ymax, size.height - 1 ); edge[0].idx = edge[1].idx = imin; edge[0].ye = edge[1].ye = y = ymin; edge[0].di = 1; edge[1].di = npts - 1; ptr += img->step*y; do { if( line_type < CV_AA || y < ymax || y == ymin ) { for( i = 0; i < 2; i++ ) { if( y >= edge[i].ye ) { int idx = edge[i].idx, di = edge[i].di; int xs = 0, xe, ye, ty = 0; for(;;) { ty = (v[idx].y + delta) >> shift; if( ty > y || edges == 0 ) break; xs = v[idx].x; idx += di; idx -= ((idx < npts) - 1) & npts; /* idx -= idx >= npts ? npts : 0 */ edges--; } ye = ty; xs <<= XY_SHIFT - shift; xe = v[idx].x << (XY_SHIFT - shift); /* no more edges */ if( y >= ye ) return; edge[i].ye = ye; edge[i].dx = ((xe - xs)*2 + (ye - y)) / (2 * (ye - y)); edge[i].x = xs; edge[i].idx = idx; } } } if( edge[left].x > edge[right].x ) { left ^= 1; right ^= 1; } x1 = edge[left].x; x2 = edge[right].x; if( y >= 0 ) { int xx1 = (x1 + delta1) >> XY_SHIFT; int xx2 = (x2 + delta2) >> XY_SHIFT; if( xx2 >= 0 && xx1 < size.width ) { if( xx1 < 0 ) xx1 = 0; if( xx2 >= size.width ) xx2 = size.width - 1; ICV_HLINE( ptr, xx1, xx2, color, pix_size ); } } x1 += edge[left].dx; x2 += edge[right].dx; edge[left].x = x1; edge[right].x = x2; ptr += img->step; } while( ++y <= ymax );}/**************** helper macros and functions for sequence/contour processing ***********//* draws simple or filled circle */static voidicvCircle( CvMat* img, CvPoint center, int radius, const void* color, int fill ){ CvSize size = cvGetMatSize( img ); int step = img->step; int pix_size = CV_ELEM_SIZE(img->type); uchar* ptr = (uchar*)(img->data.ptr); int err = 0, dx = radius, dy = 0, plus = 1, minus = (radius << 1) - 1; int inside = center.x >= radius && center.x < size.width - radius && center.y >= radius && center.y < size.height - radius; #define ICV_PUT_POINT( ptr, x ) \ CV_MEMCPY_CHAR( ptr + (x)*pix_size, color, pix_size ); while( dx >= dy ) { int mask; int y11 = center.y - dy, y12 = center.y + dy, y21 = center.y - dx, y22 = center.y + dx; int x11 = center.x - dx, x12 = center.x + dx, x21 = center.x - dy, x22 = center.x + dy; if( inside ) { uchar *tptr0 = ptr + y11 * step; uchar *tptr1 = ptr + y12 * step; if( !fill ) { ICV_PUT_POINT( tptr0, x11 ); ICV_PUT_POINT( tptr1, x11 ); ICV_PUT_POINT( tptr0, x12 ); ICV_PUT_POINT( tptr1, x12 ); } else { ICV_HLINE( tptr0, x11, x12, color, pix_size ); ICV_HLINE( tptr1, x11, x12, color, pix_size ); } tptr0 = ptr + y21 * step; tptr1 = ptr + y22 * step; if( !fill ) { ICV_PUT_POINT( tptr0, x21 ); ICV_PUT_POINT( tptr1, x21 ); ICV_PUT_POINT( tptr0, x22 ); ICV_PUT_POINT( tptr1, x22 ); } else { ICV_HLINE( tptr0, x21, x22, color, pix_size ); ICV_HLINE( tptr1, x21, x22, color, pix_size ); } } else if( x11 < size.width && x12 >= 0 && y21 < size.height && y22 >= 0 ) { if( fill ) { x11 = MAX( x11, 0 ); x12 = MIN( x12, size.width - 1 ); } if( (unsigned)y11 < (unsigned)size.height ) { uchar *tptr = ptr + y11 * step; if( !fill ) { if( x11 >= 0 ) ICV_PUT_POINT( tptr, x11 ); if( x12 < size.width ) ICV_PUT_POINT( tptr, x12 ); } else ICV_HLINE( tptr, x11, x12, color, pix_size );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -