当前位置:编程学习 > C#/ASP.NET >>

C# 画直线带一个箭头 完成了大部分



水平和垂直的好弄,关键是任意角度的该怎么弄呢 


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

    }


--------------------编程问答-------------------- 不需要,可以绘制一个三角箭头,然后旋转,再绘制到画布上。 --------------------编程问答--------------------
引用 楼主 QQ81867376 的回复:
            //这是按照水平向左的方向画图的 ,现在要实现的是任意角度,关键的是p1,p2,p3坐标怎么算的呢, 
            //看着真的很简单,高中知识,可是我现在解二元二次方程, 搞的我头都大了,还是不能用starPointF,endPointF
计算机绘图中,这就好像是“加减乘除”一样是超级简单的入门知识。对于一系列点(Point[]),把它们平移、旋转,不过是矩阵右乘一个(或者连续多个、根据你需要多少个旋转和平移操作而定)简单的正方矩阵。

不论是线性代数还是计算机绘图,这个都是最入门的知识。完全谈不上有让任何技术。 --------------------编程问答-------------------- 不要自己瞎推理,要找对入门思路。 --------------------编程问答-------------------- 有自带的箭头为社么不用呢  在pen的属性里 --------------------编程问答-------------------- Graphic 对象已经帮你包装好了,
g.Rotate(),好像是这个 --------------------编程问答--------------------  平移 旋转  逆平移  
--------------------编程问答--------------------
引用 5 楼 assky124 的回复:
Graphic 对象已经帮你包装好了,
g.Rotate(),好像是这个


那种难看,的很 自己绘制之前就搜索了一下的, 试试代码,简直超级难看。 --------------------编程问答-------------------- Graphic 就可以 --------------------编程问答-------------------- 你的水平箭头画好了啊,旋转Graphic对象,就相当于你的头转下而已! --------------------编程问答-------------------- 呵呵,可以设置的,显示质量高点就好了,具体参数忘记了 --------------------编程问答-------------------- 撸主如果对图像有兴趣,还是应该先读一下《计算机图形学》这样入门的书籍。
能少走不少弯路节省很多瞎扯蛋的时间。 --------------------编程问答-------------------- 如果质量不好,设置g.SmoothingMode --------------------编程问答-------------------- 还是给解决掉了,基本满足要求,只是三角形我先给写死的,这个改下很简单了。

再也不去解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);
        }
    }

--------------------编程问答-------------------- 一点感慨,为什么现在的C#的人,不喜欢..... --------------------编程问答--------------------
引用 14 楼 QQ81867376 的回复:
一点感慨,为什么现在的C#的人,不喜欢.....


不喜欢蛋定,喜欢扁别人是吧? --------------------编程问答-------------------- 在我的印象中、、貌似 画箭头、、、、两句代码就搞定了

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);
--------------------编程问答-------------------- --------------------编程问答--------------------
引用 16 楼 crystal_lz 的回复:
在我的印象中、、貌似 画箭头、、、、两句代码就搞定了


都说了,你这难看死了还不信啊,如果我要三角形变一下呢,还是自己这个灵活。 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 18 楼 QQ81867376 的回复:
引用 16 楼 crystal_lz 的回复:在我的印象中、、貌似 画箭头、、、、两句代码就搞定了

都说了,你这难看死了还不信啊,如果我要三角形变一下呢,还是自己这个灵活。


重点是 我也不觉得比起你的我的就有有多丑、、

--------------------编程问答-------------------- 哈哈。。上面狠狠的抽了个大嘴巴。。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,