Gedrehte Rechteckskollision (mit Draw3D)
Übersicht

![]() |
faeXBetreff: Gedrehte Rechteckskollision (mit Draw3D) |
![]() Antworten mit Zitat ![]() |
---|---|---|
Gegeben ist:
![]() ![]() ![]() Gesucht ist: ![]() ![]() Wie lässt sich sowas realisieren? Danke im Vorfeld ![]() |
||
Kruemelator |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 ![]() |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
War ja klar das Hectic die Lösung bringt ![]() Danke ![]() |
||
![]() |
faeXBetreff: Performanceverbesserung |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Nur als Anregung ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group