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

推荐订阅源

S
Secure Thoughts
雷峰网
雷峰网
罗磊的独立博客
T
The Blog of Author Tim Ferriss
阮一峰的网络日志
阮一峰的网络日志
量子位
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
云风的 BLOG
云风的 BLOG
人人都是产品经理
人人都是产品经理
GbyAI
GbyAI
Cisco Talos Blog
Cisco Talos Blog
Engineering at Meta
Engineering at Meta
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
A
About on SuperTechFans
D
Darknet – Hacking Tools, Hacker News & Cyber Security
The Cloudflare Blog
Know Your Adversary
Know Your Adversary
T
Threat Research - Cisco Blogs
Spread Privacy
Spread Privacy
D
DataBreaches.Net
T
The Exploit Database - CXSecurity.com
K
Kaspersky official blog
Cyberwarzone
Cyberwarzone
爱范儿
爱范儿
U
Unit 42
Security Latest
Security Latest
M
MIT News - Artificial intelligence
月光博客
月光博客
Scott Helme
Scott Helme
G
Google Developers Blog
有赞技术团队
有赞技术团队
T
Tor Project blog
宝玉的分享
宝玉的分享
Y
Y Combinator Blog
博客园 - Franky
H
Hackread – Cybersecurity News, Data Breaches, AI and More
aimingoo的专栏
aimingoo的专栏
The GitHub Blog
The GitHub Blog
V
V2EX
B
Blog
Apple Machine Learning Research
Apple Machine Learning Research
S
Securelist
博客园 - 三生石上(FineUI控件)
Blog — PlanetScale
Blog — PlanetScale
TaoSecurity Blog
TaoSecurity Blog
Stack Overflow Blog
Stack Overflow Blog
P
Proofpoint News Feed
腾讯CDC
D
Docker
Google Online Security Blog
Google Online Security 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;