0

ユーザーが入力した値に従って、次の図を生成する必要があります。始点と終点(それぞれBとF)とセグメントBFからの高さを指定して、円弧(図のようにBCF、本質的に円形)を描くにはどうすればよいですか?いくつかの幾何学的計算を行って半径を取得することはできますが、円弧を描くにはどうすればよいですか?

ここに画像の説明を入力

メソッドを使用してみましたGraphics.DrawCurve()が、期待どおりに動作しません。このメソッドを円弧で機能させるにはどうすればよいですか? 他の回避策も大歓迎です。

4

2 に答える 2

4

私のコメントから:

曲線を生成するために必要な半径を計算した場合は、単純に Graphics.DrawEllipse() で円全体を描画しますが、Graphics.SetClip() を使用し、点 B と F を辺として使用して四角形を渡し、他の 2 つを計算します。高さ C を使用してポイントします。これにより、円全体がその長方形内に表示されている部分だけにクリップされます。次に Graphics.ResetClip() を呼び出し、残りの線を描画します。SetClip() トリックを繰り返して、下部にも曲線を描画します。

これは、B、C、および F を通る上の曲線の概念実証です。

私は3 点を使用した調査サークル活動で Donna Roberts によって提供された式を使用しました。

スクリーンショットは次のとおりです。

3 点を通る部分円

...そしてそれを生成したコード:

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
于 2013-11-05T02:47:15.583 に答える
2

とった!ありがとう @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

提案/改善を歓迎します。

注 - これは私のコードの実際の関数ではありません。

于 2013-11-05T02:46:41.400 に答える