我必須根據用戶饋入的值生成下圖。我如何着手繪製圓弧(B-C-F如圖中的圓形),其起點爲&終點(分別爲B & F)&從段BF的高度?我可以做一些幾何計算&得到半徑&所有,但我如何繪製弧線?如何在VB.NET中繪製圓弧
我已經使用Graphics.DrawCurve()
方法試過,但預期它不工作。我如何使這種方法適用於圓弧?任何其他解決方法也是受歡迎的。
我必須根據用戶饋入的值生成下圖。我如何着手繪製圓弧(B-C-F如圖中的圓形),其起點爲&終點(分別爲B & F)&從段BF的高度?我可以做一些幾何計算&得到半徑&所有,但我如何繪製弧線?如何在VB.NET中繪製圓弧
我已經使用Graphics.DrawCurve()
方法試過,但預期它不工作。我如何使這種方法適用於圓弧?任何其他解決方法也是受歡迎的。
Got it!感謝@米奇& @Idle_Mind
使用的Graphics
Friend Function draw_tank() As Boolean
' Create pen.
Dim blackPen As New Pen(Color.Black, 3)
' Create rectangle to bound ellipse.
Dim rect As New Rectangle(100, 100, 200, 200)
' Keeping the width & length same (200) we get a circle
' Create start and sweep angles on ellipse.
Dim startAngle As Single = 225.0F
Dim sweepAngle As Single = 90.0F
' Draw arc to screen.
Dim myarc As Graphics = Me.CreateGraphics
myarc.DrawArc(blackPen, rect, startAngle, sweepAngle)
Return True
End Function
建議內建DrawArc
方法/改進的歡迎。
注 - 這不是我的代碼中的實際功能。
你不應該使用'CreateGraphics()'。相反,您的繪圖應該在窗體的OnPaint覆蓋中。 –
你能否提供一些相同的學習資源鏈接?爲什麼它可以/更好?我是VB.NET的新手 –
http://bobpowell.net/faqmain.aspx –
從我的評論:
如果你已經計算了必要的半徑生成曲線,然後 只需戰平Graphics.DrawEllipse()整圈,但使用 Graphics.SetClip()和通一個矩形,使用點B和F作爲 側,並使用高度C計算另外兩個點。這將 將整個圓截斷爲僅在該矩形內可見的部分。 然後調用Graphics.ResetClip()並繪製其餘的行。重複 SetClip()技巧也可以在底部繪製曲線。
這裏的概念的用於通B,C,和F.
頂部曲線I使用唐娜羅伯茨在Investigative Circle Activity Using Three Points提供的式的證明。
以下是截圖:
...併產生它的代碼:
Public Class Form1
Private B As New Point(50, 100)
Private F As New Point(250, 100)
Private DistanceFromBF As Integer = 50
Private Sub Form1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
If B.Y = F.Y Then
Dim C As New Point(B.X + (F.X - B.X)/2, B.Y - DistanceFromBF)
Dim ctr As Point
Dim rad As Double
CircleFromPointsOnCircumference(B, C, F, ctr, rad)
Dim rc As New Rectangle(ctr, New Size(1, 1))
rc.Inflate(rad, rad)
e.Graphics.DrawRectangle(Pens.Black, rc)
Dim clip As New Rectangle(New Point(B.X, B.Y - DistanceFromBF), New Size(F.X - B.X, DistanceFromBF))
e.Graphics.SetClip(clip)
e.Graphics.DrawEllipse(Pens.Green, rc)
e.Graphics.ResetClip()
DrawPoint(B, e.Graphics, Color.Red)
DrawPoint(C, e.Graphics, Color.Red)
DrawPoint(F, e.Graphics, Color.Red)
DrawPoint(ctr, e.Graphics, Color.Green)
End If
End Sub
Private Sub DrawPoint(ByVal pt As Point, ByVal G As Graphics, ByVal clr As Color)
Dim rc As New Rectangle(pt, New Size(1, 1))
rc.Inflate(3, 3)
Using brsh As New SolidBrush(clr)
G.FillEllipse(brsh, rc)
End Using
End Sub
Private Sub CircleFromPointsOnCircumference(ByVal ptA As Point, ByVal ptB As Point, ByVal ptC As Point, ByRef Center As Point, ByRef Radius As Double)
Dim mR As Double = CDbl(ptA.Y - ptB.Y)/CDbl(ptA.X - ptB.X)
Dim mT As Double = CDbl(ptC.Y - ptB.Y)/CDbl(ptC.X - ptB.X)
Dim X As Double = (mR * mT * (ptC.Y - ptA.Y) + mR * (ptB.X + ptC.X) - mT * (ptA.X + ptB.X))/CDbl(2) * (mR - mT)
Dim Y As Double = CDbl(-1)/mR * (X - CDbl(ptA.X + ptB.X)/CDbl(2)) + (CDbl(ptA.Y + ptB.Y)/CDbl(2))
Center = New Point(X, Y)
Radius = Math.Sqrt(Math.Pow(ptA.X - Center.X, 2) + Math.Pow(ptA.Y - Center.Y, 2))
End Sub
End Class
我感謝你的努力,儘管'DrawArc'方法對我來說簡單得多。謝謝! –
有什麼錯Graphics.DrawArc? http://msdn.microsoft.com/en-us/library/system.drawing.graphics.drawarc(v=vs.110).aspx – Mitch
如果您已經計算出生成曲線所需的半徑,則只需繪製整個與Graphics.DrawEllipse()一起旋轉,但使用Graphics.SetClip()並使用點B和F作爲邊並傳遞一個矩形,然後使用高度C計算另外兩個點。這會將整個圓剪切爲僅可見的部分在那個矩形內。然後調用Graphics.ResetClip()並繪製其餘的線。重複SetClip()技巧以在底部繪製曲線。 –
@Idle_Mind你可以請你的評論作爲答案。 @Mitch你可以稍微描述一下我怎麼可以使用'DrawArc'來處理我的情況? PS - 我是VB.NET的新手 –