VB.NET保持在圈内线

时间:2012-09-27 11:30:34

标签: vb.net winforms

我想把我的线放在我的圈子里。

我的代码:

Public Class Form1

    Public Function pt(ByVal x As Integer, ByVal y As Integer, ByVal w As Integer, ByVal h As Integer)

        Dim b As Bitmap = New Bitmap(Me.Width, Me.Height)
        Dim g As Graphics = Graphics.FromImage(b)
        g.DrawEllipse(Pens.Black, New Rectangle(x, y, h, w))
        Me.BackgroundImage = b
        Dim S As New Size
        Dim loc As New Point
        S.Width = 4
        S.Height = 4
        loc.X = x + w / 2 - 1
        loc.Y = y + h / 2 - 1
        Dim ptMove As New Panel
        ptMove.Size = S
        ptMove.Location = loc
        ptMove.BackColor = Color.Aqua
        Dim ptC As New Panel
        ptC.Size = S
        ptC.Location = New Point(loc.X, loc.Y - h / 2)
        ptC.BackColor = Color.Red
        Me.Controls.Add(ptC)
        Me.Controls.Add(ptMove)
        line(1, ptMove, ptC) ' < -- Draw The Line Between Two Point (I want To Keep Ptc Inside The Circle
        Return True

    End Function
    Public Function line(ByVal w As Integer, ByVal pt1 As Panel, ByVal pt2 As Panel)
        Dim b As Bitmap
        b = Me.BackgroundImage
        Dim g As Graphics
        g = Graphics.FromImage(b)
        g.DrawLine(Pens.Black, pt1.Location, pt2.Location)
        Return True

    End Function

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim x, y, w, h As Integer
        x = 200
        y = 40
        w = 100
        h = 100
        pt(x, y, w, h)
    End Sub
End Class

结果:

enter image description here

有两点:

point 1
point 2

第2点:在圆圈的中心。

第1点:在圆圈的边缘。

假设我正在将第1点移动到新位置(例如0,0):

g.DrawLine(Pens.Black, new point(0,0) , pt2.Location)

结果:

enter image description here

该行已离开圈子

我想把这条线放在我的圈内。

如何将线(ptC面板)保持在圆的半径内?

1 个答案:

答案 0 :(得分:1)

您需要创建剪切区域或路径并在绘制线之前应用它:

Using g = Me.CreateGraphics()

    Using clip_path = New Drawing2D.GraphicsPath
        clip_path.AddEllipse(100, 100, 100, 100)

        g.DrawPath(Pens.Black, clip_path)
        g.SetClip(clip_path)

        g.DrawLine(Pens.Black, 0, 0, 150, 150)
    End Using

End Using

我在这里绘制了圆圈和直线,你可能想要删除对DrawPath的调用。