解决方案 »

  1.   

    图片地址 http://wenwen.soso.com/z/q264683155.htm
      

  2.   

    这个结果算出来的是包含这条线的矩形你可以根据L1,L2的值和A,B点的坐标算出四个点的具体坐标
     protected override void OnPaint(PaintEventArgs e)
            {
                base.OnPaint(e);
                e.Graphics.DrawLine(new Pen(Color.Black, 18), p1, p2);
                e.Graphics.DrawRectangle(Pens.Blue, GetLineRectangle());
            }        Point p1 = new Point(90, 60);
            Point p2 = new Point(140, 180);
            private Rectangle GetLineRectangle()
            {
                int l1 = Math.Abs(p1.X - p2.X);
                int l2 = Math.Abs(p1.Y - p2.Y);
                double l3 = Math.Sqrt(l1 * l1 + l2 * l2);
                double angle = Math.Acos(l1 / l3) * (180/Math.PI);
                double aaa = Math.PI * angle / 180.0;
                double L2 = Math.Cos(aaa) * 9;
                double L1 = Math.Sin(aaa) * 9;
                return new Rectangle((int)((double)p1.X- L1),(int)((double)p1.Y - L2),(int)(l1+L1*2+2),(int)(l2+L2*2+2));
                
            }
      

  3.   

    不是这样的,意思就是 我画了一条很细的线,比如我现在要变粗,然后把变粗后的4个点寻找到。粗细就是我的size
      

  4.   

    本想用椭圆方程,最后还是采用向量的思路去解决,未仔细优化,供参考。private MyPoint[] Algorithm_PointPos(MyPoint PointA, MyPoint pointB, int thick)
            {
                double h = thick / 2.0;
                MyPoint ptVec = new MyPoint();  //有符号
                ptVec.X = pointB.X - PointA.X;
                ptVec.Y = pointB.Y - PointA.Y;
                double lineLen = Math.Sqrt(Math.Pow(ptVec.X, 2) + Math.Pow(ptVec.Y, 2));
                double cosAngle = Math.Abs(ptVec.X) / lineLen;
                double sinAngle = Math.Abs(ptVec.Y) / lineLen;            MyPoint ptAN = new MyPoint();   //first point
                ptAN.X = h * sinAngle;
                ptAN.Y = h * cosAngle;
                MyPoint[] pts = new MyPoint[4];
                if (ptVec.X * ptVec.Y > 0)
                {
                    pts[0] = new MyPoint(PointA.X + ptAN.X, PointA.Y - ptAN.Y);
                    pts[1] = new MyPoint(PointA.X - ptAN.X, PointA.Y + ptAN.Y);
                    pts[2] = new MyPoint(pts[0].X + ptVec.X, pts[0].Y + ptVec.Y);
                    pts[3] = new MyPoint(pts[1].X + ptVec.X, pts[1].Y + ptVec.Y);
                }
                else
                {
                    pts[0] = new MyPoint(PointA.X - ptAN.X, PointA.Y - ptAN.Y);
                    pts[1] = new MyPoint(PointA.X + ptAN.X, PointA.Y + ptAN.Y);
                    pts[2] = new MyPoint(pts[0].X + ptVec.X, pts[0].Y + ptVec.Y);
                    pts[3] = new MyPoint(pts[1].X + ptVec.X, pts[1].Y + ptVec.Y);
                }
                return pts;
            }运行效果:
    下载项目文件:
    下载