惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
Martin Fowler
Martin Fowler
MongoDB | Blog
MongoDB | Blog
博客园 - Franky
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Microsoft Security Blog
Microsoft Security Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园_首页
腾讯CDC
D
Docker
The Cloudflare Blog
量子位
爱范儿
爱范儿
L
LangChain Blog
博客园 - 三生石上(FineUI控件)
博客园 - 司徒正美
aimingoo的专栏
aimingoo的专栏
Blog — PlanetScale
Blog — PlanetScale
Jina AI
Jina AI
Apple Machine Learning Research
Apple Machine Learning Research
Hugging Face - Blog
Hugging Face - Blog
博客园 - 聂微东
Vercel News
Vercel News
MyScale Blog
MyScale Blog

博客园 - 遗忘海岸

简协运动模拟 电磁场中的运动轨迹模拟 圆周运动模拟 带阻力的平抛运动 C# 队列的一些并发模拟 devexpress gridview master,detail视图 focuseRowHandle 同步选中 C# Tcp Server端实现,使用TcpListener 深信服务超融合管理Api调用 GDI+画工作流图的一些总结 绘制贝塞而曲线 devexpress schedulerControl Gantt View 使用 逻辑回归损失函数求导 matplotlim柱状图 匀加速运动模拟python,(matplotlib) C# 实现排列 python 类鸟群Boids C#动态编译 正太分布数据排序后分段数据的方差与标准差 Android 的一个通用列表单选AlertDialog封装
GDI+画直线带箭头
遗忘海岸 · 2024-05-13 · via 博客园 - 遗忘海岸

1.直线起前p0,终点p1, 那么向量<p0,p1> 为v0,  将v0转成单位向量并放大10个像素。

2.将v0乘以绕z轴旋转的变换矩阵,并同时做平移,得向量v2,v3

3.v1,v2直接作为p2,p3点并连接p2 p1,  p3,p1 

        /// <summary>
        /// 给定一线段坐标点
        /// 计算p1点两边箭头坐标点
        /// 左右按15度角偏转
        /// </summary>
        /// <param name="p0"></param>
        /// <param name="p1"></param>
        /// <returns></returns>
        public static PointF[] CalcArrowPoint(PointF p0, PointF p1)
        {
            var v1 = CalcVector(p1, p0);
            //计算单位向量
            var v1_1 = CalcUV(v1, 10.0d);//单位向量放大10个像素
            var c=0.9659d;//cos(15)
            var s=0.2588d; //sin(15)
            var  p_s=new PointF();
            p_s.X =(float)( c * v1_1.X - s * v1_1.Y + p1.X);
            p_s.Y =(float)( s * v1_1.X + c * v1_1.Y + p1.Y);

            //sin是奇函数要变符号
            var p_e = new PointF();
            p_e.X = (float)(c * v1_1.X + s * v1_1.Y + p1.X);
            p_e.Y = (float)(-s * v1_1.X + c * v1_1.Y + p1.Y);

            return new PointF[2] { p_s, p_e };


        }

        public static PointF TransCoordinate(PointF p,double theta,double x_offset=0,double y_offset=0 )
        {


                #region
      
                double[,] a =
            {
                {Math.Cos(theta),  -Math.Sin(theta)  ,0 ,x_offset },
                {Math.Sin(theta) ,  Math.Cos(theta)  ,0 ,y_offset },
                {0 ,                0                ,1 , 0},
                {0,                 0                ,0 ,1}

            };
               var  _M = DenseMatrix.OfArray(a);
                #endregion
        

            var B = DenseVector.OfEnumerable(new double[] { p.X, p.Y, 0,1});
            var C = _M.Multiply(B);
            return new PointF((float)C[0], (float)C[1]);
        }


            var g = pictureBox1.CreateGraphics();
            Console.WriteLine(pictureBox1.Width+","+ pictureBox1.Height);
            g.Clear(pictureBox1.BackColor);
            var rnd=new Random(Environment.TickCount);
            var x = rnd.Next(0, 700);
            var y = rnd.Next(0, 700);
            var p0 = new Point(x, y);
            var p1 = new Point(300, 300);
            var pen = new Pen(Color.Tan) { Width = 1 };
            //pen.EndCap = LineCap.ArrowAnchor;
            var pen2 = Pens.Red;
            g.DrawLine(pen, p0, p1);


            var pArr= Algorithm.CalcArrowPoint(p0, p1);


            g.DrawLine(pen2,pArr[0], p1);
            g.DrawLine(pen2,pArr[1], p1);

View Code

2.使用.net自带的样式

AdjustableArrowCap aac = new AdjustableArrowCap(2, 3);
pen1.CustomEndCap = aac;//定义线尾的样式为箭头
pen2.CustomEndCap = aac;