难题2:如何判断一点是否与一个圆的边相重合!?
怎样判断一个运动点是否与一个圆的边上的点任意点交互?
比如有一个点向一个方向运行,而这个方向上有一个圆,这个点肯定会运行经过这个圆,但当这个点经过这个圆的边,也就是当点与圆的边相交时报警,但如何判断是否相交?
问题点数:100、回复次数:12Top
1 楼EexeNet(Eexe.Net)回复于 2006-06-01 19:18:44 得分 20
加上半径来算的!
--------------------------------------------
Private Sub Command1_Click()
DrawWidth = 10
y = 2000
x = 2000
r = 840
For i = 5000 To 1 Step -1
Cls
Me.Circle (x, y), r
PSet (x, i), vbRed
If i < y + r Then
Exit For
Beep
End If
Next
End Sub
--------------------------------------Top
2 楼northwolves(狼行天下)回复于 2006-06-01 23:44:34 得分 80
一个例子,自认为还是比较形象的:
'添加一个新窗体,并拷入下面代码:
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private WithEvents timer1 As Timer
Dim laptime As Long
Private Sub Form_Load()
Me.Move 0, 0, 12000, 12000
Me.AutoRedraw = True
Me.ScaleMode = 1
Me.DrawWidth = 2
Set timer1 = Me.Controls.Add("vb.timer", "timer1", Me)
timer1.Enabled = True
timer1.Interval = 1
laptime = 0
Me.Circle (6000, 6000), 5000, vbRed
End Sub
Private Sub timer1_Timer()
laptime = laptime + 20
If laptime = Me.Width Then timer1.Enabled = False
Me.Caption = "点正在向右运动!"
Me.Circle (laptime, 3000), 20, vbYellow
If Abs((laptime - 6000) ^ 2 + (3000 - 6000) ^ 2 - 5000 ^ 2) < 100 Then
DoEvents
Me.Caption = "到达圆边界了!!"
Me.CurrentX = laptime - 20
Me.CurrentY = 3000 - 20
Me.ForeColor = vbBlue
Me.Print "*"
Sleep 3000 '延时3秒显示效果
End If
End Sub
Top
3 楼lxcy(始经天月照,终若流星驰!)回复于 2006-06-02 00:06:06 得分 0
运动点。。
判断点到圆心的距离Top
4 楼vansoft(Vansoft Workroom)回复于 2006-06-02 08:54:24 得分 0
同意樓上的,
已知二點,算直線長度而已.
如果二點距離=半徑,則……
二點為運動點和圓心點.Top
5 楼of123()回复于 2006-06-02 09:05:48 得分 0
一个点到圆心的距离等于半径,这个点就在圆上。
这里有两个问题:
1 如果你所用的数字系统是浮点数,就不要用相等判断,而用小误差判断。
2 如果你的点是用像素坐标表达的,还要考虑近似计算的问题。Top
6 楼mylanxin(蓝心)回复于 2006-06-02 13:56:04 得分 0
现在我们描述的是如果这个运动点的 x,y值都是变化的,而且是有初始角度,也就是说这个点是有方向的运动,那么在做点与圆交界的计算如引入角度的就会很复杂,请问简单的方法。Top
7 楼northwolves(狼行天下)回复于 2006-06-02 18:59:18 得分 0
道理是一样的,上面代码稍作修改可用于显示一条抛物线与圆的接近过程:
'添加一个新窗体,并拷入下面代码:
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private WithEvents timer1 As Timer
Dim laptime As Long
Private Sub Form_Load()
Me.Move 0, 0, 12000, 12000
Me.AutoRedraw = True
Me.ScaleMode = 1
Me.DrawWidth = 2
Set timer1 = Me.Controls.Add("vb.timer", "timer1", Me)
timer1.Enabled = True
timer1.Interval = 1
laptime = 0
Me.Circle (6000, 6000), 5000, vbRed
End Sub
Private Sub timer1_Timer()
laptime = laptime + 10
If laptime = Me.Width Then timer1.Enabled = False
Me.Caption = "点正在向右运动!"
Me.Circle (laptime, laptime ^ 2 / 10000), 20, vbYellow
If Abs((laptime - 6000) ^ 2 + (laptime ^ 2 / 10000 - 6000) ^ 2 - 5000 ^ 2) < 100000 Then
DoEvents
Me.Caption = "到达圆边界了!!"
Me.CurrentX = laptime - 20
Me.CurrentY = laptime ^ 2 / 10000 - 20
Me.ForeColor = vbBlue
Me.Print "*"
Sleep 3000 '延时3秒显示效果
End If
End Sub
Top
8 楼province_(雍昊)回复于 2006-06-02 20:07:05 得分 0
就计算点和园心的距离的平方好了,就不涉及浮点运算了。Top
9 楼mylanxin(蓝心)回复于 2006-06-06 18:50:02 得分 0
首先谢谢各位,特别是狼行天下 但这个方法好像也不行一样。
Sx = drX + (Vx * drAlpha) + 1 / 2 * (Ax * drAlpha ^ 2)'计算 sx的值
Sy = drY + (Vy * drAlpha) + 1 / 2 * (Ay * drAlpha ^ 2)'计算sy 的值
Me.PSet (Sx, Sy), RGB(2550, 2550, 0) '这是我点着的方法
而圆是在Timer事件里画的
Me.Circle (Me.Width / 2, Me.Height / 2), 2000, RGB(0, 255, 0)
我尝试用楼上各位的方法都没有成功。
Top
10 楼liuks(大胖胖)回复于 2006-06-06 19:04:08 得分 0
直接采用点的坐标到圆心距离来判断,因为你的坐标系统可能是自己定义的,而且可能采用了浮点方式,再加上你的点是运动的x和y都有一个递增的步长或者是解析方程,因此要采用小误差来取代完全相等,误差的大小取决于你定义的坐标系。即abs((x-xc)^2+(y-yc)^2-R^2)<Zero 时可以认为点在圆上,其中x和y为运动点的坐标,xc和yc为圆心坐标,R为圆半径,Zero为根据具体坐标系定义的可以接受的误差。Top
11 楼mylanxin(蓝心)回复于 2006-06-06 19:23:04 得分 0
我是这样做的,关键是这点的运动是会两次与这个圆的边交差,但我看了一下用这个公式计算的第一次和第二次交界时的值不相同,而且我觉得这个随着角度的变化,值也在变化的。Top
12 楼northwolves(狼行天下)回复于 2006-06-07 01:09:36 得分 0
首先谢谢各位,特别是狼行天下 但这个方法好像也不行一样。
Sx = drX + (Vx * drAlpha) + 1 / 2 * (Ax * drAlpha ^ 2)'计算 sx的值
Sy = drY + (Vy * drAlpha) + 1 / 2 * (Ay * drAlpha ^ 2)'计算sy 的值
Me.PSet (Sx, Sy), RGB(2550, 2550, 0) '这是我点着的方法
而圆是在Timer事件里画的
Me.Circle (Me.Width / 2, Me.Height / 2), 2000, RGB(0, 255, 0)
我尝试用楼上各位的方法都没有成功。
-------------------------------
设置SCALEMODE 一致Top




