|
Option Explicit
Public Function ProofLineCollision(ByVal L1_X1 As Single, _
ByVal L1_Y1 As Single, ByVal L1_X2 As Single, _
ByVal L1_Y2 As Single, ByVal L2_X1 As Single, _
ByVal L2_Y1 As Single, ByVal L2_X2 As Single, _
ByVal L2_Y2 As Single) As Boolean
'Anstiege
Dim L1_m As Single, L2_m As Single
'Schnittpunkte mit der Ordinatenachse
Dim L1_n As Single, L2_n As Single
'Schnittpunkt der Linien
Dim s As Single
'Hilfsvariablen für X- und Y- Werte
Dim h_Y As Single, h_X As Single
'X- und Y- Werte vertauschen, falls X2 < X1
'(nur ein Problem mathematischer Natur)
If L1_X2 < L1_X1 Then
SwitchVar L1_X1, L1_X2
SwitchVar L1_Y1, L1_Y2
End If
If L2_X2 < L2_X1 Then
SwitchVar L2_X1, L2_X2
SwitchVar L2_Y1, L2_Y2
End If
'X- und Y- Werte vertauschen, falls Y2 < Y1 und X1 = X2
If L1_X1 = L1_X2 And L1_Y2 < L1_Y1 Then
SwitchVar L1_X1, L1_X2
SwitchVar L1_Y1, L1_Y2
End If
If L2_X1 = L2_X2 And L2_Y2 < L2_Y1 Then
SwitchVar L2_X1, L2_X2
SwitchVar L2_Y1, L2_Y2
End If
'Beide Linien senkrecht
If L1_X1 = L1_X2 And L2_X1 = L2_X2 Then
'Prüfen, ob Linien aufeinanderliegen
ProofLineCollision = (L1_X1 = L2_X1 And _
((L1_Y1 >= L2_Y1 And L1_Y1 <= L2_Y2) Or _
(L2_Y1 >= L1_Y1 And L2_Y1 <= L1_Y2)))
Exit Function
End If
'Beide Linien waagerecht
If L1_Y1 = L1_Y2 And L2_Y1 = L2_Y2 Then
'Prüfen, ob Linien aufeinanderliegen
ProofLineCollision = (L1_Y1 = L2_Y1 And _
((L1_X1 >= L2_X1 And L1_X1 <= L2_X2) Or _
(L2_X1 >= L1_X1 And L2_X1 <= L1_X2)))
Exit Function
End If
'Nur eine der Linien ist senkrecht, die andere waagerecht
If L1_X1 = L1_X2 And L2_Y1 = L2_Y2 Then
ProofLineCollision = (L1_X1 >= L2_X1 And L1_X1 <= L2_X2 _
And L2_Y1 >= L1_Y1 And L2_Y1 <= L1_Y2)
Exit Function
'nochmal umgekehrt
ElseIf L1_Y1 = L1_Y2 And L2_X1 = L2_X2 Then
ProofLineCollision = (L1_Y1 >= L2_Y1 And L1_Y1 <= L2_Y2 _
And L2_X1 >= L1_X1 And L2_X1 <= L1_X2)
Exit Function
End If
'Eine Linie ist senkrecht, die andere ist diagonal
If L1_X1 = L1_X2 Then
'Anstieg und Schnittpunkt mit der Ordinatenachse für Linie2
L2_m = (L2_Y2 - L2_Y1) / (L2_X2 - L2_X1)
L2_n = L2_Y2 - L2_m * L2_X2
h_Y = L2_m * L1_X1 + L2_n
ProofLineCollision = (L1_X1 >= L2_X1 And L1_X1 <= L2_X2 _
And h_Y >= L1_Y1 And h_Y <= L1_Y2)
Exit Function
'nochmal umgekehrt
ElseIf L2_X1 = L2_X2 Then
'Anstieg und Schnittpunkt mit der Ordinatenachse für Linie1
L1_m = (L1_Y2 - L1_Y1) / (L1_X2 - L1_X1)
L1_n = L1_Y2 - L1_m * L1_X2
h_Y = L1_m * L2_X1 + L1_n
ProofLineCollision = (L2_X1 >= L1_X1 And L2_X1 <= L1_X2 And _
h_Y >= L2_Y1 And h_Y <= L2_Y2)
Exit Function
End If
'Eine Linie ist waagerecht, die andere ist diagonal
If L1_Y1 = L1_Y2 Then
'Anstieg und Schnittpunkt mit der Ordinatenachse für Linie2
L2_m = (L2_Y2 - L2_Y1) / (L2_X2 - L2_X1)
L2_n = L2_Y2 - L2_m * L2_X2
h_X = (L1_Y1 - L2_n) / L2_m
ProofLineCollision = (h_X >= L1_X1 And h_X <= L1_X2 And _
h_X >= L2_X1 And h_X <= L2_X2)
Exit Function
'nochmal umgekehrt
ElseIf L2_Y1 = L2_Y2 Then
'Anstieg und Schnittpunkt mit der Ordinatenachse für Linie1
L1_m = (L1_Y2 - L1_Y1) / (L1_X2 - L1_X1)
L1_n = L1_Y2 - L1_m * L1_X2
h_X = (L2_Y1 - L1_n) / L1_m
ProofLineCollision = (h_X >= L2_X1 And h_X <= L2_X2 And _
h_X >= L1_X1 And h_X <= L1_X2)
Exit Function
End If
'Wenn beide Linien diagonal sind...
'Anstieg und Schnittpunkt mit der Ordinatenachse für Linie1
L1_m = (L1_Y2 - L1_Y1) / (L1_X2 - L1_X1)
L1_n = L1_Y2 - L1_m * L1_X2
'Anstieg und Schnittpunkt mit der Ordinatenachse für Linie2
L2_m = (L2_Y2 - L2_Y1) / (L2_X2 - L2_X1)
L2_n = L2_Y2 - L2_m * L2_X2
'Linien sind eventuell parallel zueinander
If L2_m = L1_m Then
ProofLineCollision = _
(L1_m * L1_X1 + L1_n = L2_m * L1_X1 + L2_n And _
L1_X1 >= L2_X1 And L1_X1 <= L2_X2)
Exit Function
'Wenn nicht, Schnittpunkt errechnen
Else
s = (L1_n - L2_n) / (L2_m - L1_m)
End If
'Überprüfen, ob der Schnittpunkt innerhalb beider Linien liegt
ProofLineCollision = (s >= L1_X1 And s <= L1_X2 And _
s >= L2_X1 And s <= L2_X2)
End Function
'Dient zum Vertauschen von zwei Variablen
Public Sub SwitchVar(ByRef a As Single, ByRef b As Single)
Dim dummy As Long
dummy = a
a = b
b = dummy
End Sub
|
|