Autor Thema: Ich brauche Mathe-Nachhilfe!  (Gelesen 8302 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline ThomasI

  • Benutzer
  • Beiträge: 61
  • ANARCHO Ride Laboratories
Ich brauche Mathe-Nachhilfe!
« am: Fr 10.12.2021, 20:39:47 »
Hallo an alle Programmierer hier!
Ich brauche mathematische Hilfe!
Ich habe für meine Spiele ja isometrische World/Screenspace-Berechnungen durchgeführt. Da knifflige ist ja, die Mausposition vom Bildschirmbereich auf die entsprechende Kachel auf dem Spielfeld zu übertragen.
Die Mathematik funktioniert… da gibt es keine Probleme (siehe Randomazer)

Aber als nächstes würde ich sehr gerne von einer isometrischen Projektion (genaugenommen dimetrisch) zu einer trimetrischen Projektion gehen, bei der die obere und untere Position der rautenförmigen Kacheln keine vertikale Linie mehr bilden.
Hier fällt meine Mathematik auseinander und ich komme nicht dahinter, wie ich die entsprechende Kachelzeile/-spalte aus einer Maus-X/Y-Position herausrechne.

Die Pixelposition (obere linke Ecke) für eine Kachelzeile und -spalte wird wie folgt berechnet:
TilePixelX = WorldOriginX + ColumnNr*DeltaColumnX + RowNr*DeltaRowX
TilePixelY = WorldOriginY - ColumnNr*DeltaColumnY + RowNr*DeltaRowY

Wenn ich nun auf eine Kachel mit MousePixelX und MousePixelY klicke: Wie bekomme ich die entsprechende Zeile / Spalte? Ich weiß, es sollte grundlegende Mathematik sein, aber ich stehe erst mal an. Kann mir jemand einen Hinweis geben? Siehe Abbildung: Links – Isometrisch (dimetrisch), kein Problem. Rechts – Trimetrisch, ich bin verloren.
« Letzte Änderung: Fr 10.12.2021, 20:43:19 von ThomasI »

Offline czietz

  • Benutzer
  • Beiträge: 3.685
Re: Ich brauche Mathe-Nachhilfe!
« Antwort #1 am: Fr 10.12.2021, 21:03:09 »
Ich bin mir nicht sicher, ob ich die Frage verstehe. Du hast ja offensichtlich Code, um die Transformation von "Kachelkoordination" in "Pixelkoordinaten" zu berechnen; sonst könntest Du die Kacheln Deines Spielfelds ja nicht auf den Bildschirm zeichnen. Sind das die zwei Gleichungen, die Du gepostet hast? Du suchst also nur die Umkehrung dieser zwei Gleichungen?

Offline czietz

  • Benutzer
  • Beiträge: 3.685
Re: Ich brauche Mathe-Nachhilfe!
« Antwort #2 am: Fr 10.12.2021, 21:32:50 »
Ich habe die Umstellung des Gleichungssystems auf Papier gerechnet, aber bevor Du durch meine Kritzelei durchsteigst (und weil man beim Umstellen von Gleichungen schnell mal ein Vorzeichen oder einen Faktor verliert), habe ich auch einen Computer gefragt. Meine Auswahl fiel auf Octave Online: https://octav.onl/marqv042.

Ergebnis:
c =
  -drx⋅(py - wy) + dry⋅(px - wx)
  ──────────────────────────────
        dcx⋅dry + dcy⋅drx       
r =
  dcx⋅(py - wy) + dcy⋅(px - wx)
  ─────────────────────────────
        dcx⋅dry + dcy⋅drx

Du solltest Deine Variablen wiedererkennen, auch wenn ich die Variablennamen verkürzt habe. Du wirst anhand der angezeigten Lösung für c und r (ColumnNr und RowNr) typischerweise nicht-ganzzahlige Werte herausbekommen, weil der Nutzer kaum exakt auf die linke obere Ecke klicken wird. Aber das ist ja durch Runden schnell erledigt, dann hast Du Deine Kachelnummer.
« Letzte Änderung: Fr 10.12.2021, 21:41:21 von czietz »

Offline ThomasI

  • Benutzer
  • Beiträge: 61
  • ANARCHO Ride Laboratories
Re: Ich brauche Mathe-Nachhilfe!
« Antwort #3 am: Sa 11.12.2021, 08:27:13 »
Danke für den Input!
Das Octav kannte ich noch nicht. Ist ja genial! :)

Jetzt klappt es! Isometrische, dimetrische, trimetrische und rechteckige Kacheln kann ich jetzt korrekt bestimmen! Danke!

https://www.youtube.com/watch?v=iflvMiwr96M

Offline czietz

  • Benutzer
  • Beiträge: 3.685
Re: Ich brauche Mathe-Nachhilfe!
« Antwort #4 am: Sa 11.12.2021, 10:56:19 »
Ein neues Spiel in Arbeit. Sehr cool!

Octave ist ein freier Klon des kommerziellen Programms MATLAB, hat seine Stärken also in der numerischen Mathematik. Aber beide haben - wie man sieht - auch ein Paket für symbolische Berechnung, d.h. Berechnungen mit Variablennamen, das ich (unter MATLAB) gerne nutze, um mir langweiliges Gleichunglösen zu ersparen.

Dennoch hilft es, wenn ich meine Mathematik-Fähigkeiten trainiert halte. Hier also der Weg, wie ich es ohne Computer-Algebra-System von Hand gerechnet habe. Es bietet sich an, Dein Gleichungssystem in die Form Ax = b umzustellen, weil man dann die Lösung (A⁻¹ = Inversion von A) einfach aus der Formelsammlung ablesen kann: