- Таким образом, ваша точка в трехмерном пространстве будет иметь вид трехмерного вектора из X, Y, Z начала координат 0,0,0?
Угол относительно какой линии?
- Перекрестное произведение даст вам перпендикулярную линию.
Function CrossProduct(ByVal b As Vector3d) As Vector3d
'cross product = (ay*bz - az*by, az*bx - ax*bz, ax*by - ay*bx)
Dim cp As New Vector3d
cp.x = y * b.z - z * b.y
cp.y = z * b.x - x * b.z
cp.z = x * b.y - y * b.x
Return cp
End Function
Function DotProduct(ByVal OtherVector As Vector3d) As Double
'calculate dot product of two vectors
Return x * OtherVector.x + y * OtherVector.y + z * OtherVector.z
End Function
Public Class Ray3d
Public Po As New Vector3d 'point of origin
Public V As New Vector3d 'vector
End Class
Public Class Plane3d
Public N As New Vector3d 'normal
Public PoP As New Vector3d 'point on plane
End Class
Private Function IntersectionTest(ByVal R As Ray3d, ByVal P As Plane3d, ByRef ReturnPoint As Vector3d) As Boolean
Dim RayDotPlaneNormal As Double = R.V.DotProduct(P.N)
If RayDotPlaneNormal = 0 for 1 sided
Return False 'no intersection
End If
'PLANE EQUATION PoP.N = d
Dim d As Double
Dim PopVector As Vector3d = P.PoP.ToVector3d
d = P.N.DotProduct(PopVector)
'INTERSECTION EQUATION
't = -(Po.N+d)/(V.N)
Dim PointOriginVector As Vector3d
PointOriginVector = R.Po.ToVector3d
Dim PointOriginDotPlaneNormal As Double
PointOriginDotPlaneNormal = P.N.DotProduct(PointOriginVector)
Dim t As Double
t = -(PointOriginDotPlaneNormal + d) / RayDotPlaneNormal
ReturnPoint.x = R.Po.x + R.V.x * t
ReturnPoint.y = R.Po.y + R.V.y * t
ReturnPoint.z = R.Po.z + R.V.z * t
Return True
End Function