Click innerhalb eines 45° gekippten Rechtecks

K

kneitzel

Gast
Hallo,

ich habe heute irgendwie einen Hänger. Ich arbeite nebenbei an einem kleinen Spiel, bei dem ich ein 2D Spielfeld aufgebaut habe. Dieses ist aber um 45° gedreht, so dass es sozusagen auf einer Ecke steht.

Ich habe keinerlei Probleme, dieses Spielfeld graphisch darzustellen und die Flächen entsprechend der Notwendigkeiten zu füllen.

Aber jetzt würde ich auch gerne von einem Click auf das Feld kommen. Und da habe ich jetzt im Augenblick gewisse Probleme mit. Das müsste man ja durch eine einfache Transformation um 45° drehen können, so dass man dann wieder den einfachen Standard-Check machen kann.

Und wo ich grade so im Loch sitzt, da finde ich jetzt auch nicht einmal die übersichtlichen Tutorials zu diesen Themen, die es doch garantiert gibt (und die ich in der Vergangenheit ja auch schon gesehen habe).

Kann mir da evtl. grad jemand auf die Sprünge helfen? (Ansonsten schlafe ich da jetzt einfach einmal drüber und morgen wird sich das Problem dann bestimmt auch lösen lassen.)

Vielen Dank,

Konrad
 
K

kneitzel

Gast
Ich glaube, ich habe es jetzt doch alleine hin bekommen. Ich habe wohl einfach zuviel auf einmal gewollt, aber manchmal macht es Sinn, wirklich alles einfach nur sauber zu trennen und dann immer alles auszublenden, was nicht direkt hinein gehört.

a) Verschiebung, so dass der Nullpunkt zur wirklichen Nullpunkt wird. (Ist nicht ganz so wild, da man die Dreiecke auch so berechnen kann.
b) dann wirklich die Umrechnung von nur einem Punkt betrachten. Dreiecke einmalen, bekannte Winkel und schon geht es los mit Rechtwinkligen Dreiecken:
1) Was man zuerst braucht ist die Hypothenuse - die kann man direkt ausrechnen mit Wurzel aus x^2 + y^2.
2) Dann kann man einen Winkel berechnen über sin(alpha) = y/hypothenuse. Der Winkel ist aber auf der "falschen Seite", aber man hat da noch dass Alpha + Beta = 45° sein müssen.
3) Nun wird es einfach: sin(beta) = y'/Hypothenuse und cos(beta) = x'/Hypothenuse

Damit lassen sich dann alle Koordinaten des Systems umrechnen. Bei einem Mausclick muss dann nur der Mausclick umgerechnet werden und schon kann man die einfachen Vergleiche anwenden.

Falls es jemand interessiert kann ich die Bildchen dazu morgen noch einscannen und hier mit einbringen, so dass die Berechnungen mitverfolgt werden können.
 

Meniskusschaden

Top Contributor
Bin nicht sicher, ob es zu einer pragmatischen Lösung führt, aber vielleicht ist es einfacher, das Rechteck in zwei Dreiecke zu teilen und zu prüfen, ob eines den Punkt enthält. Für die Dreicksprüfung findet man ein paar Ansätze, z.B. dort:
https://prlbr.de/2014/liegt-der-punkt-im-dreieck/
https://www.amazingcode.de/ueberpruefen-ob-punkt-innerhalb-dreieck-mit-p5-js/
Ansonsten wäre die AWT-Klasse Polygon noch sehr bequem, weil sie bereits eine contains-Methode enthält. Weiß aber nicht, ob die performant genug ist.

EDIT: hat sich offenbar zwischenzeitlich erledigt. Vielleicht sind diese Ansätze trotzdem interessant.;)
 
K

kneitzel

Gast
Beide Ansätze sind auf jeden Fall interessant. Die Prüfung mit dem Dreieck werde ich mir auf jeden Fall auch einmal ansehen, denn das ist etwas, wo ich hier auch schon drüber sass und irgendwie nicht auf die Lösung gekommen bin.
Und auch die Polygon-Lösung ist prinzipiell interessant wenn man auf Einzelprüfungen zurück gehen muss (Hier würde ich dann immer das noch nicht geprüfte Spielfeld prüfen indem ich die Hälfte prüfe.)

Aber meine aktuelle Lösung ist das, was generell am günstigsten sein dürfte. Die Ausgangspunkte/-daten werden einmalig festgelegt und dann kann man bei einem Mausclick diesen einmal umrechnen und hat dann recht schnell das Feld (wenn ich die Breite eines Feldes habe, dann kann ich die X-Koordinate / Breite rechnen und bekomme das Feld in x-Richtung und das Gleiche in Y-Richtung. (Natürlich noch prüfen, ob die Werte im gültigen Bereich sind.) Das dürfte meines Wissens nach am schnellsten gehen. Hier wären dann maximal eine Optimierung denkbar, indem man von double auf integer wechselt und dann für die höhere Genauigkeit mit einem Faktor arbeitet. Muss man nur gut aufpassen, dass man alle Operationen richtig hat. Aber das kommt dann erst ganz am Ende.

Erster Schritt ist dann erst einmal, die ganzen Transformationen richtig zu haben, da ich ggf. ein großes Spielfeld habe und somit nur einen Ausschnitt bekomme. Der Ausschnitt ist dann evtl. noch vergrößert oder verkleinert. Das muss ich erst einmal so im Code unterbringen, dass es auch wirklich gut lesbar ist und ich das auch in 2 Jahren noch auf Anhieb verstehe :)
 

thecain

Top Contributor
Du kannst doch einfach den Punkt um 45° rotieren und dann die normale Berechnung machen, als ob es nicht gedreht wäre (nachdem du den Nullpunkt zum Nullpunkt gemacht hast, wie du schriebst.)

also
Code:
float xnew = p.x * cos(45) - p.y * sin(45);
float ynew = p.x * sin(45) + p.y * cos(45);
 
K

kneitzel

Gast
@thecain: Super. Danke. Sogar von der Berechnung her noch etwas einfacher als meine hergeleiteten Dreiecke. Genau das hab ich eigentlich die ganze Zeit gesucht. Etwas in der Art hatte ich in Erinnerung und konnte es mir einfach nicht mehr herleiten!

@JCODA: Super. Noch eine Sache, die ich mir später im Detail ansehen werde. Man weiss ja nie, wann man das dann braucht.

Vielen Dank für eure Unterstützung!
 

mariane

Mitglied
Schaue dir mal die Polygone an (mit Rechtecken gehts aber auch, Polygone sind nur flexibler). Dann einfach nur die Methode contains verwenden, also polygon.contains( p ), p ist ein Punkt, z.B. die Position deines Mausklicks (mousePressed (e) mit p = e.getPoint()). Ist der Punkt innerhalb des Polygons, dann true, sonst false.

LG mariane
 

Thallius

Top Contributor
Kannst du nicht deine gesammte Berechnung und Spielemechanik einfach auf ein "normales" Rechteck machen und nur für die Ausgabe das Ganze um 45° drehen?
 
K

kneitzel

Gast
Danke für eure Ideen.
@mariane: Wäre auch eine Idee, aber dann sind viele Polygone einzeln zu prüfen. Aber die Logik für die Berechnung, in welches Kästchen geklickt wurde, habe ich ja jetzt.
@Thallius: Ja, so habe ich es ja. Nur eben musste ich ja die Mausklicks zurück rechnen können auf das jeweilige Kästchen. Aber das habe ich ja über die Rückrechnung der Drehung hinbekommen.

Vielen Dank für eure Unterstützung.

Mit den besten Grüßen,

Konrad
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Programmierung eines 2.5D Point&Click Adventures ohne Spieleengine machbar? Spiele- und Multimedia-Programmierung 14
M Point & Click Thread Probleme Spiele- und Multimedia-Programmierung 20
S Mausklicks innerhalb eines JFrames/SWTBrowser ohne richtige Maus simulieren Spiele- und Multimedia-Programmierung 6
M Rechteck erkennung innerhalb einer Matix Spiele- und Multimedia-Programmierung 4
N Bildposition innerhalb eines anderen Bildes ermitteln Spiele- und Multimedia-Programmierung 2
N Seltsame Exception bei Code eines Spiele-Tutorials Spiele- und Multimedia-Programmierung 6
R Ideen für die Backend-Entwicklung eines Games gesucht Spiele- und Multimedia-Programmierung 8
A Programmieren eines Memorys mit Java (in Eclipse) Spiele- und Multimedia-Programmierung 5
T Position eines Image verändern mithilfe eines Timers Spiele- und Multimedia-Programmierung 6
J LibGdx_3D: Klamotten eines Charakters modifizieren Spiele- und Multimedia-Programmierung 2
K Erstellen eines Fotoalbums mit Java Spiele- und Multimedia-Programmierung 8
R Fehler beim Laden eines 2D-Bildes Spiele- und Multimedia-Programmierung 3
L OpenGL TransformationMatrix eines Flugzeugs Spiele- und Multimedia-Programmierung 2
M Programmierung eines "Fantasy Rollenspiels" Spiele- und Multimedia-Programmierung 5
E Laufanimation eines Sprites Spiele- und Multimedia-Programmierung 6
Finalspace Entwicklung eines Jump & Run Spiels Video-Tutorial Spiele- und Multimedia-Programmierung 12
T Hintergrundmusik eines Spiels mit Hilfe von JLayer Spiele- und Multimedia-Programmierung 12
M Cylinder anhand eines Vektors ausrichten (Java3d) Spiele- und Multimedia-Programmierung 0
M bewegen eines Objektes Spiele- und Multimedia-Programmierung 2
U Hilfe bei Implementierung eines PointSounds in Java3D Spiele- und Multimedia-Programmierung 1
gamebreiti Index eines Elements einer ArrayList abfragen Spiele- und Multimedia-Programmierung 1
X "Rebuffen" - Messen der Zeit eines Timers Spiele- und Multimedia-Programmierung 3
S Design eines Schachspiels Spiele- und Multimedia-Programmierung 3
F Programmierung eines Bots Spiele- und Multimedia-Programmierung 23
A Wann ist ein Punkt inerhalb eines Polygons? Spiele- und Multimedia-Programmierung 2
F LWJGL Problem mit Erstellen eines Objekts und der Kamera Spiele- und Multimedia-Programmierung 5
R Drehen eines Bildes relativ zur Mauszeigerposition Spiele- und Multimedia-Programmierung 2
M Pattern zur Auswahl eines Objektes anhand vieler Kriterien Spiele- und Multimedia-Programmierung 2
H Skalierung eines Polygons ohne das es verschoben wird Spiele- und Multimedia-Programmierung 3
R Triangulation eines komplexen Polygons Spiele- und Multimedia-Programmierung 4
L Lwjgl Darstellung eines Kreises im Raum Spiele- und Multimedia-Programmierung 3
M Pixel eines BufferedImage bearbeiten (Performance) Spiele- und Multimedia-Programmierung 23
G Rotieren eines Objekts (2D) Spiele- und Multimedia-Programmierung 8
F nur Ausschnitt eines Image zeichnen Spiele- und Multimedia-Programmierung 9
S Umfang eines Polygons erzeugen Spiele- und Multimedia-Programmierung 1
D Highscoreliste eines Applets funktioniert online nicht Spiele- und Multimedia-Programmierung 4
W CannotRealizeException (jmf) beim abspielen eines liedes Spiele- und Multimedia-Programmierung 3
F Meine Aufgabe: Client-Server am Beispiel einer Implementation eines Tic-Tac-Toe Netzwerkspieles Spiele- und Multimedia-Programmierung 7
D Koordinaten eines 2D Sprites Spiele- und Multimedia-Programmierung 2
B Teile eines Bildes laden - BitBlk und drawImage Spiele- und Multimedia-Programmierung 3
S Interpolation eines Bildes Spiele- und Multimedia-Programmierung 6
S Problem beim laden eines Bildes in einer Methode Spiele- und Multimedia-Programmierung 14
G rotation eines würfels Spiele- und Multimedia-Programmierung 9
G Bewegung eines Grafikobjektes Spiele- und Multimedia-Programmierung 7
A Programmieren eines Bruchrechners Spiele- und Multimedia-Programmierung 3
H Decke zeichnen mit Hilfe eines Polygons Spiele- und Multimedia-Programmierung 2
J Rotieren eines 2D Images endet in Java heap space Error Spiele- und Multimedia-Programmierung 15
W Affine Transformation, Rotieren eines Objekts Spiele- und Multimedia-Programmierung 2
S fließende/bewegende Striche eines Auswahlrechtecks Spiele- und Multimedia-Programmierung 9
A Bounds eines gedrehten Objekts berechnen Spiele- und Multimedia-Programmierung 30
T Erstellen eines ausdruckbaren Formulars Spiele- und Multimedia-Programmierung 5
T Umsetzung eines 2D Jump and Runs Spiele- und Multimedia-Programmierung 7
T Brightness eines Bildes [DRINGEND] Spiele- und Multimedia-Programmierung 2
S Java3D - mehrere Instanzen eines Geometrieobjektes erzeugen Spiele- und Multimedia-Programmierung 3
ARadauer Grauwerte eines jpg ermitteln Spiele- und Multimedia-Programmierung 4
A Anzeigen eines Grapfen Spiele- und Multimedia-Programmierung 13
R Die korrekte Breite/Höhe eines Bildes wird nicht erkannt. Spiele- und Multimedia-Programmierung 2
S Problem bzgl. Umsetzung eines Rollenspiel Spiele- und Multimedia-Programmierung 6
M Ausschneiden eines Bereichs / Avatar Spiele- und Multimedia-Programmierung 2
G Ermitteln eines Punktes in einer anderen TransformGroup Spiele- und Multimedia-Programmierung 2
M Frage eines Anfängers Spiele- und Multimedia-Programmierung 3
DEvent [2D] Farbe bestimmten Pixels eines Bildes ändern Spiele- und Multimedia-Programmierung 3
V Wie berechnet man das Bild eines Schwarzen Loches in Java? Spiele- und Multimedia-Programmierung 10
G Breite eines Strings Spiele- und Multimedia-Programmierung 2
S Text an einer Seite eines Cubes Spiele- und Multimedia-Programmierung 7
F Image eines bestimmten Bereichs eines JPanels erstellen Spiele- und Multimedia-Programmierung 4
N Grafik als Hintergrund eines Rechtecks verwenden? Spiele- und Multimedia-Programmierung 4
N Rundenstrategiespiel - Problem beim Drehen eines Bildes Spiele- und Multimedia-Programmierung 18
F Brauche Hilfe bei Bewegung eines Rechtecks [Applet] Spiele- und Multimedia-Programmierung 5
T Java2D Spiel, beim Hinzufügen eines Bildes ruckelt das ganze Spiele- und Multimedia-Programmierung 3
F Position eines Objektes auslesen. Spiele- und Multimedia-Programmierung 7
W Rotation eines Objektes Spiele- und Multimedia-Programmierung 2
M Zerschneiden eines Bildes mit Wellenlinien? Spiele- und Multimedia-Programmierung 2
S Simulation in der Art eines Schachbrett Spiele- und Multimedia-Programmierung 2
A 2-Achsen Rotation eines Würfels Spiele- und Multimedia-Programmierung 4
L nicht sichtbare Kanten eines Würfels Spiele- und Multimedia-Programmierung 2

Ähnliche Java Themen

Neue Themen


Oben