ユーザーが入力した値に従って、次の図を生成する必要があります。始点と終点(それぞれBとF)とセグメントBFからの高さを指定して、円弧(図のようにBCF、本質的に円形)を描くにはどうすればよいですか?いくつかの幾何学的計算を行って半径を取得することはできますが、円弧を描くにはどうすればよいですか?
メソッドを使用してみましたGraphics.DrawCurve()
が、期待どおりに動作しません。このメソッドを円弧で機能させるにはどうすればよいですか? 他の回避策も大歓迎です。
ユーザーが入力した値に従って、次の図を生成する必要があります。始点と終点(それぞれBとF)とセグメントBFからの高さを指定して、円弧(図のようにBCF、本質的に円形)を描くにはどうすればよいですか?いくつかの幾何学的計算を行って半径を取得することはできますが、円弧を描くにはどうすればよいですか?
メソッドを使用してみましたGraphics.DrawCurve()
が、期待どおりに動作しません。このメソッドを円弧で機能させるにはどうすればよいですか? 他の回避策も大歓迎です。
私のコメントから:
曲線を生成するために必要な半径を計算した場合は、単純に Graphics.DrawEllipse() で円全体を描画しますが、Graphics.SetClip() を使用し、点 B と F を辺として使用して四角形を渡し、他の 2 つを計算します。高さ C を使用してポイントします。これにより、円全体がその長方形内に表示されている部分だけにクリップされます。次に Graphics.ResetClip() を呼び出し、残りの線を描画します。SetClip() トリックを繰り返して、下部にも曲線を描画します。
これは、B、C、および F を通る上の曲線の概念実証です。
私は3 点を使用した調査サークル活動で Donna Roberts によって提供された式を使用しました。
スクリーンショットは次のとおりです。
...そしてそれを生成したコード:
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
とった!ありがとう @Mitch & @Idle_Mind
の組み込みDrawArc
メソッドを使用する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
提案/改善を歓迎します。
注 - これは私のコードの実際の関数ではありません。