C# 画箭头
绘制箭头
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# 画箭头的更多相关文章
- 菱形实现气泡Bubble,菱形画箭头,菱形画三角形
菱形实现气泡Bubble,菱形画箭头,菱形画三角形 >>>>>>>>>>>>>>>>>>&g ...
- android 使用Canvas画箭头
public class MyCanvas extends View{ private Canvas myCanvas; private Paint myPaint=new Pai ...
- Swift实时画箭头的实现
iOS上实现画箭头,如果是指定了坐标点,那是很简单的,但如果需要做到实时绘制,就需要计算一下了 需求: 在白板上,根据手势落下点和移动点,实时绘制一条箭头直线(如下图) 实现代码: /// 获取箭头的 ...
- SVG 使用marker画箭头(一)
一.使用Marker画箭头 1.定义一个箭头的marker引用 <defs> <marker id='markerArrow' markerWidth='13' markerHeig ...
- WPF画箭头
简介 参考Using WPF to Visualize a Graph with Circular Dependencies的基础上写了一个WPF画箭头的库. 效果图如下: 使用的XAML代码如下: ...
- canvas画箭头demo
效果图: 代码: <!DOCTYPE html> <html> <title>canvas画箭头demo</title> <body> &l ...
- D2D画箭头的例子
原文:D2D画箭头的例子 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/sunnyloves/article/details/50830102 用处 ...
- 如何用CorelDRAW画箭头?
CorelDRAW,简称为cdr,是一款专业的矢量绘图软件,在设计界也是常用的专业设计之一,在日常的设计工作中,我们常常需要绘制一些特殊的图形,比如箭头.很多对cdr不是特别熟练的小伙伴不知道如何用c ...
- 在matlab 画箭头
[转载]在matlab 画箭头 原文地址:在matlab 画箭头作者:纯情小郎君 完整见链接http://www.mathworks.com/matlabcentral/fx_files/14056/ ...
- Workflow:采用坐标变换(移动和旋转)画箭头
背景 流程设计器的连线部分需要画一个箭头代表连接的方向,下图是期望的效果: 刚开始我准备采用三角函数(sin和cos)来计算三角的坐标,实现的过程真不爽(有兴趣的朋友可以试试),就在完工的时候,突然想 ...
随机推荐
- 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 ...
- Webx框架:Pipeline基本介绍
Pipeline. 它是管道的含义.一个管道阀门可以安装非常多.有许多可能的分支.它是用来控制页处理.它需要在被定义pipeline.xml文件.该文件是为每个阀的标签.该文件可以放一些简单的控制语句 ...
- Android blueZ HCI(一个):hciconfig实施和经常使用
关键词:hciconfighcitool hcidump笔者:xubin341719(欢迎转载,请明确说明,请尊重版权,谢谢.)欢迎指正错误,共同学习.共同进步! . Android blueZ H ...
- DRP-ThreadLocal简单的理解
简单就是jar一类套餐包.在一个简单的事情是一个工具类!该工具可以做?该工具被用来写多线程程序,行.多线程是有效的.你只能去网上找资料,由于今天我们仅仅来介绍ThreadLocal的知识. 我们来 ...
- 持续集成及部署利器:Go(不要和Google的编程语言Go混淆了!)
Go是一款先进的持续集成和发布管理系统,由ThoughtWorks开发.(不要和Google的编程语言Go混淆了!)其前身为CruiseControl,是ThoughtWorks在做咨询和交付交付项目 ...
- php如何去掉二维数组中重复的元素
$arr=array( "1"=>array("a","b "), "2"=>array("a&q ...
- 【Linux】samba服务
samba是一个实现不同操作系统之间文件共享和打印机共享的一种SMB协议的免费软件. ①Samba软件包的安装 使用源安装,在终端中输入如下命令: #sudo apt-get install samb ...
- 【Gerrit】Add a Member
add user email:XXXX@163.com username:XXXX( songfei) Add Step: System Server:1. ssh 服务器用户 ...
- Tobject 类解析
TObject = class //创建 constructor Create; //释放 procedure Free; //初始化实列 class functi ...
- [机器学习]Generalized Linear Model
最近一直在回顾linear regression model和logistic regression model,但对其中的一些问题都很疑惑不解,知道我看到广义线性模型即Generalized Lin ...