Ärger mit VB.NET Liang-Barsky Implementierung
-
29-09-2019 - |
Frage
Nach einigen Recherchen habe ich beschlossen, die Liang-Barsky Linie Clipping-Algorithmus in meinem 2D-Spiel zu verwenden. Google hat auf allen VB.NET Implementierungen dieser Algorithmus nicht liefern, aber viel C / ++ diejenigen. Daher ist, wie ich Kenntnisse in C ++ haben, beschlossen, einen Port auf Skytopia gefunden über VB.Net. Leider ist es nicht funktioniert mit:
Public Class PhysicsObject
Public Function CollideRay(ByVal p0 As Point, ByVal p1 As Point, ByRef clip0 As Point, ByRef clip1 As Point) As Boolean
Dim t0 As Double = 0.0
Dim t1 As Double = 1.0
Dim xdelta As Double = p1.X - p0.X
Dim ydelta As Double = p1.Y - p0.Y
Dim p, q, r As Double
For edge = 0 To 3
' Traverse through left, right, bottom, top edges
If (edge = 0) Then
p = -xdelta
q = -(AABB.Left - p0.X)
ElseIf (edge = 1) Then
p = xdelta
q = (AABB.Right - p0.X)
ElseIf (edge = 2) Then
p = -ydelta
q = -(AABB.Bottom - p0.Y)
ElseIf (edge = 3) Then
p = ydelta
q = (AABB.Top - p0.Y)
End If
r = q / p
If p = 0 And q < 0 Then Return False ' Don't draw line at all. (parallel line outside)
If p < 0 Then
If r > t1 Then
Return False ' Don't draw line at all.
ElseIf r > t0 Then
t0 = r ' Line is clipped!
End If
ElseIf p > 0 Then
If r < t0 Then
Return False ' Don't draw line at all.
ElseIf r < t1 Then
t1 = r ' Line is clipped!
End If
End If
Next
clip0.X = p0.X + t0 * xdelta
clip0.Y = p0.Y + t0 * ydelta
clip1.X = p0.X + t1 * xdelta
clip1.Y = p0.Y + t1 * ydelta
Return True ' (clipped) line is drawn
End Function
Public AABB As Rectangle
End Class
Ich bin mit der Klasse / Methode wie:
Dim testPhysics As PhysicsObject = New PhysicsObject
testPhysics.AABB = New Rectangle(30, 30, 20, 20)
Dim p0, p1 As Point
p0 = New Point(0, 0)
p1 = New Point(120, 120)
Dim clip0, clip1 As Point
clip0 = New Point(-1, -1)
clip1 = New Point(-1, -1)
GlobalRenderer.Graphics.DrawLine(Pens.LimeGreen, p0, p1)
If testPhysics.CollideRay(p0, p1, clip0, clip1) Then
GlobalRenderer.Graphics.DrawLine(Pens.Magenta, clip0, clip1)
End If
Allerdings ist die CollideRay Methode scheitert an seiner Kante 3. Iteration (Kanten = 3), r Ich frage mich, ob jemand etwas Problem vor Ort kann mit meinem CollideRay Funktion, die in diesem Verhalten führen würde, denn ich bin gut und wirklich ratlos. Vielen Dank im Voraus.
Lösung
Der Code setzt voraus, ein anderes System koordinieren, beachten Sie, dass TOPEDGE ist größer als bottomEdge in der verknüpften Webseite. Ihr Test funktioniert mit normaler Grafik Koordinaten, wo Bottom größer als Top ist. Sie haben die untere und obere Argumente auszutauschen.