Positions-Berechnung?
Übersicht

CO2ehemals "SirMO"Betreff: Positions-Berechnung? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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: 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 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Gehts um pixelgenau oder tatsächlich auf die Rechtecke genau? | ||
Gewinner der 6. und der 68. BlitzCodeCompo |
![]() |
ZEVS |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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: Schaubild 2: |
||
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 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Nova |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ü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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group