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);           

結果:image

 

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);           

 

結果:image

3,手動繪制

注意:代碼中應用了image,只用了其中的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});
 
結果:

image

 

手動繪制原理:

分為兩部分繪制:

image

繪制直線較為簡單,麻煩在繪制箭頭(多邊形)。

 

image

 

已知: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了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM