找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 5080|回复: 2

【VB】VB写的计算射线与圆(球)的交点的程序

[复制链接]

1109

主题

1649

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
244
威望
743 点
宅币
24180 个
贡献
46222 次
宅之契约
0 份
在线时间
2294 小时
注册时间
2014-1-26
发表于 2014-6-8 16:14:03 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
原理是通过向量来计算。是二维平面的计算。可以轻松改为三维空间的射线与球的交点。(当然你也可以把它改成四维世界的射线与“球”的交点等。。。不不,应该不是球体了,而是一个比球还屌的东西,根据类比思想应该是无数个大小不同的球的合体吧。)
公式.GIF
原理如图所示。
首先取得射线方向这个向量的单位向量。拿这个向量和射线端点到圆(球)心的向量做点乘,得到底下那条长的直角边。
接下来再用勾股定理算出最左边那条短的直角边,得到一个直角三角形。
然后,用勾股定理,借助圆(球)的半径,算出最底部最短的那个直角边的长度。
拿最长的直角边的长度减去最后算出的最短的直角边的长度就能得到射线与圆(球)的交点到射线端点的距离。
那么交点的坐标就可以通过射线端点的坐标加上射线方向的单位向量乘以最后算出的射线与圆(球)的交点到射线端点的距离算出。
以下是VB的实现代码。
  1. Function 射线与圆的相交点(ByVal 起点X As Double, ByVal 起点Y As Double, ByVal 方向X As Double, ByVal 方向Y As Double, ByVal 圆心X As Double, ByVal 圆心Y As Double, ByVal 半径平方 As Double, 交点X As Double, 交点Y As Double) As Boolean
  2. '             _____
  3. '        _,-"~     ~"-,_
  4. '     ,+~               ~+,
  5. '   ,+"                   "+,
  6. '  ,"                       ",
  7. ' +                         +
  8. ' /                           \
  9. '丨           圆心            丨
  10. '|              *--------------+-------------=* 起点
  11. '丨              \\_         丨        _,-"~
  12. ' \         直角边\  \半径   /    _,-"~方向(单位向量)
  13. ' +               \   \_  ,+,-"~
  14. '  ",               \     \*"交点
  15. '   "+,          直角*,-"~,+"
  16. '     ~+,               ,+~
  17. '        ~"-,_     _,-"~
  18. '             ~~~~~
  19. Dim 起点到圆心X As Double, 起点到圆心Y As Double, 距离平方 As Double
  20. 起点到圆心X = 圆心X - 起点X
  21. 起点到圆心Y = 圆心Y - 起点Y
  22. If 方向X * 起点到圆心X + 方向Y * 起点到圆心Y < 0 Then Exit Function '如果射线的方向背道而驰则退出
  23. 距离平方 = 起点到圆心X * 起点到圆心X + 起点到圆心Y * 起点到圆心Y

  24. Dim 直角边长度平方 As Double, 方向所在直角边长度平方 As Double
  25. 方向所在直角边长度平方 = 平方(方向X * 起点到圆心X + 方向Y * 起点到圆心Y)
  26. 直角边长度平方 = 距离平方 - 方向所在直角边长度平方
  27. If 直角边长度平方 < 0 Or 直角边长度平方 > 半径平方 Then Exit Function

  28. Dim 退回的距离平方 As Double, 交点到起点的距离 As Double
  29. 退回的距离平方 = 半径平方 - 直角边长度平方
  30. If 退回的距离平方 < 0 Then Exit Function

  31. 交点到起点的距离 = Sqr(方向所在直角边长度平方) - Sqr(退回的距离平方)

  32. 交点X = 起点X + 方向X * 交点到起点的距离
  33. 交点Y = 起点Y + 方向Y * 交点到起点的距离
  34. 射线与圆的相交点 = True
  35. End Function
复制代码
算法.gif

本帖被以下淘专辑推荐:

回复

使用道具 举报

29

主题

315

回帖

1561

积分

用户组: 上·技术宅

UID
3808
精华
11
威望
105 点
宅币
702 个
贡献
165 次
宅之契约
0 份
在线时间
404 小时
注册时间
2018-5-6
发表于 2019-8-25 23:52:12 | 显示全部楼层
好帖没人顶?(易语言编程既视感~_~!
Passion Coding!
回复 赞! 靠!

使用道具 举报

1

主题

157

回帖

605

积分

用户组: 大·技术宅

UID
7535
精华
0
威望
0 点
宅币
447 个
贡献
0 次
宅之契约
0 份
在线时间
68 小时
注册时间
2021-10-16
发表于 2022-5-10 14:42:56 | 显示全部楼层

非常感谢~~支持~~~
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-3-29 18:00 , Processed in 0.044506 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表