绘制箭头

 

1,直接用平台库

Pen arrowPen = new Pen(Color.Blue);
           arrowPen.Width = 4;
           arrowPen.EndCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor;

Graphics gfx = this.pCanvas.CreateGraphics();
           gfx.DrawLine(arrowPen,
               5, 5,
               5, 100);

结果:

2,设置箭头样式

System.Drawing.Drawing2D.AdjustableArrowCap lineCap =
                new System.Drawing.Drawing2D.AdjustableArrowCap(6, 6, true);
            Pen redArrowPen = new Pen(Color.Red, 4);
            redArrowPen.CustomEndCap = lineCap;

Graphics gfx = this.pCanvas.CreateGraphics();
            gfx.DrawLine(redArrowPen,
                25, 5,
                25, 100);

结果:

3,手动绘制

注意:代码中应用了,只用了其中的Vector2

//线的起点

PointF startPt = new PointF(100, 300);

//线的终点

PointF endPt = new PointF(200, 200);

//箭头的宽

float width = 10;

//箭头夹角

double angle = 60.0 / 180 * Math.PI;

 

//求BC长度

double widthBE = width / 2 / (Math.Tan(angle / 2));

 

//直线向量

Vector2 lineVector = new Vector2(endPt.X - startPt.X, endPt.Y - startPt.Y);

//单位向量

lineVector.Normalize();

 

//求BE向量

Vector2 beVector = (float)widthBE * -lineVector;

 

//求E点坐标

PointF ePt=new PointF();

//ePt - endPt = bcVector

ePt.X = endPt.X + beVector.X;

ePt.Y = endPt.Y + beVector.Y;

 

//因为CD向量和AB向量垂直,所以CD方向向量为

Vector2 cdVector = new Vector2(-lineVector.Y, lineVector.X);

//求单位向量

cdVector.Normalize();

 

//求CE向量

Vector2 ceVector = width / 2 * cdVector;

//求C点坐标,ePt - cPt = ceVector;

PointF cPt = new PointF();

cPt.X = ePt.X - ceVector.X;

cPt.Y = ePt.Y - ceVector.Y;

 

//求DE向量

Vector2 deVector = width / 2 * -cdVector;

//求D点,ePt-dPt = deVector;

PointF dPt = new PointF();

dPt.X = ePt.X - deVector.X;

dPt.Y = ePt.Y - deVector.Y;

 

//开始绘制

Graphics gfx = this.pCanvas.CreateGraphics();

 

//绘制线

gfx.DrawLine(Pens.Blue, startPt, endPt);

//绘制箭头

//gfx.DrawPolygon(Pens.Green,

//    new PointF[]{

//        cPt,dPt,endPt});

gfx.FillPolygon(Brushes.Green,

    new PointF[]{

        cPt,dPt,endPt});

 
结果:

手动绘制原理:

分为两部分绘制:

绘制直线较为简单,麻烦在绘制箭头(多边形)。

已知:aP(A点坐标),bP(B点坐标),θ角(angle表示),CD长度width.

求:点C坐标,点D坐标。

解:

1,求出向量AB    abVector=bP-aP;,并且单位向量化。此时abVector代表了方向

2,BE的长度求解 widthBE= width / 2 / (Math.Tan(angle / 2)); (三角形BEC为直角三角形)。

3,求解向量BE     beVector = (float)widthBE * -abVector; (由长度和AB单位向量决定)。

4,求解E点坐标   eP – bP = beVector ,所以 eP = bP + beVector .

5,4中求出了E点坐标,如果能够求出向量CE和向量ED,那么点C和点D的坐标就知道了。

因为向量CD和向量AB垂直,所以向量CD为:

cdVector = ( –abVector.Y , abVector.X);

同时对cdVector 单位化,此时cdVector 代表了CD方向。

6,则CE向量:

ceVector = ceWidth*cdVector ;

则点C eP – cP = ceVector ; 即 cP = eP – ceVector

同理, dP =  eP – deVector;

7,此时求出了点 C和点D,加上点B可以构成一个Polygon了。

C# 画箭头的更多相关文章

  1. 菱形实现气泡Bubble,菱形画箭头,菱形画三角形

    菱形实现气泡Bubble,菱形画箭头,菱形画三角形 >>>>>>>>>>>>>>>>>>&g ...

  2. android 使用Canvas画箭头

    public class MyCanvas extends View{        private Canvas myCanvas;    private Paint myPaint=new Pai ...

  3. Swift实时画箭头的实现

    iOS上实现画箭头,如果是指定了坐标点,那是很简单的,但如果需要做到实时绘制,就需要计算一下了 需求: 在白板上,根据手势落下点和移动点,实时绘制一条箭头直线(如下图) 实现代码: /// 获取箭头的 ...

  4. SVG 使用marker画箭头(一)

    一.使用Marker画箭头 1.定义一个箭头的marker引用 <defs> <marker id='markerArrow' markerWidth='13' markerHeig ...

  5. WPF画箭头

    简介 参考Using WPF to Visualize a Graph with Circular Dependencies的基础上写了一个WPF画箭头的库. 效果图如下: 使用的XAML代码如下: ...

  6. canvas画箭头demo

    效果图: 代码: <!DOCTYPE html> <html> <title>canvas画箭头demo</title> <body> &l ...

  7. D2D画箭头的例子

    原文:D2D画箭头的例子 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/sunnyloves/article/details/50830102 用处 ...

  8. 如何用CorelDRAW画箭头?

    CorelDRAW,简称为cdr,是一款专业的矢量绘图软件,在设计界也是常用的专业设计之一,在日常的设计工作中,我们常常需要绘制一些特殊的图形,比如箭头.很多对cdr不是特别熟练的小伙伴不知道如何用c ...

  9. 在matlab 画箭头

    [转载]在matlab 画箭头 原文地址:在matlab 画箭头作者:纯情小郎君 完整见链接http://www.mathworks.com/matlabcentral/fx_files/14056/ ...

  10. Workflow:采用坐标变换(移动和旋转)画箭头

    背景 流程设计器的连线部分需要画一个箭头代表连接的方向,下图是期望的效果: 刚开始我准备采用三角函数(sin和cos)来计算三角的坐标,实现的过程真不爽(有兴趣的朋友可以试试),就在完工的时候,突然想 ...

随机推荐

  1. Qt Installer Framework 3.0.1 Released(功能比较强)

    We are happy to announce the release of Qt IFW 3.0.1. 3.0.1 is fully compatible with 2.0.5, which me ...

  2. Webx框架:Pipeline基本介绍

    Pipeline. 它是管道的含义.一个管道阀门可以安装非常多.有许多可能的分支.它是用来控制页处理.它需要在被定义pipeline.xml文件.该文件是为每个阀的标签.该文件可以放一些简单的控制语句 ...

  3. Android blueZ HCI(一个):hciconfig实施和经常使用

    关键词:hciconfighcitool  hcidump笔者:xubin341719(欢迎转载,请明确说明,请尊重版权,谢谢.)欢迎指正错误,共同学习.共同进步! . Android blueZ H ...

  4. DRP-ThreadLocal简单的理解

      简单就是jar一类套餐包.在一个简单的事情是一个工具类!该工具可以做?该工具被用来写多线程程序,行.多线程是有效的.你只能去网上找资料,由于今天我们仅仅来介绍ThreadLocal的知识. 我们来 ...

  5. 持续集成及部署利器:Go(不要和Google的编程语言Go混淆了!)

    Go是一款先进的持续集成和发布管理系统,由ThoughtWorks开发.(不要和Google的编程语言Go混淆了!)其前身为CruiseControl,是ThoughtWorks在做咨询和交付交付项目 ...

  6. php如何去掉二维数组中重复的元素

    $arr=array( "1"=>array("a","b "), "2"=>array("a&q ...

  7. 【Linux】samba服务

    samba是一个实现不同操作系统之间文件共享和打印机共享的一种SMB协议的免费软件. ①Samba软件包的安装 使用源安装,在终端中输入如下命令: #sudo apt-get install samb ...

  8. 【Gerrit】Add a Member

    add user email:XXXX@163.com             username:XXXX( songfei) Add Step: System Server:1. ssh 服务器用户 ...

  9. Tobject 类解析

    TObject = class    //创建    constructor Create;    //释放    procedure Free;    //初始化实列    class functi ...

  10. [机器学习]Generalized Linear Model

    最近一直在回顾linear regression model和logistic regression model,但对其中的一些问题都很疑惑不解,知道我看到广义线性模型即Generalized Lin ...