How can I find a 3-D vector that is perpendicular to another 3-D vector using RhinoScript?
The Rhino SDK's ON_3dVector::PerpendicularTo function that will do this. But since you are using RhinoScript, you will need to come up with your own method.
The following sample function is the RhinoScript equivalent to the ON_3dVector::PerpendicularTo SDK function.
' Description:
' Returns a 3-D vector that is perpendicular to another 3-D vector.
' Parameters:
' v - the 3-D vector to evaluate.
' Returns:
' A perpendicular 3-D vector if successful, Null otherwise.
' Remarks:
' The result is not a unitized 3-D vector.
'
Function GetPerpendicularVector( v )
GetPerpendicularVector = Null
If Not IsArray(v) Or UBound(v) <> 2 Then Exit Function
If Rhino.IsVectorZero(v) Then Exit Function
Dim i, j, k
Dim a, b
k = 2
If Abs(v(1)) > Abs(v(0)) Then
If Abs(v(2)) > Abs(v(1)) Then
' |v(2)| > |v(1)| > |v(0)|
i = 2
j = 1
k = 0
a = v(2)
b = -v(1)
ElseIf Abs(v(2)) >= Abs(v(0)) Then
' |v(1)| >= |v(2)| >= |v(0)|
i = 1
j = 2
k = 0
a = v(1)
b = -v(2)
Else
' |v(1)| > |v(0)| > |v(2)|
i = 1
j = 0
k = 2
a = v(1)
b = -v(0)
End If
ElseIf Abs(v(2)) > Abs(v(0)) Then
' |v(2)| > |v(0)| >= |v(1)|
i = 2
j = 0
k = 1
a = v(2)
b = -v(0)
ElseIf Abs(v(2)) > Abs(v(1)) Then
' |v(0)| >= |v(2)| > |v(1)|
i = 0
j = 2
k = 1
a = v(0)
b = -v(2)
Else
' |v(0)| >= |v(1)| >= |v(2)|
i = 0
j = 1
k = 2
a = v(0)
b = -v(1)
End If
Dim rc(2)
rc(i) = b
rc(j) = a
rc(k) = 0.0
GetPerpendicularVector = rc
End Function