Linienschnitt - Findet meinen Fehler [gelöst]

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

n-Halbleiter

Betreff: Linienschnitt - Findet meinen Fehler [gelöst]

BeitragSo, Okt 16, 2011 0:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Morgen BBP!

Aktuell benötige ich eine Funktion, die Linienschnittpunkte erkennt (erkennt, sie muss nicht die Koordinaten ausrechnen), allerdings finde ich den Fehler in meinem Ansatz nicht. Ich möchte die Erkennung gerne über die Cramersche Regel ablaufen lassen.

Das LGS, das den Linienschnitt beschreibt, ist folgendes (DXn ist die Differenz der X-Koordinaten der nten Linie):

X1-X3 = -s * DX1 + t * DX2
Y1-Y3 = -s * DY1 + t * DY2

Mein Vorgehen ist:
Die Lösungskoeffizienten s und t über die Cramersche Regel bestimmen; liegen die beiden Werte jeweils zwischen 0 und 1, schneiden sich die Linien und meine Funktion gibt True zurück.

Nur versage ich schon seit längerem an der korrekten Bestimmung von s und t. An sich dürfte das kein Problem sein, wie im Wiki-Artikel ja auch beschrieben wird. Nur der Code haut nicht hin:
BlitzMax: [AUSKLAPPEN]
SuperStrict

Graphics(800,600,0)

Local G_Timer:TTimer=CreateTimer(50)

Local X1:Int,Y1:Int,X2:Int,Y2:Int,X3:Int,Y3:Int,X4:Int,Y4:Int
X1=200;Y1=100
X3=150;Y3=10
X4=150;Y4=200

Repeat

X2=MouseX()
Y2=MouseY()

DrawLine(X1,Y1,X2,Y2)
DrawLine(X3,Y3,X4,Y4)

DrawText(LinesIntersect(X1,Y1,X2,Y2,X3,Y3,X4,Y4),10,580)

DrawText("Punkt 1: "+X1+","+Y1,10,500)
DrawText("Punkt 2: "+X2+","+Y2,10,520)
DrawText("Punkt 3: "+X3+","+Y3,10,540)
DrawText("Punkt 4: "+X4+","+Y4,10,560)

Flip 0
WaitTimer(G_Timer)
Cls
Until (KeyHit(KEY_ESCAPE) Or AppTerminate())
End

Function LinesIntersect:Int(X1:Int,Y1:Int,X2:Int,Y2:Int,X3:Int,Y3:Int,X4:Int,Y4:Int)
Local DX1:Int=X2-X1,DX2:Int=X4-X3
Local DY1:Int=Y2-Y1,DY2:Int=Y4-Y3
Local DX:Int=X1-X3,DY:Int=Y1-Y3

Local Det:Int=DX2*DY1-DY2*DX1

If (Det<>0)
Local DetInv:Float=1.0/Float(Det)'Inverse of determinant of the system of linear equations given by the intersection of the two lines
Local DetS:Int=DX*DY2-DX2*DY
Local DetT:Int=DX*DY1-DX1*DY
Local s:Float=Float(DetS)*DetInv,t:Float=Float(DetT)*DetInv
DrawText("s="+s+" t="+t,10,480)
If ((0<=s) And (1>=s))
If ((0<=t) And (1>=t))
Return True
End If
End If
End If
Return False
End Function

(Code der Linienschnittfunktion (im Code unten) mit Testprogramm.)

Es wäre lieb, wenn ihr mir helfen könntet, ich finde einfach meinen Fehler nicht. Wink

EDIT: Code korrigiert, damit das Beispiel auch funktioniert.
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)
  • Zuletzt bearbeitet von n-Halbleiter am So, Okt 16, 2011 0:52, insgesamt einmal bearbeitet

mpmxyz

BeitragSo, Okt 16, 2011 0:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
DrawText(LinesIntersect(X1,Y1,X2,Y2,X3,Y3,X4,Y4),10,580)

Debugregel #1: Der Test ist Schuld! Wink
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

n-Halbleiter

BeitragSo, Okt 16, 2011 0:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Wow.. Ich bin platt, wie konnte ich das nur übersehen? ^^'

Vielen Dank!

Ich werde das jetzt noch korrigieren, ist immerhin noch eine ganz nette Funktion, die man mal gebrauchen kann.
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group