首页 > 其他分享 >GDI+画直线带箭头

GDI+画直线带箭头

时间:2024-05-13 11:42:56浏览次数:26  
标签:直线 p1 PointF 箭头 float v1 new var GDI

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;

标签:直线,p1,PointF,箭头,float,v1,new,var,GDI
From: https://www.cnblogs.com/wdfrog/p/18188906

相关文章

  • react里面bind与箭头函数
    bind由于在类中,采用的是严格模式,所以事件回调的时候,会丢失this指向,指向undefined,需要使用bind来给函数绑定上当前实例的this指向;箭头函数的this指向上下文,所以永久能拿到当前组件实例,this指向,我们可以完美的使用箭头函数来替代传统事件处理函数的回调箭头函数class......
  • AutoCAD C# 两不平行直线倒圆弧算法
    参考的博客:https://www.cnblogs.com/JJBox/p/14300098.html下面是计算示例主要计算代码:varpeo=newPromptEntityOptions("选择直线1"){AllowNone=false,AllowObjectOnLockedLayer=false};peo.SetRejectMessage("请选择直线Line");p......
  • vue之箭头函数
    箭头函数定义箭头函数(将原函数的“function”关键字和函数名都删掉,并使用“=>”连接参数列表和函数体。):constddd=()=>{}:()参数;{}方法体,可以直接是返回的表达式1、箭头函数的使用定义函数的三种方式:<script>//箭头函数:也是一种定义函数的方式//1.定义函数的方式:functioncon......
  • vue箭头函数、js-for循环、事件修饰符、摁键事件和修饰符、表单控制、完整购物车版本
    【箭头函数】1<!DOCTYPEhtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<title>Title</title>6<scriptsrc="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">&l......
  • GDI++绘图问题
    截图--控件截图//control.CopyFromScreen//ok//RectanglerectangleBounds=pbx.Bounds;//Bitmapbit=newBitmap(rectangleBounds.Width,rectangleBounds.Height);//实例化一个和窗体一样大的bitmap//Graphicsg=Graphics.FromImage(bit);//......
  • Bresenham直线算法个人理解
    ​最近在学习野火的单片机的电容屏,顺便学习了一下屏幕的显示原理等内容,到了往屏幕中显示图像的时候遇到了一个算法,下面是我自己学习的一些笔记,该文章只是个人理解以及算法的简单实现,同时我在实现这个算法的时候并没有很好的考虑到算法的复杂度等条件,因此可能我自己算法的代码会相......
  • Occ求点到直线的距离
    计算一个点到2d基本曲线的距离使用这个类Extrema_ExtPElC2d。距离可以是最小或者最大。Extrema是极值的意思,P是point点,ELC是elementarycurve基本曲线。 点到直线的距离假设一个点Y和一条直线L   直线L的参数形式为$X(t)=P+t\overrightarrow{d} $ //......
  • win10完美去除小箭头
    win10完美去除小箭头1.去掉小箭头regadd"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIcons"/v29/d"%systemroot%\system32\imageres.dll,197"/treg_sz/ftaskkill/f/imexplorer.exeattrib-s-r-h"......
  • 根据经纬度判断直线距离
    /***根据门店距离排序*@param$data*@paramstring$longitude经度*@paramstring$latitude纬度*@returnarray*/publicfunctionsortByDistance($longitude,$latitude){//根据距离排序$list=Db::table('benben_store_shop')->where('status',1)-......
  • 混辗式混砂机 变速箱 旋耕灭茬机 污水处理 150T液压机 污水处理厂 饺子机 农村生活污
    UHT管式杀菌机说明书混辗式混砂机机械结构设计 论文CAD图纸开题报告毕业设计之专用机床图纸毕业设计推钢机液压图纸毕业设计3吨叉车3进3退变速箱(毕业设计)1G-160型旋耕灭茬机中央传动装置设计(共17张CAD加说明书与侧边传动装置配套污水处理课程设计图集150T液压机设计【10......