CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  基础类

难题2:如何判断一点是否与一个圆的边相重合!?

楼主mylanxin(蓝心)2006-06-01 18:30:24 在 VB / 基础类 提问

怎样判断一个运动点是否与一个圆的边上的点任意点交互?  
  比如有一个点向一个方向运行,而这个方向上有一个圆,这个点肯定会运行经过这个圆,但当这个点经过这个圆的边,也就是当点与圆的边相交时报警,但如何判断是否相交? 问题点数: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

相关问题

关键词

得分解答快速导航

  • 帖主:mylanxin
  • EexeNet
  • northwolves

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo