Verschiedene Bildpunkte: Verhältnis berechnen

Hallo Leute,

also ich bin gerade dabei, ein Programm für einen Kumpel zu schreiben. Leider liegt er wegen schweren gesundheitlichen Problemen im Krankenhaus und würde gerne sein Lieblingsspiel spielen. Leider geht dies momentan mit seinen Armen nicht. Deshalb wollte ich ihm ein Programm schreiben, womit er Befehle mit seiner Stimme geben kann.

Zu meinem Fortschritt:

Ich habe mich mal die vorherigen Tage hingesetzt und bin alles auf dem Blatt durchgegangen (designtechnisch). Ich habe dann vorgestern angefangen, alles zu schreiben und bin jetzt schon fertig damit, bis auf eine wichtige Sache:
Ich würde das Programm auch gerne selber verwenden. Das Problem ist jedoch, dass ich eine andere Bildschirmauflösung habe als mein Freund. Bis jetzt habe ich die Puntek auf dem Bildschirm, die benutzt werden, um die Maus zu bewegen, alle statisch (also genaue Pixel) angegeben. Diese Werte hab ich einfach in eine .properties Datei abgelegt. Die einfachste Lösung wäre natürlich, die Positionen in Relation zur Bildschirmbreite/höhe zu hinterlegen (also 0,75 würde dann 75% der Bildschirmweite heißen).

Ich hab alle statischen Werte für beide Bildschirme schon in einzelne Dateien geschrieben. Was ich gerne machen würde wäre, die relativen Werte basierend auf meine bereits bekannten Werte zu berechnen. Nur leider fällt mir dazu nichts ein. Habt ihr eine Idee wie ich das lösen könnte?

Um noch etwas Klarheit zu verschaffen:
Angenommen ein Punkt lautet 600/450 auf seinem Bildschirm (1200/900) und 800/450 auf meinem (1600/900). Wie würde ich den relativen Wert berechnen? Ich hab das Gefühl das ist ziemlich einfach, aber irgendwie komme ich da nicht drauf. Klar für jedes einzelne ist einfach, aber ich möchte sozusagen einen Durchschnittswert haben. Damit will ich bewirken, dass wenn ich noch mehr Punkte für noch mehr Auflösungen der Bildschirme nehme, der relative Wert sich weiter zu richtigen Wert annähert.

Ich hoffe das ist irgendwie verständlich.

Edit: Falls jemand fragt, warum ich das nicht einfach für die zwei Bildschirme mache und fertig. Ich würde das noch für ein zwei andere Programme verwenden, darum wäre solch eine Annäherungsfunktion ziemlich praktisch.

DANKE IM VORAUS!!!

Tipp: Dreisatz / Prozentrechnung: Wobei 100% die Bildschirmauflösung deines Freundes ist.

was ist denn das für ein langer Text, das ist ja einen moderatorischen Tadel wert :wink:

Freund im Krankenhaus, Programm zur sprachgesteuerten Programmierung?!
und dann geht es wirklich nur darum 600 zu 1200 auf 800 zu 1600 umzurechnen?


Dreisatz, Prozenzrechnung, Zoom, Ausschnitt, Verschiebung,
virtuelle Koordinatensysteme auf aktuellen Bildschirm umrechnen (und andersrum, etwa Mausklicks zurückrechnen),
das sollte doch alles ziemlich einfacher Standard sein

Ja wartet mal bitte :slight_smile:

Ich weiß dass man das mit dem Dreisatz machen kann. Aber ich versuche das nochmal zu erklären ohne das ganze drum herum.
Also ich habe zwei properties Dateien für zwei verschiedene Auflösungen mit, sagen wir, 50 Punkten. Ich kann ja für jeden Punkt mittels den Dreisatz einfach den prozentualen Wert berechnen. Wenn ich das für jede Auflösung mache habe ich zwei Dateien mit je 50 Punkten, die alle Relativ zum Bildschirm angegeben sind. Jetzt würde ich gerne daraus einen optimalen Wert bestimmen, indem ich beide Werte verwende. Soll ich dafür dann einfach immer den einen auf den anderen addieren und dann durch zweii teilen? Also sozusagen einen Durchschnitt bilden? Oder gibt es da eine effizientere Methode für? Ich denke mal das mit dem Durchschnitt kann effektiv sein, braucht aber eine größere Datenmenge um genauer zu werden oder?

Punkte relativ zu Bildschirmgrößen sind mit diesen zurückzurechnen, das ist klar,

390 von 400 Breite ist weit am rechten Rand,
780 von 800 Breite genauso,
beides auf 0.975 umgerechnet ergibt den gleichen Wert, welcher sich dann besser verarbeiten läßt,
absolut sinnvoll und außer Frage, fertig gewiss hierzu


eine Durchschnittsbildung danach ist zwar interessante Fortführung, was gut erklärt wofür das erste überhaupt benötigt,
aber recht separates neues Thema,

was hast du denn da als Ziel, Einsatzzweck?
was stellen die einzelnen Dateien nochmal jeweils da, wie groß sind die Abweichungen?

die normale Durchschnittsbildung ist natürlich ein passender Standardweg,
für mich auch der einzige, schon schnelles Ende des Wissenstands :wink:

teste das doch einfach an deinen Daten, kommt das dem gefühlten Wunschziel entgegen oder hakt etwas klar benennbares?

‚average of images‘ könnte man in Suchmaschinen eintippen

‘Average of images’, danke dir!

Also die Daten sind halt Punkte, auf denen sich (im Spiel) Objekte befinden (Knöpfe, Karten etc.). Diese Koordinaten werden dann einfach mittels der Mouse Klasse genutzt. Die bewegt dann den Zeiger stupide dahin und klickt dann nur. Das Programm nimmt dann Befehle per Sprache, hat eine gewisse Anzahl an Befehlen, und nimmt dann den, der am passendsten ist.

Ich dachte mir, wenn ich schon daran sitze, kann ich es auch mal versuchen, zu verallgemeinern damit es auf allen Bildschirmen läuft, ohne nochmal die Werte immer wieder separat herausfinden zu müssen. Denn wenn ich die relativen Werte habe, kann ich diese ja auf allen Systemen verwenden. Ich denke mal, wenn man einen Bildschirm mit 800x600 nimmt und dann einen in 4k, dann haben die berechneten Werte bei dem kleinen Monitor erheblich mehr Auswirkungen als bei dem mit 4k. Deshalb ist es dann auch wichtig, diese so genau wie möglich zu ermitteln.

Ich denke mal die Durchschnittsbildung ist da das sinnvollste, was es gibt.

verstehe dein Problem nicht. Du hast eine Datei, die die Daten auf eine Auflösung für 800x600 enthält. Mach dir eine Methode, die deine SollPosition laut Datei entgegen nimmt und dir die aktuelle Position für deinen Bildschirm berechnet. Und egal, wann du es brauchst, benutzt du diese. Ob es beim positionieren von Objekten ist, oder deine Maus. Bevor du die Position eines Objektes (z.B. ein Pirat) setzt, rufst du deine Methode zum wandeln auf:

pirat.setPosition(convertFrom800x600(200,300));

Noch besser ist es natürlich diese Methode in einer BasisKlasse zu verstecken, sodass du nur noch innerhalb der Klasse abfragst, ob dieser “Pirat” angeklickt wurde. Dein Koordinatensystem ist dann eben 800x600 basiert und intern wird immer von der eigentlichen Auflösung auf 800x600 umgesetzt. Wenn dir das zu grob ist und deine Objekte “springen” auf einem 4k Monitor rum, weil eine Bewegung von 800 auf 801 auf einem 4k Monitor gleich 10 Pixel bedeutet, kannst du dein Koordinatensystem auch größer wählen.

Danke euch allen! Eure Hilfe hat mir echt geholfen!