Dim pipe1_end() As Double
Dim pipe2_end() As Double
Dim difference() As Double
Dim intersection_angle As Double
Public Function is_origin(pipe1, pipe2)
d1 = {pipe1(3),pipe1(4),pipe1(5)}
d2 = {pipe2(3),pipe2(4),pipe2(5)}
For i = 0 To d1.Length - 1
For i = 0 To d2.Length - 1
pipe1_end = {pipe1(0),pipe1(1),pipe1(2)}
pipe1_end = {pipe1(0)+pipe1(3),pipe1(1)+pipe1(4),pipe1(2)+pipe1(5)}
pipe2_end = {pipe2(0),pipe2(1),pipe2(2)}
pipe2_end = {pipe2(0)+pipe2(3),pipe2(1)+pipe2(4),pipe2(2)+pipe2(5)}
Public Function intersect3D(pipe1, pipe2)
pipe_end = is_origin(pipe1,pipe2)
difference = {pipe2(0)-pipe1(0),pipe2(1)-pipe1(1),pipe2(2)-pipe1(2)}
If pipe1(3) = 0 And pipe2(3) = 0 Then
If d2(2)*d1(1)-d1(2)*d2(1) = 0 Then
s = -1*(difference(2)*d1(1)-d1(2)*difference(1))/(d2(2)*d1(1)-d1(2)*d2(1))
t = (difference(1)-d2(1)*s)/d1(1)
ElseIf pipe1(4) = 0 And pipe2(4) = 0 Then
If d2(2)*d1(0)-d1(2)*d2(0) = 0 Then
s = -1*(d1(0)*difference(2)-d1(2)*difference(0))/(d2(2)*d1(0)-d1(2)*d2(0))
t = (difference(0)-d2(0)*s)/d1(0)
ElseIf pipe1(5) = 0 And pipe2(5) = 0 Then
If d2(1)*d1(0)-d1(1)*d2(0) = 0 Then
s = -1*(difference(1)*d1(0)-d1(1)*difference(0))/(d2(1)*d1(0)-d1(1)*d2(0))
t = (difference(10)-d2(0)*s)/d1(0)
s = -1*(difference(2)*d1(1)-d1(2)*difference(1))/(d2(2)*d1(1)-d1(2)*d2(1))
t = (difference(1)-d2(1)*s)/d1(1)
point1 = {pipe1(0)+t*d1(0),pipe1(1)+t*d1(1),pipe1(2)+t*d1(2)}
point2 = {pipe2(0)+s*d2(0),pipe2(1)+s*d2(1),pipe2(2)+s*d2(2)}
intersection_angle = math.acos((d1(0)*d2(0)+d1(1)*d2(1)+d1(2)*d2(2))/((((d1(0)^2)+(d1(1)^2)+(d1(2)^2))^0.5)*(((d2(0)^2)+(d2(1)^2)+(d2(2)^2))^0.5)))
If ((point1(0)-point2(0))^2+(point1(1)-point2(1))^2+(point1(2)-point2(2))^2)^0.5 < 0.01 Then
len1 = ((d1(0)^2)+(d1(1)^2)+(d1(2)^2))^0.5 + ((pipe1_end(0)-point1(0))^2+(pipe1_end(1)-point1(1))^2+(pipe1_end(2)-point1(2))^2)^0.5 + pipe1(6)*Math.tan(intersection_angle/2)
len2 = ((d2(0)^2)+(d2(1)^2)+(d2(2)^2))^0.5 + ((pipe2_end(0)-point1(0))^2+(pipe2_end(1)-point1(1))^2+(pipe2_end(2)-point1(2))^2)^0.5 + pipe2(6)*Math.tan(intersection_angle/2)
ext1 = {pipe1(3)-len1*pipe1(3)/(((d1(0)^2)+(d1(1)^2)+(d1(2)^2))^0.5),pipe1(4)-len1*pipe1(4)/(((d1(0)^2)+(d1(1)^2)+(d1(2)^2))^0.5),pipe1(5)-len1*pipe1(5)/(((d1(0)^2)+(d1(1)^2)+(d1(2)^2))^0.5),len1*pipe1(3)/(((d1(0)^2)+(d1(1)^2)+(d1(2)^2))^0.5)-pipe1(3),len1*pipe1(4)/(((d1(0)^2)+(d1(1)^2)+(d1(2)^2))^0.5)-pipe1(4),len1*pipe1(5)/(((d1(0)^2)+(d1(1)^2)+(d1(2)^2))^0.5)-pipe1(5)}
ext2 = {pipe2(3)-len2*pipe2(3)/(((d2(0)^2)+(d2(1)^2)+(d2(2)^2))^0.5),pipe2(4)-len2*pipe2(4)/(((d2(0)^2)+(d2(1)^2)+(d2(2)^2))^0.5),pipe2(5)-len2*pipe2(5)/(((d2(0)^2)+(d2(1)^2)+(d2(2)^2))^0.5),len2*pipe2(3)/(((d2(0)^2)+(d2(1)^2)+(d2(2)^2))^0.5)-pipe2(3),len2*pipe2(4)/(((d2(0)^2)+(d2(1)^2)+(d2(2)^2))^0.5)-pipe2(4),len2*pipe2(5)/(((d2(0)^2)+(d2(1)^2)+(d2(2)^2))^0.5)-pipe2(5)}
For i As Integer = 0 To 2
If pipe1_end(i) <> pipe1(i) Then
ElseIf pipe2_end(i) <> pipe2(i) Then
Dim pipe1() As Double = {-1975.9373,333.457,-6369.0332,0,-95.9239,95.9239,2.54,1}
Dim pipe2() As Double = {-1975.9373,238.505,-6275.4558,0,0,114.4948,2.54,0}