opencv ThickLine
static void ThickLine( Mat& img, Point2l p0, Point2l p1, const void* color,int thickness, int line_type, int flags, int shift ) { static const double INV_XY_ONE = 1./XY_ONE; p0.x <<= XY_SHIFT - shift; p0.y <<= XY_SHIFT - shift; p1.x <<= XY_SHIFT - shift; p1.y <<= XY_SHIFT - shift; if( thickness <= 1 ) { if( line_type < CV_AA ) { if( line_type == 1 || line_type == 4 || shift == 0 ) { p0.x = (p0.x + (XY_ONE>>1)) >> XY_SHIFT; p0.y = (p0.y + (XY_ONE>>1)) >> XY_SHIFT; p1.x = (p1.x + (XY_ONE>>1)) >> XY_SHIFT; p1.y = (p1.y + (XY_ONE>>1)) >> XY_SHIFT; Line( img, p0, p1, color, line_type ); } else Line2( img, p0, p1, color ); } else LineAA( img, p0, p1, color ); } else { Point2l pt[4], dp = Point2l(0,0); double dx = (p0.x - p1.x)*INV_XY_ONE, dy = (p1.y - p0.y)*INV_XY_ONE; double r = dx * dx + dy * dy; int i, oddThickness = thickness & 1; thickness <<= XY_SHIFT - 1; if( fabs(r) > DBL_EPSILON ) { r = (thickness + oddThickness*XY_ONE*0.5)/std::sqrt(r); dp.x = cvRound( dy * r ); dp.y = cvRound( dx * r ); pt[0].x = p0.x + dp.x; pt[0].y = p0.y + dp.y; pt[1].x = p0.x - dp.x; pt[1].y = p0.y - dp.y; pt[2].x = p1.x - dp.x; pt[2].y = p1.y - dp.y; pt[3].x = p1.x + dp.x; pt[3].y = p1.y + dp.y; FillConvexPoly( img, pt, 4, color, line_type, XY_SHIFT ); } for( i = 0; i < 2; i++ ) { if( flags & (i+1) ) { if( line_type < CV_AA ) { Point center; center.x = (int)((p0.x + (XY_ONE>>1)) >> XY_SHIFT); center.y = (int)((p0.y + (XY_ONE>>1)) >> XY_SHIFT); Circle( img, center, (thickness + (XY_ONE>>1)) >> XY_SHIFT, color, 1 ); } else { EllipseEx( img, p0, Size2l(thickness, thickness), 0, 0, 360, color, -1, line_type ); } } p0 = p1; } } }
#############################################