2013-11-04 229 views
0

我必须根据用户馈入的值生成下图。我如何着手绘制圆弧(B-C-F如图中的圆形),其起点为&终点(分别为B & F)&从段BF的高度?我可以做一些几何计算&得到半径&所有,但我如何绘制弧线?如何在VB.NET中绘制圆弧

enter image description here

我已经使用Graphics.DrawCurve()方法试过,但预期它不工作。我如何使这种方法适用于圆弧?任何其他解决方法也是受欢迎的。

+2

有什么错Graphics.DrawArc? http://msdn.microsoft.com/en-us/library/system.drawing.graphics.drawarc(v=vs.110).aspx – Mitch

+1

如果您已经计算出生成曲线所需的半径,则只需绘制整个与Graphics.DrawEllipse()一起旋转,但使用Graphics.SetClip()并使用点B和F作为边并传递一个矩形,然后使用高度C计算另外两个点。这会将整个圆剪切为仅可见的部分在那个矩形内。然后调用Graphics.ResetClip()并绘制其余的线。重复SetClip()技巧以在底部绘制曲线。 –

+0

@Idle_Mind你可以请你的评论作为答案。 @Mitch你可以稍微描述一下我怎么可以使用'DrawArc'来处理我的情况? PS - 我是VB.NET的新手 –

回答

2

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方法/改进的欢迎。

注 - 这不是我的代码中的实际功能。

+0

你不应该使用'CreateGraphics()'。相反,您的绘图应该在窗体的OnPaint覆盖中。 –

+0

你能否提供一些相同的学习资源链接?为什么它可以/更好?我是VB.NET的新手 –

+1

http://bobpowell.net/faqmain.aspx –

4

从我的评论:

如果你已经计算了必要的半径生成曲线,然后 只需战平Graphics.DrawEllipse()整圈,但使用 Graphics.SetClip()和通一个矩形,使用点B和F作为 侧,并使用高度C计算另外两个点。这将 将整个圆截断为仅在该矩形内可见的部分。 然后调用Graphics.ResetClip()并绘制其余的行。重复 SetClip()技巧也可以在底部绘制曲线。

这里的概念的用于通B,C,和F.

顶部曲线I使用唐娜罗伯茨在Investigative Circle Activity Using Three Points提供的式的证明。

以下是截图:

Partial Circle thru 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 
+0

我感谢你的努力,尽管'DrawArc'方法对我来说简单得多。谢谢! –