La difficulté avec VB.NET Liang-Barsky mise en œuvre
-
29-09-2019 - |
Question
Après quelques recherches, j'ai décidé d'utiliser le Liang-Barsky ligne d'écrêtage de l'algorithme dans mon jeu 2D.Google n'a pas rempli toutes les VB.NET les implémentations de l'algorithme, mais beaucoup C/++ ceux.Donc, comme j'ai des connaissances en C++, a décidé de port on a trouvé sur Skytopia au cours de VB.Net.Malheureusement, il ne fonctionne pas avec:
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
Je suis l'aide de la classe/méthode comme:
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
Cependant, l' CollideRay méthode échoue sur sa 3e bord itération (edge = 3), r < t0, par conséquent, la fonction renvoie la valeur false.
Je me demandais si quelqu'un peut apercevoir quelques problème avec mon CollideRay fonction qui aurait pour résultat de ce comportement, parce que je suis vraiment perplexe.
Merci à l'avance.
La solution
Le code suppose un système de coordonnées différent, note que topEdge est plus que bottomEdge dans les liens de la page web.Votre test fonctionne avec graphique normal coordonnées de l'endroit où le Fond est plus large que Haut.Vous devez permuter le bas et le haut des arguments.