0xAA55 发表于 2014-6-8 16:14:03

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

原理是通过向量来计算。是二维平面的计算。可以轻松改为三维空间的射线与球的交点。(当然你也可以把它改成四维世界的射线与“球”的交点等。。。不不,应该不是球体了,而是一个比球还屌的东西,根据类比思想应该是无数个大小不同的球的合体吧。)

原理如图所示。
首先取得射线方向这个向量的单位向量。拿这个向量和射线端点到圆(球)心的向量做点乘,得到底下那条长的直角边。
接下来再用勾股定理算出最左边那条短的直角边,得到一个直角三角形。
然后,用勾股定理,借助圆(球)的半径,算出最底部最短的那个直角边的长度。
拿最长的直角边的长度减去最后算出的最短的直角边的长度就能得到射线与圆(球)的交点到射线端点的距离。
那么交点的坐标就可以通过射线端点的坐标加上射线方向的单位向量乘以最后算出的射线与圆(球)的交点到射线端点的距离算出。
以下是VB的实现代码。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
'             _____
'      _,-"~   ~"-,_
'   ,+~               ~+,
'   ,+"                   "+,
',"                     ",
' +                         +
' /                           \
'丨         圆心            丨
'|            *--------------+-------------=* 起点
'丨            \\_         丨      _,-"~
' \         直角边\\半径   /    _,-"~方向(单位向量)
' +               \   \_,+,-"~
'",               \   \*"交点
'   "+,          直角*,-"~,+"
'   ~+,               ,+~
'      ~"-,_   _,-"~
'             ~~~~~
Dim 起点到圆心X As Double, 起点到圆心Y As Double, 距离平方 As Double
起点到圆心X = 圆心X - 起点X
起点到圆心Y = 圆心Y - 起点Y
If 方向X * 起点到圆心X + 方向Y * 起点到圆心Y < 0 Then Exit Function '如果射线的方向背道而驰则退出
距离平方 = 起点到圆心X * 起点到圆心X + 起点到圆心Y * 起点到圆心Y

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

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

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

交点X = 起点X + 方向X * 交点到起点的距离
交点Y = 起点Y + 方向Y * 交点到起点的距离
射线与圆的相交点 = True
End Function

watermelon 发表于 2019-8-25 23:52:12

好帖没人顶?(易语言编程既视感~_~!

xiawan 发表于 2022-5-10 14:42:56


非常感谢~~支持~~~
页: [1]
查看完整版本: 【VB】VB写的计算射线与圆(球)的交点的程序