我正在尝试完成一个项目,在点击鼠标时,从点击的位置绘制200个圆圈作为中心点,从1个半径增大到200个。
我不需要帮助这个程序的鼠标部分。
我目前的障碍是看起来虽然在VB的早期版本中有圆圈方法,但VB.NET只使用System.CreateGraphics.DrawEllipse方法创建圆圈,此方法使用x和y坐标作为一个不可见矩形的左上角的起始位置,并使用另外两个整数/单个来决定向右和向下的距离(x +和y +),以确定圆的大小和位置。
我希望我只是缺少一种内置的方法来创建一个使用中心点的圆/省略号并从该中心点声明半径以完成我的程序。
有没有办法使用中心点作为参考点在FORM上绘制一个圆然后声明半径?
答案 0 :(得分:1)
基本上,您唯一需要做的就是减少半径的点的X
和Y
值,并使用半径* 2作为宽度和高度:
graphics.DrawEllipse(
pen, location.X - radius, location.Y - radius, radius * 2, radius * 2)
鉴于此,制作一个扩展方法非常容易,为您提供所需的界面:
Imports System.Runtime.CompilerServices
Module GraphicsExtensions
<Extension()>
Public Sub DrawCircle(ByVal graphics As Graphics, pen As Pen, location As Point, radius As Integer)
graphics.DrawEllipse(
pen, location.X - radius, location.Y - radius, radius * 2, radius * 2)
End Sub
End Module
...并以您的形式使用它:
Dim pos As Point = Me.PointToClient(MousePosition)
Using g As Graphics = Me.CreateGraphics()
g.DrawCircle(Pens.Black, pos, 15)
End Using
答案 1 :(得分:1)
我希望我只是缺少一种内置的创建方式 使用中心点并从中声明半径的圆/省略号 这个中心点是为了完成我的计划。
有没有办法使用中心点将圆形绘制到FORM上 参考点然后声明半径?
当然,只需在大小为(1,1)的位置创建一个Rectangle()并重复调用Inflate()方法:
Public Class Form1
Private Center As Point
Private MouseClicked As Boolean = False
Private Sub Form1_MouseDown(sender As Object, e As MouseEventArgs) Handles MyBase.MouseDown
If e.Button = Windows.Forms.MouseButtons.Left Then
MouseClicked = True
Center = New Point(e.X, e.Y)
Me.Refresh()
End If
End Sub
Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
If MouseClicked Then
Dim rc As New Rectangle(Center, New Size(1, 1))
For i As Integer = 1 To 200
e.Graphics.DrawEllipse(Pens.Black, rc)
rc.Inflate(1, 1)
Next
End If
End Sub
End Class
答案 2 :(得分:0)
如果您有中心点和半径,则可以轻松计算角点。 以下内容对您有帮助。
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
Dim centerX, centerY As Integer
Dim cornerX, cornerY As Integer
Dim radius As Integer
centerX = 100
centerY = 100
Dim i As Integer
For i = 20 To 200 Step 20
radius = i
cornerX = centerX - radius / 2
cornerY = centerY - radius / 2
e.Graphics.DrawEllipse(Pens.Black, cornerX, cornerY, radius, radius)
Next
End Sub