Differenz in Speziellen Koordinatensystem errechnen

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

PhillipK

Betreff: Differenz in Speziellen Koordinatensystem errechnen

BeitragFr, Aug 02, 2013 6:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Community!

Ist ein wenig blöde gewählt, der titel, doch ich weiß nicht so recht wie ich es nennen soll Smile

Ich bastel grade an einem kleinen Wegpunkt-merker für CubeWorld. Jap, ich beziehe mich also auf ein mir-fremdes-programm (genauer spiel) und man könnte es als botting bezeichnen, aber dem ist nicht so^^
Es fehlt mir einfach einiges an möglichkeit in diesem spiel und ich warte nicht gerne patches ab.
Ich möchte also wegpunkte irwo eintragen.
Zu diesem zweck hab ich den Prozess ausgelesen und mir die entsprechenden werte gesucht. Problem ist, das das koordinatensystem speziell ist.

Hierzu habe ich mal eine grafik erstellt:
user posted image

Makiert sind 2 punkte in einem groben raster. Zu jeder koordinate existieren 2 werte. Einmal das große raster (zahlen zwischen 120 und 128 etc.) und einmal die koordinate innerhalb eines solchen rasterblocks.

Um das ganze zu vereinfachen:

Ich habe zb punkte A = x 3, 1 |y 3, 1 und punkt B = x 2, 6 | y 6, 6

Die erste zahl steht für die raster X / Y und die 2te zahl steht für die koordinate innerhalb des rasters.
In diesem beispiel ist das raster zb 10 breit/lang. Dh obiges beispiel hat eine blockdifferenz von..
x = 7, Y = -17.

Ich finde allerdings keine möglichkeit, das ganze zu rechnen. Generell bin ich scheinbar zu blöde, in diesem system eine differenz herzuleiten.
Ich hab nun schon mehrere male eine grafik wie oben ausgepackt, die punkte verschoben, mir die eigenschaften zu gemüte geführt und das ganze mit recht statischen if-abfragen abgepackt.. aber ohne erfolg.

Intressanterweise funktioniert nichteinmal die dummylösung:
BlitzMax: [AUSKLAPPEN]
Function BlockDifference:Long[] (megaX1:Int, megaY1:Int, x1:Int, y1:Int, megaX2:Int, megaY2:Int, x2:Int, y2:Int)
Const maxInt:Long = Long($ffffffff:Long)

Local xl1:Long = megaX1 * maxInt + x1
Local xl2:Long = megaX2 * maxInt + x2

Local yl1:Long = megaY1 * maxInt + y1
Local yl2:Long = megaY2 * MaxInt + y2


Return[xl2 - xl1, yl2 - yl1]


End Function


weswegen ich nun echt an mir zweifel^^
(anmerkung: megaX megaY beziehen sich auf das grobe raster wie oben. In jedem rasterblock gibt es noch X / Y koordinaten, die von 0 bis MAX_INT gehen und jeweils beim umspringen auf 0 oder max_int die entsprechende mega-chunk-koordinate erhöhen oder verringern.)


Anmerkung:
Bitte seid mir nicht böse, weil ich total cheaterlike einen prozess auslese. Ich habe vor, das programm als hilfe für andere CubeWorlds spieler im offiziellen forum zu posten.
Es soll die Spielerposition merken und auf wunsch speichern (zb "Stadt - XYZ") - beim auswählen eines gemerkten punktes soll die mapverschiebung so ausgerichtet werden, das man den gemerkten punkt auf der karte bewundern kann - egal wo man steht.
Da ich koordinaten nur total auslesen kann und speichern kann / sollte und die map-ausrichtung relativ zum player ist, brauche ich eben die blockdifferenzen Smile
  • Zuletzt bearbeitet von PhillipK am Fr, Aug 02, 2013 8:51, insgesamt einmal bearbeitet

BladeRunner

Moderator

BeitragFr, Aug 02, 2013 8:04
Antworten mit Zitat
Benutzer-Profile anzeigen
[code]Öhm, wenn ich dich recht verstehe hast Du doch einen Offset auf dem Raster welcher dir dann die Koordinate angibt.
Dann ist doch ein Punkt definiert (ich nehme mal nur eine Komponente) als:
x_absolut = (x_raster*rastergroesse) + x_teil

Die Differenz zweier solcher Punkte in absoluten Pixeln ist dann:

((x2_raster*rastergroesse)+x2_teil)-((x_raster*rastergroesse)+x_teil)

Also im wesentlichen das was Du da auch stehen hast. Ich habe nur explitzit Klammern gesetzt.
Eine weitere Fehlerquelle könnte zumindest bei deinem Beispiel der Cast auf Long sein, wobei ich das für unwahrscheinlich halte.
Des Weiteren Frage ich mich warum in deinem Beispiel die Rastergröße so riesig gewählt ist.

BlitzMax: [AUSKLAPPEN]
SuperStrict

Function Distance:Int[](x1:Int , bx1:Int , y1:Int , by1:Int , x2:Int , bx2:Int , y2:Int , by2:Int , raster:Int)
Print (bx2 * raster)
Print ( (bx2 * raster) + x2)
Print (bx1 * raster)
Print ( (bx1 * raster) + x1)
Print ( (bx2 * raster) + x2) - ( (bx1 * raster) + x1)

Return [( (bx2 * raster) + x2) - ( (bx1 * raster) + x1) , ( (by2 * raster) + by1) - ( (by1 * raster) + y1)]
End Function

Print distance(3 , 1 , 3 , 1 , 2 , 6 , 6 , 6 , 7)[0] + " - " + distance(3 , 1 , 3 , 1 , 2 , 6 , 6 , 6 , 7)[1]


Eins was noch Probleme machen könnte: Wenn die Koordinaten im Raster jeweils 0-ständig sind muss die Berechnung mit um eins vermindertem Rastermaß und um das nulloffset angepassten Koordinaten durchgeführt werden.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

PhillipK

BeitragFr, Aug 02, 2013 8:20
Antworten mit Zitat
Benutzer-Profile anzeigen
!!!! ACHTUNG !!!!!
Das ganze bezieht sich nicht auf mein Spiel. Ich arbeite ein kleines Tool dafür aus. Das tool ist für das Spiel CubeWorld, welches ->NICHT<- von mir ist!!!!

Die rastergröße und auf weiteres habe ich keinen einfluss. Ich habe mich selbst zwar gewundert, aber naja Smile

Ich habe des weiteren oben den screenshot ein wenig angepasst und werde mir nun deinen code zur gemühte führen.

Zum glück ist das eher ein matheproblem, was mit variablen genauso gut erklärt werden kann wie mit werten, und rein garnichts mit dem spiel an sich zu tun haben muss *grins*

Edit:
Bladerunners code deckt sich in soweit mit meiner Dummylösung.
Ein problem konnte ich noch fixen, ich hatte bei einer vorherigen methode einen long übergeben aber int in empfang genommen. da der long gut und gerne > $FFFFFFFF sein konnte, gabs hier fehler.
Nun funktioniert es, bis auf eine ausnahme:
Wenn die block-differenz = 1 ist, wird ein falscher wert berechnet oÔ aber ich denke, diesen sonderfall kann man auch iffen.
Schwierig schwierig Smile
Edit2:
Yeah, toll Phillip. Du bist der held.
Bladerunner, dein code funktioniert - wie zu erwarten - perfekt.
Der fehler lag mal wieder bei mir.
Hab beim kopieren von altcode wiedereinmal vergessen die bezeichner von int auf long zu ändern. Wenn wirklich alles long ist, funktioniert alles wunderprächtig.
Intressieren würde mich nun aber noch, ob jemand das ganze ohne long lösen kann, dh raster und rastersize dürfen nicht multipliziert werden^^
Nötig ists nicht, aber ich habe leider keine ahnung wie man sowas dann umsetzt - das war nämlich das, was ich etwa 5 stunden versucht habe, bis ich mich hier gemeldet hab. Smile


Und ums nochmal ganz klar hervorzuheben:

ACHTUNG
Ich beziehe mich in diesem Thread auf rechnungen, die für ein Programm welches NICHT von mir ist, bezieht. Sie sollen lediglich in meinem Tool untergebracht werden, um das spiel im ram zu VERÄNDERN. Nennt es trainer, editor, hack.

Es handelt sich um das Spiel CubeWorld - einen link spare ich mir mal weil werbung Smile
Das Spiel ist in der Alpha - grade nen monat oderso raus - und es fehlt noch viel drin.
Deswegen betreibe ich memhacking und arbeite mit gelesenen werten, um mir diverse kleine goodies zu basteln (speziell: Wegpunkte eintragen. Das fehlt massiv in dem spiel). Geplant ist das ganze eigentlich für mich und bekannte, die mit mir das spiel spielen sowie eventuell für die community des spiels.

Ich wurde bereits darauf hingewiesen (von einem bekannten), das des vom author des programms unterbinden werden kann und werde mich, sobald deren forum wieder posts erlaubt, erst mit ihm in verbindung setzen, was er davon hält und bis dahin privat weiterarbeiten. (bzw tue ich eh momentan, aber ich werde allerlei informationen zurückhalten, die nichts mit dem matheproblem zu tun haben, nur um sicher zu gehen)
Allerdings ist in deren forum bereits ein player-hack editor veröffentlich und der Author scheint das zu dulden - wahrscheinlich, weil das spiel eben noch in einer solch frühen alpha ist (da kann er doch direkt die genutzten techniken bannen, wie praktisch^°)

Tendenziell möchte ich den author dazu bewegen, Wegpunkte direkt ins spiel zu integrieren und bis dahin mit einem minitool den spielern helfen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group