📄 cxdrawing.cpp
字号:
ep_table[1] = ep_table[3] = ((((j - i) & 0x78) | 4) * slope >> 8) & 0x1ff; ep_table[2] = (t1 >> 8) & 0x1ff; ep_table[4] = ((((j - i) + 0x80) | 4) * slope >> 8) & 0x1ff; ep_table[5] = ((t1 + t0) >> 8) & 0x1ff; ep_table[6] = (t2 >> 8) & 0x1ff; ep_table[7] = ((t2 + t0) >> 8) & 0x1ff; } if( nch == 3 ) { #define ICV_PUT_POINT() \ { \ _cb = tptr[0]; \ _cb += ((cb - _cb)*a + 127)>> 8;\ _cg = tptr[1]; \ _cg += ((cg - _cg)*a + 127)>> 8;\ _cr = tptr[2]; \ _cr += ((cr - _cr)*a + 127)>> 8;\ tptr[0] = (uchar)_cb; \ tptr[1] = (uchar)_cg; \ tptr[2] = (uchar)_cr; \ } if( ax > ay ) { ptr += (pt1.x >> XY_SHIFT) * 3; while( ecount >= 0 ) { uchar *tptr = ptr + ((pt1.y >> XY_SHIFT) - 1) * step; int ep_corr = ep_table[(((scount >= 2) + 1) & (scount | 2)) * 3 + (((ecount >= 2) + 1) & (ecount | 2))]; int a, dist = (pt1.y >> (XY_SHIFT - 5)) & 31; a = (ep_corr * icvFilterTable[dist + 32] >> 8) & 0xff; ICV_PUT_POINT(); ICV_PUT_POINT(); tptr += step; a = (ep_corr * icvFilterTable[dist] >> 8) & 0xff; ICV_PUT_POINT(); ICV_PUT_POINT(); tptr += step; a = (ep_corr * icvFilterTable[63 - dist] >> 8) & 0xff; ICV_PUT_POINT(); ICV_PUT_POINT(); pt1.y += y_step; ptr += 3; scount++; ecount--; } } else { ptr += (pt1.y >> XY_SHIFT) * step; while( ecount >= 0 ) { uchar *tptr = ptr + ((pt1.x >> XY_SHIFT) - 1) * 3; int ep_corr = ep_table[(((scount >= 2) + 1) & (scount | 2)) * 3 + (((ecount >= 2) + 1) & (ecount | 2))]; int a, dist = (pt1.x >> (XY_SHIFT - 5)) & 31; a = (ep_corr * icvFilterTable[dist + 32] >> 8) & 0xff; ICV_PUT_POINT(); ICV_PUT_POINT(); tptr += 3; a = (ep_corr * icvFilterTable[dist] >> 8) & 0xff; ICV_PUT_POINT(); ICV_PUT_POINT(); tptr += 3; a = (ep_corr * icvFilterTable[63 - dist] >> 8) & 0xff; ICV_PUT_POINT(); ICV_PUT_POINT(); pt1.x += x_step; ptr += step; scount++; ecount--; } } #undef ICV_PUT_POINT } else { #define ICV_PUT_POINT() \ { \ _cb = tptr[0]; \ _cb += ((cb - _cb)*a + 127)>> 8;\ tptr[0] = (uchar)_cb; \ } if( ax > ay ) { ptr += (pt1.x >> XY_SHIFT); while( ecount >= 0 ) { uchar *tptr = ptr + ((pt1.y >> XY_SHIFT) - 1) * step; int ep_corr = ep_table[(((scount >= 2) + 1) & (scount | 2)) * 3 + (((ecount >= 2) + 1) & (ecount | 2))]; int a, dist = (pt1.y >> (XY_SHIFT - 5)) & 31; a = (ep_corr * icvFilterTable[dist + 32] >> 8) & 0xff; ICV_PUT_POINT(); ICV_PUT_POINT(); tptr += step; a = (ep_corr * icvFilterTable[dist] >> 8) & 0xff; ICV_PUT_POINT(); ICV_PUT_POINT(); tptr += step; a = (ep_corr * icvFilterTable[63 - dist] >> 8) & 0xff; ICV_PUT_POINT(); ICV_PUT_POINT(); pt1.y += y_step; ptr++; scount++; ecount--; } } else { ptr += (pt1.y >> XY_SHIFT) * step; while( ecount >= 0 ) { uchar *tptr = ptr + ((pt1.x >> XY_SHIFT) - 1); int ep_corr = ep_table[(((scount >= 2) + 1) & (scount | 2)) * 3 + (((ecount >= 2) + 1) & (ecount | 2))]; int a, dist = (pt1.x >> (XY_SHIFT - 5)) & 31; a = (ep_corr * icvFilterTable[dist + 32] >> 8) & 0xff; ICV_PUT_POINT(); ICV_PUT_POINT(); tptr++; a = (ep_corr * icvFilterTable[dist] >> 8) & 0xff; ICV_PUT_POINT(); ICV_PUT_POINT(); tptr++; a = (ep_corr * icvFilterTable[63 - dist] >> 8) & 0xff; ICV_PUT_POINT(); ICV_PUT_POINT(); pt1.x += x_step; ptr += step; scount++; ecount--; } } #undef ICV_PUT_POINT }}static voidicvLine2( CvMat* img, CvPoint pt1, CvPoint pt2, const void* color ){ int dx, dy; int ecount; int ax, ay; int i, j; int x_step, y_step; int cb = ((uchar*)color)[0], cg = ((uchar*)color)[1], cr = ((uchar*)color)[2]; int pix_size = CV_ELEM_SIZE( img->type ); uchar *ptr = (uchar*)(img->data.ptr), *tptr; int step = img->step; CvSize size = cvGetMatSize( img ); //assert( img && (nch == 1 || nch == 3) && CV_MAT_DEPTH(img->type) == CV_8U ); pt1.x -= XY_ONE*2; pt1.y -= XY_ONE*2; pt2.x -= XY_ONE*2; pt2.y -= XY_ONE*2; ptr += img->step*2 + 2*pix_size; size.width = ((size.width - 5) << XY_SHIFT) + 1; size.height = ((size.height - 5) << XY_SHIFT) + 1; if( !cvClipLine( size, &pt1, &pt2 )) return; dx = pt2.x - pt1.x; dy = pt2.y - pt1.y; j = dx < 0 ? -1 : 0; ax = (dx ^ j) - j; i = dy < 0 ? -1 : 0; ay = (dy ^ i) - i; if( ax > ay ) { dx = ax; dy = (dy ^ j) - j; pt1.x ^= pt2.x & j; pt2.x ^= pt1.x & j; pt1.x ^= pt2.x & j; pt1.y ^= pt2.y & j; pt2.y ^= pt1.y & j; pt1.y ^= pt2.y & j; x_step = XY_ONE; y_step = (int) (( dy << XY_SHIFT) / (ax | 1)); ecount = (pt2.x - pt1.x) >> XY_SHIFT; } else { dy = ay; dx = (dx ^ i) - i; pt1.x ^= pt2.x & i; pt2.x ^= pt1.x & i; pt1.x ^= pt2.x & i; pt1.y ^= pt2.y & i; pt2.y ^= pt1.y & i; pt1.y ^= pt2.y & i; x_step = (int) (( dx << XY_SHIFT) / (ay | 1)); y_step = XY_ONE; ecount = (pt2.y - pt1.y) >> XY_SHIFT; } pt1.x += (XY_ONE >> 1); pt1.y += (XY_ONE >> 1); if( pix_size == 3 ) { #define ICV_PUT_POINT() \ { \ tptr[0] = (uchar)cb; \ tptr[1] = (uchar)cg; \ tptr[2] = (uchar)cr; \ } tptr = ptr + ((pt2.x + (XY_ONE >> 1))>> XY_SHIFT)*3 + ((pt2.y + (XY_ONE >> 1)) >> XY_SHIFT)*step; ICV_PUT_POINT(); if( ax > ay ) { ptr += (pt1.x >> XY_SHIFT) * 3; while( ecount >= 0 ) { tptr = ptr + (pt1.y >> XY_SHIFT) * step; ICV_PUT_POINT(); pt1.y += y_step; ptr += 3; ecount--; } } else { ptr += (pt1.y >> XY_SHIFT) * step; while( ecount >= 0 ) { tptr = ptr + (pt1.x >> XY_SHIFT) * 3; ICV_PUT_POINT(); pt1.x += x_step; ptr += step; ecount--; } } #undef ICV_PUT_POINT } else if( pix_size == 1 ) { #define ICV_PUT_POINT() \ { \ tptr[0] = (uchar)cb; \ } tptr = ptr + ((pt2.x + (XY_ONE >> 1))>> XY_SHIFT) + ((pt2.y + (XY_ONE >> 1)) >> XY_SHIFT)*step; ICV_PUT_POINT(); if( ax > ay ) { ptr += (pt1.x >> XY_SHIFT); while( ecount >= 0 ) { tptr = ptr + (pt1.y >> XY_SHIFT) * step; ICV_PUT_POINT(); pt1.y += y_step; ptr++; ecount--; } } else { ptr += (pt1.y >> XY_SHIFT) * step; while( ecount >= 0 ) { tptr = ptr + (pt1.x >> XY_SHIFT); ICV_PUT_POINT(); pt1.x += x_step; ptr += step; ecount--; } } #undef ICV_PUT_POINT } else { #define ICV_PUT_POINT() \ for( j = 0; j < pix_size; j++ ) \ tptr[j] = ((uchar*)color)[j]; tptr = ptr + ((pt2.x + (XY_ONE >> 1))>> XY_SHIFT)*pix_size + ((pt2.y + (XY_ONE >> 1)) >> XY_SHIFT)*step; ICV_PUT_POINT(); if( ax > ay ) { ptr += (pt1.x >> XY_SHIFT) * pix_size; while( ecount >= 0 ) { tptr = ptr + (pt1.y >> XY_SHIFT) * step; ICV_PUT_POINT(); pt1.y += y_step; ptr += pix_size; ecount--; } } else { ptr += (pt1.y >> XY_SHIFT) * step; while( ecount >= 0 ) { tptr = ptr + (pt1.x >> XY_SHIFT) * pix_size; ICV_PUT_POINT(); pt1.x += x_step; ptr += step; ecount--; } } #undef ICV_PUT_POINT }}/****************************************************************************************\* Antialiazed Elliptic Arcs via Antialiazed Lines *\****************************************************************************************/static const float icvSinTable[] = { 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,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -