Oval-kollision?? [erledigt]

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

feuerball11

Betreff: Oval-kollision?? [erledigt]

BeitragDo, Feb 19, 2009 16:36
Antworten mit Zitat
Benutzer-Profile anzeigen
gibt es eine möglichkeit, zu prüfen ob ein oval mit einem bestimmten punkt zusammenstöst?
pixelgenau natürlich....
ohne ein bild zu zeichnen... ich habe mein programm bis jetzt auf ohne bilder ausgelegt, und so hätte ich es gerne weiter......
  • Zuletzt bearbeitet von feuerball11 am Do, Feb 19, 2009 17:38, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragDo, Feb 19, 2009 16:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn der Abstand vom Mittelpunkt zum Zielpunkt kleiner ist als der Radius an dieser Stelle, findet eine Kollision statt.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

D2006

Administrator

BeitragDo, Feb 19, 2009 16:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja. Wie ich es machen würde:
  • mit Hilfe von ATan2 die Richtung des Punktes vom Mittelpunkt des Ovals aus ermitteln
  • den Abstand des Punktes zum Mittelpunkts des Ovals ermitteln (Satz des Pythagoras)
  • den Punkt errechnen, der bei dem errechneten Winkel den Linienpunkt des Ovals darstellt (mit Sin und Cos, allerdings mit unterschiedlichen Multiplikatoren, weil es ja ein Oval ist und kein Kreis.
  • den Abstand des errechneten Punktes zum Mittelpunkt berechnen
  • wenn der erste Abstand kleiner gleich dem zweiten ist --> Kollision!


(EDIT: Die Kurzfassung meines Beitrags ist in Form eines Beitrags von Xeres einem über diesen erhältlich. Very Happy)
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2
 

feuerball11

BeitragDo, Feb 19, 2009 16:51
Antworten mit Zitat
Benutzer-Profile anzeigen
der erste beitrag klingt am einfachsten...
en den zweiten beitrag.... es ist ein kreis, und mit atan und dem ganzen kram möchte ich noch nicht alzufiel zu tun haben... bin 14 und in der 8. klasse... das ist ein bissle zu viel... cosinus und sinus habe ich gerade so zur anwendung kapiert, was dehinter steckt aber immernochnicht.....

wie ermittel ich den abstand zweier punkte???

D2006

Administrator

BeitragDo, Feb 19, 2009 16:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Boar, sag doch, dass es ein Kreis ist.

Abstand von Punkt 1 zu Punkt 2:Code: [AUSKLAPPEN]
ab# = Sqr( (p1_x-p2_x)*(p1_x-p2_x) + (p1_y-p2_y)*(p1_y-p2_y))


Wenn der Abstand vom Mittelpunkt(!) des Kreises zum Punkt kleiner oder gleich dem Radius des Kreises ist, gibt's ne Kollision.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

Xeres

Moderator

BeitragDo, Feb 19, 2009 16:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Kollision ohne Mathematik wirst du nicht hinbekommen...
Wie D2006 schon schrieb: Satz des Pythagoras
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Holzchopf

Meisterpacker

BeitragDo, Feb 19, 2009 17:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Mennsch jetzt habe ich mir solche Mühe gegeben, ein Beispiel zu schreiben, das Oval-Kollision beschreibt und jetzt das. Egal - falls dein Kreis wirklich plötzlich Oval wird:

Code: [AUSKLAPPEN]
Graphics 800,600,0,2
SetBuffer BackBuffer()
Global TIMER=CreateTimer(60)

Local mx,my
Local x=400, y=300, w=200, h=30
While Not KeyDown(1)
   mx=MouseX()
   my=MouseY()
   
   Color 128,128,128
   If InOval( x, y, w, h, mx, my )
      Color 255,0,0
   EndIf
   Oval x-w/2, y-h/2, w, h
   
   Flip 0
   WaitTimer(TIMER)
Wend
End

Function InOval( pXPos, pYPos, pWidth, pHeight, pX, pY )
   Local lDiameterFactor# = pWidth /pHeight
   
   If Sqr( (pX- pXPos)^2 +( (pY- pYPos) *lDiameterFactor ) ^2 ) < pWidth /2 Return True
End Function


Das ganze beruht darauf, dass ein Oval nix anderes als ein gestauchter Kreis ist - also kann man auch hier den Satz des Pythagoras anwenden, wenn man dazu einfach diese Stauchung rückgängig macht (in dem man den Y-Abstand mit dem Verhältnis von Breite /Höhe multipliziert)
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

BtbN

BeitragDo, Feb 19, 2009 17:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Besser währe eventuell noch, wenn man anstatt
Code: [AUSKLAPPEN]
If Sqr( (pX- pXPos)^2 +( (pY- pYPos) *lDiameterFactor ) ^2 ) < pWidth /2 Return True

schreibt:
Code: [AUSKLAPPEN]
Local tval1# = (pX- pXPos)
Local tval2# = (pY- pYPos)*lDiameterFactor
If tval1*tval1 + tval2*tval2 < (pWidth*pWidth)/4 Return True


Das sollte schneller sein, weil man so nicht ^2 nehmen muss und keine Wurzel ziehen muss.
 

feuerball11

BeitragDo, Feb 19, 2009 17:28
Antworten mit Zitat
Benutzer-Profile anzeigen
habs. so gehts:

Code: [AUSKLAPPEN]
Graphics 400,400,0,2

SetBuffer BackBuffer()


Global oval_x=190
Global oval_y= 190
Global oval_size = 40


Repeat


Cls


Oval oval_x,oval_y,oval_size,oval_size
mx=MouseX()
my=MouseY()
ab# = Sqr( ( ( oval_x+oval_size/2 )-mx ) * ( ( oval_x+oval_size/2)-mx )  + ( ( oval_y+oval_size/2 )-my ) * ( (oval_y+oval_size/2)-my) )


If ab# < oval_size/2 Then
   Color 255,0,0
ElseIf ab# > oval_size/2 Then
   Color 255,255,255
EndIf

Text 10,10,ab#

Flip

Until KeyHit(1)


an BtbN und D2006 .... könnten ihr eure sachen evt (wens nicht zu viel ausmacht) erklären....[/code]

*edit* und an holzkopf: danke für die mühe...

BtbN

BeitragDo, Feb 19, 2009 17:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Wurzelziehen ist langsam, einen wert mit sich selbst multiplizieren geht da viel schneller. Deshalb lässt man die Wurzel meist weg und multipliziert stattdessen den vergleichs-wert mit sich selbst. Und ^2 ist auch langsamer als den Wert mit sich selbst zu multiplizieren.
 

feuerball11

BeitragDo, Feb 19, 2009 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
ich frage jetzt mal nicht weiter, warum das schneller geht.......
 

tobias12

BeitragDo, Feb 19, 2009 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
rechne mir mal die wurzel von 385 aus.
ist doch schwerer als z.b 12*8.
das ist der grund.
xD
Mein Projekteforum
 

feuerball11

BeitragDo, Feb 19, 2009 18:07
Antworten mit Zitat
Benutzer-Profile anzeigen
hm ok... eingesehen....

(tobias kenn ich auch einen in meiner schule... der schreibt nur 1 in matte..)
 

tobias12

BeitragDo, Feb 19, 2009 18:10
Antworten mit Zitat
Benutzer-Profile anzeigen
der bin ich sicher nicht, denn ich schreibe nur 5 er. (CH) ^^
Mein Projekteforum

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group