Gedrehte Rechteckskollision (mit Draw3D)

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

faeX

Betreff: Gedrehte Rechteckskollision (mit Draw3D)

BeitragFr, März 27, 2009 17:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Gegeben ist:
Arrow Positionen von Rechteck 1 und 2
Arrow Ausrichtung von Rechteck 1 und 2
Arrow Größe von Rechteck 1 und 2

Gesucht ist:
Arrow Ob eine Kollision vorhanden ist
Arrow (Wenn möglich) Kollisionspunkt

Wie lässt sich sowas realisieren?
Danke im Vorfeld Smile
 

Kruemelator

BeitragFr, März 27, 2009 18:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Testen ob sich zwei Kanten schneiden.

Hatte da mal eine Funktion geschrieben:
a,b,c,d sind Eckpunkte mit x,y Korrdinaten
Es wird geprüft ob sich die strecken ab und cd schneiden.
Bei der Funktion gibt es Probleme wenn Strecke senkrecht ist.

Vielleicht hilft es dir ja.

Code: [AUSKLAPPEN]
Function schnittpunkt(a0#,a1#,b0#,b1#,c0#,c1#,d0#,d1#)
m1# = (b1#-a1#)/(b0#-a0#)
m2# = (d1#-c1#)/(d0#-c0#)
b1# = a1#-(m1#*a0#)
b2# = c1#-(m2#*c0#)
x# = (b2#-b1#)/(m1#-m2#)
y# = m1# * x# + b1#


If (x# <= a0# And x# >= b0#) Or (x# >= a0# And x# <= b0#) Then
If (y# <= a1# And y# >= b1#) Or (y# >= a1# And y# <= b1#) Then
If (x# <= c0# And x# >= d0#) Or (x# >= c0# And x# <= d0#) Then
   schnitt = 1
EndIf
EndIf
EndIf
End Function

faeX

BeitragFr, März 27, 2009 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
das ich da nicht selbst draufgekommen bin??
linienkollisionen gibts zu hauf als source codes...
einfach nur die linien mit sin() und cos() ausrechnen, violà...
danke man Wink

EDIT: leichter gesagt als getan, hat jemand ne fertige routine die man includen kann? ich weiß das klingt sehr noobig, aber ich hab grad nen blackout Wink

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, März 27, 2009 21:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Die neue Draw3D2 hat bereits so eine Funktion eingebaut. Sie berücksichtigt das Bild bzw. Teilbild und jeweils dessen Drehung und Skallierung. Ich habe mal die Funktion für die Draw3D V.3.2 angepasst, und sollte nun so auch einsetzbar sein. Sie berücksichtig allerdings nicht den Alphachannel der Bilder. Es wird also keine Pixel/Texel -Kollision durchgeführt.

Code: [AUSKLAPPEN]
Function ImagesOverlap3D(FDrawHandleA%,FDrawXA#,FDrawYA#,FDrawAngleA#,FDrawScaleA#,FDrawHandleB%,FDrawXB#,FDrawYB#,FDrawAngleB#,FDrawScaleB#)
   
   
   
   
   ;FACEBANK(AUS)WEISUNGEN
   Local LDrawXRanA#=PeekFloat(GDrawBank,FDrawHandleA+DRAWBANKXSIZE)*FDrawScaleA
   Local LDrawYRanA#=PeekFloat(GDrawBank,FDrawHandleA+DRAWBANKYSIZE)*FDrawScaleA
   
   ;VARIABLENDEKLARATIONEN
   Local IDrawXA#[3]
   Local IDrawYA#[3]
   
   ;EXTRA/WINKELBERECHNUNG
   If FDrawAngleA<>0 Then
      
      ;SCHNELLE/UMRECHNUNG/VON: 'aMul'
      Local IDrawTCosA#=Cos(FDrawAngleA)
      Local IDrawTSinA#=Sin(FDrawAngleA)
      Local IDrawXPos1A#=LDrawXRanA*IDrawTCosA-LDrawYRanA*IDrawTSinA
      Local IDrawYPos1A#=LDrawYRanA*IDrawTCosA+LDrawXRanA*IDrawTSinA
      Local IDrawXPos2A#=LDrawXRanA*IDrawTCosA+LDrawYRanA*IDrawTSinA
      Local IDrawYPos2A#=LDrawYRanA*IDrawTCosA-LDrawXRanA*IDrawTSinA
   Else
      
      ;DIREKTE/DARSTELLUNG
      IDrawXPos1A=LDrawXRanA
      IDrawYPos1A=LDrawYRanA
      IDrawXPos2A=LDrawXRanA
      IDrawYPos2A=LDrawYRanA
   End If
   
   ;ECKENPOS/ZWISCHENSPEICHER
   IDrawXA[0]=FDrawXA-IDrawXPos1A
   IDrawYA[0]=FDrawYA+IDrawYPos1A
   IDrawXA[1]=FDrawXA+IDrawXPos2A
   IDrawYA[1]=FDrawYA+IDrawYPos2A
   IDrawXA[2]=FDrawXA+IDrawXPos1A
   IDrawYA[2]=FDrawYA-IDrawYPos1A
   IDrawXA[3]=FDrawXA-IDrawXPos2A
   IDrawYA[3]=FDrawYA-IDrawYPos2A
   
   ;FACEBANK(AUS)WEISUNGEN
   Local LDrawXRanB#=PeekFloat(GDrawBank,FDrawHandleB+DRAWBANKXSIZE)*FDrawScaleB
   Local LDrawYRanB#=PeekFloat(GDrawBank,FDrawHandleB+DRAWBANKYSIZE)*FDrawScaleB
   
   ;VARIABLENDEKLARATIONEN
   Local IDrawXB#[3]
   Local IDrawYB#[3]
   
   ;EXTRA/WINKELBERECHNUNG
   If FDrawAngleB<>0 Then
      
      ;SCHNELLE/UMRECHNUNG/VON: 'aMul'
      Local IDrawTCosB#=Cos(FDrawAngleB)
      Local IDrawTSinB#=Sin(FDrawAngleB)
      Local IDrawXPos1B#=LDrawXRanB*IDrawTCosB-LDrawYRanB*IDrawTSinB
      Local IDrawYPos1B#=LDrawYRanB*IDrawTCosB+LDrawXRanB*IDrawTSinB
      Local IDrawXPos2B#=LDrawXRanB*IDrawTCosB+LDrawYRanB*IDrawTSinB
      Local IDrawYPos2B#=LDrawYRanB*IDrawTCosB-LDrawXRanB*IDrawTSinB
   Else
      
      ;DIREKTE/DARSTELLUNG
      IDrawXPos1B=LDrawXRanB
      IDrawYPos1B=LDrawYRanB
      IDrawXPos2B=LDrawXRanB
      IDrawYPos2B=LDrawYRanB
   End If
   
   ;ECKENPOS/ZWISCHENSPEICHER
   IDrawXB[0]=FDrawXB-IDrawXPos1B
   IDrawYB[0]=FDrawYB+IDrawYPos1B
   IDrawXB[1]=FDrawXB+IDrawXPos2B
   IDrawYB[1]=FDrawYB+IDrawYPos2B
   IDrawXB[2]=FDrawXB+IDrawXPos1B
   IDrawYB[2]=FDrawYB-IDrawYPos1B
   IDrawXB[3]=FDrawXB-IDrawXPos2B
   IDrawYB[3]=FDrawYB-IDrawYPos2B
   
   ;VARIABLENDEKLARATIONEN
   Local IDrawXCenter#
   Local IDrawYCenter#
   
   ;QUADKOLLISION[A>B]/VORBEREITEN
   IDrawXCenter=(IDrawXA[0]+IDrawXA[1]+IDrawXA[2]+IDrawXA[3])*0.25
   IDrawYCenter=(IDrawYA[0]+IDrawYA[1]+IDrawYA[2]+IDrawYA[3])*0.25
   
   ;QUADKOLLISION/BERECHNEN+ANWENDEN
   If (IDrawYB[1]-IDrawYB[0])*(IDrawXCenter-IDrawXB[1])-(IDrawXB[1]-IDrawXB[0])*(IDrawYCenter-IDrawYB[1])>0 Then
      If (IDrawYB[2]-IDrawYB[1])*(IDrawXCenter-IDrawXB[2])-(IDrawXB[2]-IDrawXB[1])*(IDrawYCenter-IDrawYB[2])>0 Then
         If (IDrawYB[3]-IDrawYB[2])*(IDrawXCenter-IDrawXB[3])-(IDrawXB[3]-IDrawXB[2])*(IDrawYCenter-IDrawYB[3])>0 Then
            If (IDrawYB[0]-IDrawYB[3])*(IDrawXCenter-IDrawXB[0])-(IDrawXB[0]-IDrawXB[3])*(IDrawYCenter-IDrawYB[0])>0 Then
               Return True
            End If
         End If
      End If
   End If
   
   ;QUADKOLLISION[B>A]/VORBEREITEN
   IDrawXCenter=(IDrawXB[0]+IDrawXB[1]+IDrawXB[2]+IDrawXB[3])*0.25
   IDrawYCenter=(IDrawYB[0]+IDrawYB[1]+IDrawYB[2]+IDrawYB[3])*0.25
   
   ;QUADKOLLISION/BERECHNEN+ANWENDEN
   If (IDrawYA[1]-IDrawYA[0])*(IDrawXCenter-IDrawXA[1])-(IDrawXA[1]-IDrawXA[0])*(IDrawYCenter-IDrawYA[1])>0 Then
      If (IDrawYA[2]-IDrawYA[1])*(IDrawXCenter-IDrawXA[2])-(IDrawXA[2]-IDrawXA[1])*(IDrawYCenter-IDrawYA[2])>0 Then
         If (IDrawYA[3]-IDrawYA[2])*(IDrawXCenter-IDrawXA[3])-(IDrawXA[3]-IDrawXA[2])*(IDrawYCenter-IDrawYA[3])>0 Then
            If (IDrawYA[0]-IDrawYA[3])*(IDrawXCenter-IDrawXA[0])-(IDrawXA[0]-IDrawXA[3])*(IDrawYCenter-IDrawYA[0])>0 Then
               Return True
            End If
         End If
      End If
   End If
   
   ;VARIABLENDEKLARATIONEN
   Local IDrawACount%
   Local IDrawBCount%
   Local IDrawADrive%
   Local IDrawBDrive%
   Local IDrawLIA#
   Local IDrawLI1#
   Local IDrawLI2#
   
   ;ALLE[B]PRODUKTE
   For IDrawBCount=0 To 3
      IDrawBDrive=(IDrawBCount+1) Mod 4
      
      ;ALLE[A]PRODUKTE
      For IDrawACount=0 To 3
         IDrawADrive=(IDrawACount+1) Mod 4
         
         ;LINES/INTERSECTS/DURCHFÜHREN
         IDrawLIA=(IDrawXA[IDrawADrive]-IDrawXA[IDrawACount])*(IDrawYB[IDrawBDrive]-IDrawYB[IDrawBCount])-(IDrawXB[IDrawBDrive]-IDrawXB[IDrawBCount])*(IDrawYA[IDrawADrive]-IDrawYA[IDrawACount])
         IDrawLI1=((IDrawXB[IDrawBDrive]-IDrawXB[IDrawBCount])*(IDrawYA[IDrawACount]-IDrawYB[IDrawBCount])-(IDrawXA[IDrawACount]-IDrawXB[IDrawBCount])*(IDrawYB[IDrawBDrive]-IDrawYB[IDrawBCount]))/IDrawLIA
         IDrawLI2=((IDrawXA[IDrawADrive]-IDrawXA[IDrawACount])*(IDrawYA[IDrawACount]-IDrawYB[IDrawBCount])-(IDrawXA[IDrawACount]-IDrawXB[IDrawBCount])*(IDrawYA[IDrawADrive]-IDrawYA[IDrawACount]))/IDrawLIA
         If IDrawLI1=>0 And IDrawLI1=<1 And IDrawLI2=>0 And IDrawLI2=<1 Then Return True
      Next
   Next
   
   
   
   
End Function
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

faeX

BeitragFr, März 27, 2009 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
War ja klar das Hectic die Lösung bringt Wink
Danke Wink

faeX

Betreff: Performanceverbesserung

BeitragSa, Mai 02, 2009 22:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab noch 'ne Kleinigkeit in die Funktion eingebaut, die erst mit einer Kreiskollision prüft, ob die Bilder sich überhaupt überschneiden können:

Code: [AUSKLAPPEN]
   ;FACEBANK(AUS)WEISUNGEN
   Local LDrawXRanB#=PeekFloat(GDrawBank,FDrawHandleB+DRAWBANKXSIZE)*FDrawScaleB
   Local LDrawYRanB#=PeekFloat(GDrawBank,FDrawHandleB+DRAWBANKYSIZE)*FDrawScaleB
   
   ;ENTFERUNGUNGSRECHUNG VON: 'faeX'
   SA# = Sqr(LDrawXRanA*LDrawXRanA + LDrawYRanA*LDrawYRanA)
   SB# = Sqr(LDrawXRanB*LDrawXRanB + LDrawYRanB*LDrawYRanB)
   XDist# = FDrawXA-FDrawXB
   YDist# = FDrawYA-FDrawYB
   Dist# = Sqr(XDist*XDist + YDist*YDist)
   If Dist > (SA+SB) Then Return False
   
   ;VARIABLENDEKLARATIONEN
   Local IDrawXB#[3]
   Local IDrawYB#[3]


Kannst es ja rausnehmen wenn's zu unwürdig ist Wink
Nur als Anregung Smile

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group