我試圖創建一個簡單的界面(如繪畫)來繪製幾個基本的形狀,如線,圓和弧。我已經找到了線條和圓圈,但是我很難獲得所需的弧線繪製效果。我現在在.NET中使用graphics.Draw...
方法,但可能願意嘗試不同的本機方法。繪製一個三點弧VB.NET
我期待創建用戶選擇起點,終點和「半徑」的功能。但是,我想讓這個「半圓」觸及這三點。 繼照片(取自應用程序)後,
Pt5
由用戶的三次點擊計算並設置弧的「半徑」。圖像描繪了圓的中心位於Pt4
,但理想情況下,中心將在邊緣處使用Pt1
和Pt2
進行計算。
一旦中心的計算,我想用它來創建弧的邊界(DrawArc(Pens.Black, CInt(Center.X - Radius), CInt(Center.Y - Radius), CInt(Radius * 2), CInt(Radius * 2), ?, ?)
)和由點Pt1
和Pt2
沿Pt1-Pt2
線的投影「腰斬」的圈子。
這裏是我的線/圈以上計算(對不起,冗長的問題...):
'' Pt1 and Pt2 are taken earlier
Dim pt3 As Point = e.Location
Dim pt4, pt5, pt10, pt11, Cntr As New Point
Dim m1, m2, m3, m4 As Double
Dim b1, b2, b3, b4, b5 As Double
Dim r As Double
'' Get center (midpoint)
pt4.X = ((pt1.X - pt2.X)/2) + pt2.X
pt4.Y = ((pt1.Y - pt2.Y)/2) + pt2.Y
'' Get picked-point slope
m1 = (pt2.Y - pt1.Y)/(pt2.X - pt1.X)
'' Inverse slope
m2 = -(1/m1)
'' Get picked-intercept
b1 = pt1.Y - (m1 * pt1.X)
'' Get perpendicular intercept
b2 = pt4.Y - (m2 * pt4.X)
'' Get parallel intercept
b3 = pt3.Y - (m1 * pt3.X)
''ln1: y = m1X + b1 ; (pt1, pt2)
''ln2: y = m2X + b2 ; (pt4, pt5)
''ln3: y = m1X + b3 ; (pt3, pt5)
'' pt5.X = (yInt1 - yInt2)/(slope1-slope2)
'' pt5.Y = (slope2 * pt5.X) + yInt2
pt5.X = ((b2 - b3)/(m1 - m2))
pt5.Y = (m2 * pt5.X) + b2
'' Get perpendicular slope between Pt1 and Pt5
m3 = -(1/(pt5.Y - pt1.Y)/(pt5.X - pt1.X))
'' Get perpendicular slope between Pt2 and Pt5
m4 = -(1/((pt5.Y - pt2.Y)/(pt5.X - pt2.X)))
'' Get perpendicular intercept between Pt1 and Pt5
b4 = pt1.Y - (m3 * pt1.X)
'' Get perpendicular intercept between Pt2 and Pt5
b5 = pt2.Y - (m4 * pt2.X)
Cntr.X = (b5 - b4)/(m3 - m4) '((m3 * m4 * ((pt1.Y - pt2.Y))) + (m4 * (pt1.X + pt5.X)) - (m3 * (pt5.X + pt2.X)))/(2 * (m4 - m3))
Cntr.Y = (m2 * Cntr.X) + b2
'' Calculate radius
r = Math.Sqrt(((pt5.Y - Cntr.Y)^2) + ((pt5.X - Cntr.X)^2))
我不明白用戶如何「挑選」通過點擊PT3半徑的中心。我假設你想把pt1-pt2作爲一個圓的和絃。 – Fruitbat
我猜半徑是錯誤的詞,但是。在點1,2和5之間應該有3個和絃。點5被構造爲Pt3到線Pt1-Pt2的Pt4的垂直線上的投影。因此,當用戶將鼠標移動到Pt3時,Pt5沿着垂直線Pt4-Pt5移動。對困惑感到抱歉。 – tbm0115