绘制箭头

 

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. C++异常处理入门

    引言 异常,让一个函数可以在发现自己无法处理的错误时抛出一个异常,希望它的调用者可以直接或者间接处理这个问题.而传统错误处理技术,检查到一个局部无法处理的问题时: 1.终止程序(例如atol,atoi ...

  2. 中英文对照 —— 互联网、IT(信息科技)、编程

    1. 网站 web-portal:门户网站: 2. 工具与方法 crowdsourcing:众包, crowd ⇒ 众: 3. 软件 MVP:最小化可行产品,Minimum Viable Produc ...

  3. EPI_H/EPI_V(边缘保持指数,matlab 矢量化编程)

    EPI: edge preservation index,衡量对原始图像的操作(目标图像)对图像边缘的保持能力. EPI_H:horizontal ,水平方向: EPI_V:vertical,垂直方向 ...

  4. JSONObject 解析

    前解析json已使用get方法,但是,假设抛出将解决很烦人中断. 今天发现JSONObject还提供了一个更好用的方法opt.看来以后文档还是要更加认真的读的.以下是文档中的原文. A JSONObj ...

  5. LeapMotion Demo2

    原文:LeapMotion Demo2    官方doc有四个手势,最近尝试实现对握拳的识别,并能在我的程序界面上体现出来.    调试过程较为繁琐,幸好最终效果还差强人意! 首先看看我的效果图:   ...

  6. WPF扩展标记X:STATIC

    原文:WPF扩展标记X:STATIC public class XStaic     {         public static string Content = "确定"; ...

  7. 图像滤镜艺术---PS图像转手绘特效实现方案

    原文:图像滤镜艺术---PS图像转手绘特效实现方案 手绘效果实现方案 本文介绍一种PS手绘效果的实现方案,PS步骤来自网络,本文介绍代码实现过程. 整体看来,虽然效果还是有很大差异,但是已经有了这种特 ...

  8. Win8 Metro(C#)数字图像处理--2.74图像凸包计算

    原文:Win8 Metro(C#)数字图像处理--2.74图像凸包计算 /// <summary> /// Convex Hull compute. /// </summary> ...

  9. eclipse 插件编写(一)

    由于项目开发进程中有一些重复性的代码进行编写,没有任何业务逻辑,粘贴复制又很麻烦且容易出错,故想起做一个eclipse插件来满足一下自己的工作需要,同时记录一下,以供以后参考与共同学习.本文主要讲解一 ...

  10. 『SHELL』--SHELL脚本执行方式(转)

    Shell脚本的执行方式: 注明:wd代表“脚本保存的目录” 1.fork 语法:/wd/shell.sh fork是最普通的, 就是直接在脚本里面用/wd/shell.sh来调用shell.sh这个 ...