![]() |
#2
yuma2022-09-08 16:47
以下内容来自来MSDN手册,以下为原文复制粘帖:
画圆 Circle 方法可画出圆形和椭圆形的各种形状。另外,Circle 方法还可以画出圆弧(圆的一部分)和楔形饼块。使用变化的 Circle 方法,可画出多种曲线。 为了画圆,Visual Basic 需要给出该圆的圆心位置和它的半径。画一个理想圆的语法是: [object.]Circle [Step](x, y), radius[, color] 方括号表明 object 和 Step 关键字是任选项。如果不指定 object,则认为指定的就是当前的窗体。x 参数和 y 参数是圆心的坐标,radius 参数是圆的半径。例如,下面语句将画出一个以 (1200,1000) 为圆心、750 为半径的圆: Circle (1200, 1000), 750 这个语句产生的精确作用,还要依赖于窗体的大小和窗体的坐标系。如果不知道窗体的大小,也就不能知道这个圆是否可见。可使用绘图区的标尺属性,将该圆的圆心置于窗体的中心处: Circle ((ScaleWidth + ScaleLeft) / 2, (ScaleHeight + _ ScaleTop) / 2), ScaleWidth / 4 此时,关于 ScaleWidth 和 ScaleHeight 所有应知道的是,它们能帮助将图形定位于窗体的中心。 详细信息 在本章前面“改变对象的坐标系统”中详细讨论了 ScaleWidth 和 ScaleHeight 属性。 注意 圆的半径通常是按照水平单位来指定的。如果坐标系使用的水平单位和垂直单位是相同的话(按照缺省规定,应当这样),可以不用考虑单位问题。但如果使用的是自定义标尺,则水平单位和垂直单位可能对应不同的长度。上例中,半径是用水平单位来指定的,可以保证圆的实际高度和实际宽度相等。 Blanker 应用程序创建了一些圆圈,作为多彩地毯演示程序的一部分。该演示程序围绕窗体中心画出一系列虚线圆。这些圆看起来正好象一个编织成的圆形地毯。CircleDemo 过程使用下列语句,在多彩地毯演示程序中画圆: Sub CircleDemo () Dim Radius '将红色设置为随机数。 R = 255 * Rnd '将绿色设置为随机数。 G = 255 * Rnd '将蓝色设置为随机数。 B = 255 * Rnd '将 x 坐标设置在窗体中间。 XPos = ScaleWidth / 2 '将 y 坐标设置在窗体中间。 YPos = ScaleHeight / 2 '将半径设置在窗体高度的 0 到 50% 之间。 Radius = ((YPos * 0.9) + 1) * Rnd '用随机颜色画圆。 Circle (XPos, YPos), Radius, RGB(R, G, B) End Sub 多彩地毯演示程序的结果,显示在图 12.16 中。 图 12.16 Blanker 应用程序里的多彩地毯演示程序 只有本站会员才能查看附件,请 登录 画圆弧 为了用 Circle 方法画出圆弧,应以弧度为单位,给出定义弧线 start 和 end 的角度参数。画圆弧的语法是: [object.]Circle [Step](x, y), radius, [color], start, end[, aspect] 如果 start 参数或 end 参数是负数的话,Visual Basic 将画一条连接圆心到负端点的线。例如,下面的过程将用消除切片方式画出一个饼。 Private Sub Form_Click () Const PI = 3.14159265 Circle (3500, 1500), 1000, , –PI / 2, –PI / 3 End Sub 注意 将度换算成弧度的公式是将度数乘以 Pi/180。 |
Picture1.Circle (90, 100), 80, vbBlack, 0, 3.14
只有本站会员才能查看附件,请 登录
然后,计算圆弧上的每个坐标点,再用:
Picture1.PSet (X1, Y1), vbRed
设置该点的像素颜色为红色。
理论上,图像上应该不会显示出黑色的圆弧(都被红色覆盖了),要是计算精确的话,红色也不会画在其它地方,只能画在原黑色轨迹上。
请问,我应该如何精确计算,使坐标点完全重合原先的黑色圆弧,(数学水平太差了,三角函数把我搞蒙了)

Private Sub Command1_Click()
'错误的计算过程
Dim iColor As Long, P As Long, X1 As Long, Y1 As Long, Radius As Long
Dim CentrX As Long, CentrY As Long
Dim Pi As Double, Si As Double, Co As Double
Dim Radian As Double, Angle As Double, ArcLen As Double, Angle2 As Double
Pi = 3.1415926
With Picture1
.Cls
.BackColor = vbWhite
.ScaleMode = vbPixels
End With
Radius = 80
Angle = 180
CentrX = 90
CentrY = 100
Picture1.Circle (CentrX, CentrY), Radius, vbBlack, 0, 3.14
ArcLen = Angle * Pi * Radius / 180
Angle2 = (180 * 1) / (Pi * Radius)
ArcLen = Angle * Pi * Radius / 180
For P = 0 To Int(ArcLen)
Radian = (P * Angle2) * (Pi / 180)
Si = Sin(Radian)
Co = Cos(Radian)
X1 = CentrX - Radius * Co
Y1 = CentrY - Radius * Si
If Picture1.Point(X1, Y1) = vbBlack Then iColor = vbRed Else iColor = vbGreen
Picture1.PSet (X1, Y1), iColor
Next
End Sub
'错误的计算过程
Dim iColor As Long, P As Long, X1 As Long, Y1 As Long, Radius As Long
Dim CentrX As Long, CentrY As Long
Dim Pi As Double, Si As Double, Co As Double
Dim Radian As Double, Angle As Double, ArcLen As Double, Angle2 As Double
Pi = 3.1415926
With Picture1
.Cls
.BackColor = vbWhite
.ScaleMode = vbPixels
End With
Radius = 80
Angle = 180
CentrX = 90
CentrY = 100
Picture1.Circle (CentrX, CentrY), Radius, vbBlack, 0, 3.14
ArcLen = Angle * Pi * Radius / 180
Angle2 = (180 * 1) / (Pi * Radius)
ArcLen = Angle * Pi * Radius / 180
For P = 0 To Int(ArcLen)
Radian = (P * Angle2) * (Pi / 180)
Si = Sin(Radian)
Co = Cos(Radian)
X1 = CentrX - Radius * Co
Y1 = CentrY - Radius * Si
If Picture1.Point(X1, Y1) = vbBlack Then iColor = vbRed Else iColor = vbGreen
Picture1.PSet (X1, Y1), iColor
Next
End Sub
只有本站会员才能查看附件,请 登录
[此贴子已经被作者于2022-9-8 16:39编辑过]