Positions-Berechnung?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

CO2

ehemals "SirMO"

Betreff: Positions-Berechnung?

BeitragSa, Jul 21, 2012 13:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich habe ein Problem:

Ich habe 2 Objekte. Von beiden kenne ich die jeweilige X- und Y-Position sowie die Höhe und Breite. Beide Objekte haben eine eindeutige ID und ein Modell (TPixmap). Das eine Objekt (Obj. 1) kann bewegt werden, dass andere (Obj. 2) nicht. Obj. 1 bewegt sich in Pfeil-Richtung (roter Pfeil) und trifft auf Obj. 2.
Ich muss jetzt Startpunkt und Endpunkt des Blau gekennzeichneten Bereiches herausfinden.

Schaubild:
user posted image

Ich hoffe ihr könnt mir helfen
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Xeres

Moderator

BeitragSa, Jul 21, 2012 14:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich sehe keinen blauen Bereich, nur eine Linie.
Geht es nur um Kollisionserkennung oder was exakt willst du da berechnen?
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)

DAK

BeitragSa, Jul 21, 2012 15:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Gehts um pixelgenau oder tatsächlich auf die Rechtecke genau?
Gewinner der 6. und der 68. BlitzCodeCompo

ZEVS

BeitragSa, Jul 21, 2012 15:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Die X-Koordinaten von Anfangs- und Endpunkt ist der X-Wert von Obj.1 plus dessen Breite. Die Y-Koordinate des oberen Punktes ist die Y-Koordinate von Obj. 2. Die Y-Koordinate des unteren Punktes ist die Y-Koordinate von Obj. 1 plus dessen Höhe. Das finde ich trivial. Wolltest du das wissen?

ZEVS
 

CO2

ehemals "SirMO"

BeitragSa, Jul 21, 2012 21:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

@ Xeres:
Ja, es geht um Kollisionserkennung.

@ DAK:
Es müsste wenn dann Pixelgenau sein.

@ ZEVS:
Die Objekte können aber auch anders miteinander kollidieren, also könnte z.B.: Obj. 1 nicht so wie im Schaubild, sondern "von oben herab" mit Obj. 2 kollidieren.
Und es könnte genau so sein, dass Obj. 2 kleiner ist als Obj. 1, bzw. Obj. 1 so auf Obj. 2 trifft, dass ein Bereich genau in der "Mitte" von Obj. 1 getroffen wird.

Schaubild 1:
user posted image

Schaubild 2:
user posted image
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Xeres

Moderator

BeitragSa, Jul 21, 2012 21:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine Kollision findet also allgemein statt, wenn sich beide Rechtecke überschneiden.
Was ist das blaue, was du da noch extra berechnen willst?
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)

Nova

BeitragSa, Jul 21, 2012 22:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Er redet von einer Kollision, wie sie auch in der realen Welt erscheint. Zwei Dinge berühren sich, gehen aber nicht "ineinander". (Möglicherweise nennt man das ganze auch nicht Kollision, sondern nur "Berührung".) Und er möchte jetzt die Fläche (bzw. da es in zwei Dimensionen stattfindet: die Länge) berechnen, auf der sich die beiden Dinger berühren.
Ich verstehe nicht, wie man das ganze nicht durch die Bilder verstehen kann. Diese sind doch eindeutig. o_O
Wie man das ganze berechnet, weiß ich allerdings nichts. ^^
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit

Xeres

Moderator

BeitragSa, Jul 21, 2012 22:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Es kann zweifelsohne daran liegen, dass ich doof bin - aber CO2 schreibt nicht, was er zu erreichen bemüht ist, sondern, wie seine Objekte angeordnet sind.
Wenn eine Kollision stattfindet, setzt man die Rechtecke so weit zurück, dass sie nicht mehr überlappen - sollte kein unlösbares Problem sein.
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)
 

CO2

ehemals "SirMO"

BeitragSa, Jul 21, 2012 22:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Wenn eine Kollision stattfindet, setzt man die Rechtecke so weit zurück, dass sie nicht mehr überlappen


