繪制箭頭
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,手動繪制
//線的起點
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了。