• opencv ThickLine


    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;
            }
        }
    }

    #############################################

  • 相关阅读:
    数组——基础
    程序流程控制——循环结构
    程序流程控制——分支结构
    运算符
    进制
    变 量
    Java中的名称命名规范
    标识符(Identifier)
    保留字(reserved word)
    关键字
  • 原文地址:https://www.cnblogs.com/herd/p/15413849.html
Copyright © 2020-2023  润新知