水平和垂直的好弄,关键是任意角度的该怎么弄呢 
  public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
            starPointF = new PointF(0, this.Height / 2);
            endPointF = new PointF(this.Width / 8 * 5, this.Height / 2);
            triangleSize = new Size(10, 10);
        }        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            Graphics g = e.Graphics;
            g.DrawLine(Pens.Red, starPointF, endPointF);            //这是按照水平向左的方向画图的 ,现在要实现的是任意角度,关键的是p1,p2,p3坐标怎么算的呢, 
            //看着真的很简单,高中知识,可是我现在解二元二次方程, 搞的我头都大了,还是不能用starPointF,endPointF,triangleSize来表示。            PointF p1 = new PointF(endPointF.X, endPointF.Y - triangleSize.Height / 2);
            PointF p2 = new PointF(endPointF.X, endPointF.Y + triangleSize.Height / 2);
            PointF p3 = new PointF(endPointF.X + triangleSize.Width, endPointF.Y);            Brush brush = new SolidBrush(Color.Red);
            GraphicsPath path = new GraphicsPath();
            path.AddLine(p1, p2);
            path.AddLine(p2, p3);
            path.AddLine(p3, p1);
            g.FillPath(brush, path);
        }        PointF starPointF = new PointF(0, 0);
        PointF endPointF = new PointF(0, 0);        public PointF StarPointF
        {
            get { return starPointF; }
            set { starPointF = value; }
        }
        public PointF EndPointF
        {
            get { return endPointF; }
            set { endPointF = value; }
        }        SizeF triangleSize;
        /// <summary>
        /// 三角形大小 ,这个是等腰三角形, 宽度表示定点到底边的距离, 高表示底边的长度
        /// </summary>
        public SizeF TriangleSize
        {
            get { return triangleSize; }
            set
            {
                if (triangleSize != value)
                {
                    triangleSize = value;
                    base.Invalidate();
                }
            }
        }    }

解决方案 »

  1.   

    计算机绘图中,这就好像是“加减乘除”一样是超级简单的入门知识。对于一系列点(Point[]),把它们平移、旋转,不过是矩阵右乘一个(或者连续多个、根据你需要多少个旋转和平移操作而定)简单的正方矩阵。不论是线性代数还是计算机绘图,这个都是最入门的知识。完全谈不上有让任何技术。
      

  2.   

    有自带的箭头为社么不用呢  在pen的属性里
      

  3.   

    Graphic 对象已经帮你包装好了,
    g.Rotate(),好像是这个
      

  4.   

    你的水平箭头画好了啊,旋转Graphic对象,就相当于你的头转下而已!
      

  5.   

    如果质量不好,设置g.SmoothingMode
      

  6.   

    还是给解决掉了,基本满足要求,只是三角形我先给写死的,这个改下很简单了。再也不去解2元2次方程的了,高中很轻松就能搞定的,现在怎么不行的了。
    没有必要那样精确,换了一下思路。分享一下,后面的肯定会有人遇到。public partial class UserControl1 : UserControl
        {
            public UserControl1()
            {
                InitializeComponent();
                starPoint = new Point(0, this.Height / 2);
                endPoint = new Point(this.Width / 8 * 5, this.Height / 2);
                triangleSize = new Size(10, 10);
            }        protected override void OnPaint(PaintEventArgs e)
            {
                base.OnPaint(e);
                e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
                Graphics g = e.Graphics;
                g.DrawLine(Pens.Red, starPoint, endPoint);
                drawLineArrow(Pens.Red, starPoint, endPoint, e);            //这是按照水平向左的方向画图的 ,现在要实现的是任意角度,关键的是p1,p2,p3坐标怎么算的呢, 
                //看着真的很简单,高中知识,可是我现在解二元二次方程, 搞的我头都大了,还是不能用starPoint,endPoint,triangleSize来表示。
                //Point p1 = new Point(endPoint.X, endPoint.Y - triangleSize.Height / 2);
                //Point p2 = new Point(endPoint.X, endPoint.Y + triangleSize.Height / 2);
                //Point p3 = new Point(endPoint.X + triangleSize.Width, endPoint.Y);            //Brush brush = new SolidBrush(Color.Red);
                //GraphicsPath path = new GraphicsPath();
                //path.AddLine(p1, p2);
                //path.AddLine(p2, p3);
                //path.AddLine(p3, p1);
                //g.FillPath(brush, path);
            }        Point starPoint = new Point(0, 0);
            Point endPoint = new Point(0, 0);        public Point StarPoint
            {
                get { return starPoint; }
                set { starPoint = value; }
            }
            public Point EndPoint
            {
                get { return endPoint; }
                set { endPoint = value; }
            }        SizeF triangleSize;
            /// <summary>
            /// 三角形大小 ,这个是等腰三角形, 宽度表示定点到底边的距离, 高表示底边的长度
            /// </summary>
            public SizeF TriangleSize
            {
                get { return triangleSize; }
                set
                {
                    if (triangleSize != value)
                    {
                        triangleSize = value;
                        base.Invalidate();
                    }
                }
            }        public void drawLineArrow(Pen pen, Point startPt, Point endPt, PaintEventArgs e)
            {
                int x = startPt.X;
                int y = startPt.Y;
                int num3 = endPt.X;
                int num4 = endPt.Y;
                double num5 = Math.Atan2((double)(num3 - x), (double)(num4 - y));
                double num6 = 0.52359877559829882;
                double num7 = 8.0;
                Point point = new Point();
                Point point2 = new Point();
                Point point3 = new Point(num3, num4);
                point.X = num3 - ((int)(num7 * Math.Sin(num5 - num6)));
                point.Y = num4 - ((int)(num7 * Math.Cos(num5 - num6)));
                point2.X = num3 - ((int)(num7 * Math.Sin(num5 + num6)));
                point2.Y = num4 - ((int)(num7 * Math.Cos(num5 + num6)));
                GraphicsPath path = new GraphicsPath();
                Point[] points = new Point[] { point, point2, point3 };
                path.AddPolygon(points);            e.Graphics.FillPath(new SolidBrush(Color.Black), path);
            }
        }
      

  7.   

    在我的印象中、、貌似 画箭头、、、、两句代码就搞定了Pen p = new Pen(Color.Cyan,1);
    System.Drawing.Drawing2D.AdjustableArrowCap lineArrow =
    new System.Drawing.Drawing2D.AdjustableArrowCap(4, 4, true);
    p.CustomEndCap = lineArrow;
    g.DrawLine(p, StarPoint, EndPoint);