Es geht nicht darum, ob eine Kollision stattfindet, sondern wo sie stattfindet.
Ich brauche Pixelgenau den "Aufschlag". Ich stehe ein wenig auf dem Schlauch, da die Kollision an jeder seite des 1. Objektes passieren kann, und ich somit nicht genau weiß, welche Formel ich gerade brauche, um die Länge des Aufschlags zu berechnen.
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti
 

Boris1993

BeitragSa, Jul 21, 2012 23:41
Antworten mit Zitat
Benutzer-Profile anzeigen
ich mache sowas immer mit experimenten. hier würde ich in vereinfachter form zum beispiel erstmal mit ganz kleinen rechtecken wo ich selbst abzählen kann welche pixel sich berühren und leite mir dann aus verschiedenen verscuhen die formel her so kommt man am einfachsten drauf. ich hoffe ich konnte helfen Smile

Xeres

Moderator

BeitragSo, Jul 22, 2012 0:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Über die Koordinaten kannst du in jedem Fall herausfinden, von wo das Objekt kommt.
Im Prinzip musst du nur immer die richtigen Differenzen bilden. Am besten mit Stift & Papier ein paar Skizzen machen.
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)

Midimaster

BeitragSo, Jul 22, 2012 10:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst eines der beiden Rechtecke betrachten und dort für alle 4 Seiten einen eigenen Abcheck-Algo schreiben.

Fangen wir mit deinem ersten Beispiel im ersten Beitrag an: Die Linie rechts außen.

Es sei:
Code: [AUSKLAPPEN]
erstes Viereck: eX, eY, eB, eH
zweites Viereck: zX, zY, zB, zH
Berührungs Viereck: bX, bY, bB, bH


Eine Berührungslinie entsteht dann, wenn
Code: [AUSKLAPPEN]
IF (eX+eB) >= zX



Die X-Linien-Werte sind leicht zu erkennen:
Code: [AUSKLAPPEN]
bX=zX
bB=1


Die Y-Werte errechnen sich aus dem Minimum der Viereck-Y-Werte:

oberer Punkt:
Code: [AUSKLAPPEN]
If eY>=zY Then
     bY=eY
Else
     bY=zY
Endif


unterer Punkt etwas umständlicher zu berechnen:
Code: [AUSKLAPPEN]

local locY
If (eY+eH)<(zY+zH)
    locY=(eY+eH)
Else
     locY=(zY+zH)
Endif
bH=locY-bY


Und das machst Du jetzt auch für die anderen 3 Seiten... Fertig!
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

SpionAtom

BeitragSo, Jul 22, 2012 16:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Trifft das Thema nicht ganz, aber fast:

Code: [AUSKLAPPEN]
Graphics 800, 600, 0, 2
SetBuffer BackBuffer()

   Repeat   
      Cls
        Text 0, 0, Rechteckueberschneidung(350, 250, 100, 100, MouseX(), MouseY(), 250, 175)
      Flip()   
   Until KeyDown(1)
   End   

   
Function Rechteckueberschneidung(x1, y1, w1, h1, x2, y2, w2, h2)

   xn = max(x1, x2)
   yn = max(y1, y2)
   wn = min(x1 + w1, x2 + w2) - xn
   hn = min(y1 + h1, y2 + h2) - yn

   Color 255, 255, 0
   Rect xn, yn, wn, hn      
   Color 255, 255, 255
   Rect x1, y1, w1, h1, 0
   Rect x2, y2, w2, h2, 0

    Return wn > 0 And hn > 0
End Function

Function min(x, y)
   If x < y Then Return x Else Return y
End Function

Function max(x, y)
   If x > y Then Return x Else Return y
End Function


Ich will dir ja nicht den ganzen Spaß nehmen. Was du noch zu tun hättest, wäre die Seite herauszufinden, von der das Rechteck auf das andere stößst. Das ist aber nicht schwer herauszufinden, gerade wenn man weiß, in welche Richtung das Rechteck sich bewegt....
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group