Seite 1 von 1

Linien Kollision 2d [erledigt]

Verfasst: 27.11.2007 23:41
von a14xerus
Ich habe ein Problem...
Sagen wirmal ich habe ein schwarzes Sprite.
Darauf ist eine LineXY in "nicht-schwarz"..
Jetzt kommt eine andere Linie die anhalten soll, sobald sie die erste Linie berührt.
Wie kann ich das machen??
mit Point geht es nicht, da pro frame mehrere Pixel übersprungen werden.
Danke im Voraus

Verfasst: 28.11.2007 00:22
von NicTheQuick
Das müsste eigentlich ganz einfach und exakt mit ein bisschen
Vektorrechnung gehen. Bin aber grad zu faul um mich da hinzusetzen.
Morgen vielleicht.

Ansonsten kann ich noch auf meine uralten Kollisionsroutinen verweisen:
Schnelle Kollisionsroutinen

Verfasst: 28.11.2007 02:19
von STARGÅTE
Jup genau, entweder dieser LINK da, kannst aber auch meine benutzen, extra für Strecke-Strecke-Kollision:

Code: Alles auswählen

;Vektorstruktur
Structure Vektor2D
 x.f
 y.f
EndStructure
;Strecke  |--|
Structure Strecke
 Position.Vektor2D
 Richtung.Vektor2D ; WICHTIG, damit wird auch die exakte länge der Strecke festgelegt
EndStructure 
;Punkt
Structure Punkt
 Position.Vektor2D
EndStructure

Procedure ParameterStrecke(*Strecke.Strecke,x,y,xx,yy)
 *Strecke\Position\x = x
 *Strecke\Position\y = y
 *Strecke\Richtung\x = xx
 *Strecke\Richtung\y = yy
EndProcedure

Procedure SchnittpunktStreckeStrecke(*Strecke1.Strecke, *Strecke2.Strecke, *Punkt.Punkt)
 u.f : o.f : i.f : j.f
 u = *Strecke1\Richtung\x * *Strecke2\Richtung\y - *Strecke1\Richtung\y * *Strecke2\Richtung\x
 If u
  o = (*Strecke2\Position\x - *Strecke1\Position\x) * *Strecke2\Richtung\y + (*Strecke1\Position\y - *Strecke2\Position\y) * *Strecke2\Richtung\x
  i = (o/u)
  If i>=0 And i<=1
   u = *Strecke2\Richtung\x * *Strecke1\Richtung\y - *Strecke2\Richtung\y * *Strecke1\Richtung\x
   o = (*Strecke1\Position\x - *Strecke2\Position\x) * *Strecke1\Richtung\y + (*Strecke2\Position\y - *Strecke1\Position\y) * *Strecke1\Richtung\x
   j = (o/u)
   If j >= 0 And j<=1
    *Punkt\Position\x = *Strecke1\Position\x + i * *Strecke1\Richtung\x
    *Punkt\Position\y = *Strecke1\Position\y + i * *Strecke1\Richtung\y
    ProcedureReturn 1   
   Else
    ProcedureReturn 0
   EndIf
  Else
   ProcedureReturn 0
  EndIf
 Else
  ProcedureReturn 0
 EndIf  
EndProcedure
Beispiel:

Code: Alles auswählen

Strecke1.Strecke
Strecke2.Strecke
ParameterStrecke(Strecke1, 0,0,100,100)
ParameterStrecke(Strecke2, 100,0,-100,100)
; Entspricht den Parametern von Line(x, y, Breite, Höhe [, Farbe]))

Punkt.Punkt
If SchnittpunktStreckeStrecke(Strecke1, Strecke2, Punkt)
 Debug "KOLLISION"
 Debug "bei ( "+StrF(Punkt\Position\x)+" | "+StrF(Punkt\Position\x)+" )"
Else
 Debug "KEINE Kollision"
EndIf

Verfasst: 28.11.2007 07:47
von a14xerus
ich gucks mir heute mittag mal genauer an und guck ob ichs verstehe.
Auf jedenfalls Danke schonmal :)