Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Von Pixel in Koordinate umrechnen
ConditionZero - So 13.09.09 00:00
Titel: Von Pixel in Koordinate umrechnen
Abend miteinander,
Ich glaube das wird jetzt relativ schwer euch zu erklären was ich denn genau machen möchte, aber ich probiers' einfach mal: :roll:
Ich möchte das Formular in ein Raster unterteilen. Jeder Rasterteil hat einen bestimmten (jedes gleichgroß und quadratisch) zuständigen Pixelbereich. Im Beispiel ist dieser 49x49 Pixel pro Koordinate. Später möchte ich auf Mausklicks in diesen Zuständigkeitsbereichen agieren. Für das MausClick-Event sollen also Integerwerte angegeben werden, welche die Beträge haben, als ob ein Pixel auf 49*49 Pixel gezehrrt wird.
(Verständlich ausgedrückt :!: :?: )
Demnach brauch ich ja eine Umrechnung von Pixel zu Koordinate und genau an dieser Scheitert es momentan.
Das Raster für die Events soll übrigens in einem 2-Dimensionalem Integer-Array gespeichert werden.
Ich dachte da an die Rechnung
Zuständige Koordinate = Rastergröße in Pixel / Koordinatenbreite/-höhe
Da ich für die Unterteilung in das Array "Raster" auf Anhieb nichts implementieren konnte, hatte ich es erstmal damit versucht, die Koordinate auf die geklickt wurde zu ermitteln.
So in etwa sah das aus: (Bekomme konstante Ergebnisse herau, egal wo geklickt wird, hatte heute Mittag noch dynamische Ergebnisse, welche aber auch falsch waren. Leider nach Programmabsturz Code weg...)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63:
| var GameForm: TGameForm;
MapsizeInPixel: TPoint; MapsizeGrid: TPoint;
Walk_Zielpunkt: TPoint;
Raster: Array of Array of Integer;
procedure TGameForm.CreateGrid(LengthX,LengthY,Size: Integer); begin
MapsizeInPixel.X:= LengthX * Size; MapsizeInPixel.Y:= LengthY * Size;
SetLength(Raster,LengthX,LengthY);
procedure TGameForm.Move; var Extractpath: String;
begin Extractpath:= ExtractFilePath(ParamStr(0));
Image1.Picture.LoadFromFile(Extractpath + '\data\gui\Walk.gif');
Walk_Zielpunkt.X:= MapsizeInPixel.X div 24; Walk_Zielpunkt.Y:= MapsizeInPixel.Y div 24;
WalkTimer.Enabled:= true;
ShowMessage(IntToStr(Walk_Zielpunkt.X)+' '+IntToStr(Walk_Zielpunkt.Y)); end; |
Habe lieber mal zuviel Code als zuwenig reingepostet, also sorry wenn was unnötiges drin ist.
Hoffe ich versteht was ich will und könnt mir helfen
Grüße ConditionZero
jaenicke - So 13.09.09 08:40
Genau so etwas mache ich z.B. bei
meinem Periodensystem [
http://www.delphi-forum.de/viewtopic.php?p=557541], wo ich alles in eine TPaintBox zeichne. Vielleicht gibt es dir ja Ideen.
Zum Thema selbst:
Delphi-Quelltext
1:
| Walk_Zielpunkt.X:= MapsizeInPixel.X div 24; |
MapsizeInPixel.X ist doch die Größe der Karte insgesamt, oder? Das heißt, wenn du den Wert durch 24 teilst, landest du doch immer ganz unten rechts auf der Karte. :gruebel:
Ist das wirklich der Zielpunkt?
Die Umwandlung an sich ist so schon richtig:
Gridkoordinate := Pixelkoordinate div GridSize;
Pixelkoordinate := Gridkoordinate * GridSize;
ConditionZero - So 13.09.09 13:01
Danke, werd ich mir mal anschauen.
jaenicke hat folgendes geschrieben : |
Zum Thema selbst: Delphi-Quelltext 1:
| Walk_Zielpunkt.X:= MapsizeInPixel.X div 24; | MapsizeInPixel.X ist doch die Größe der Karte insgesamt, oder? Das heißt, wenn du den Wert durch 24 teilst, landest du doch immer ganz unten rechts auf der Karte. :gruebel:
Ist das wirklich der Zielpunkt?
|
Hoppla, hatte nicht darauf geachtet das durch 24 geteilt wird. Hatte ich mal drinnenstehen um was auszuprobieren.
Das sollte eigentlich so aussehen
Delphi-Quelltext
1:
| Walk_Zielpunkt.X:= MapsizeInPixel.X div 49; |
Die 49 wird dann natürlich noch durch eine Variabel erstetzt welche die Länge und Höhe (identisch) einer Koordniate beinhaltet.
jaenicke hat folgendes geschrieben : |
Die Umwandlung an sich ist so schon richtig:
Gridkoordinate := Pixelkoordinate div GridSize;
Pixelkoordinate := Gridkoordinate * GridSize; |
Ja aber leider funktioniert das nicht, wenn ich es so implementiere :(
Aber Waurum?
Nervig, dass man an so einer simplen Sache oft ewig rumnagt.
//Edit:
Problem gelöst. Danke jaenike
Wie immer falls jemand über Suche darauf stößt der das selbe oder ähnliche Problem hat, hier die Lösung:
Delphi-Quelltext
1: 2: 3:
| Walk_Zielpunkt.X:= ScreenToClient(Mouse.CursorPos).X div 49; Walk_Zielpunkt.Y:= ScreenToClient(Mouse.CursorPos).Y div 49; |
Grüße Marc
jackle32 - So 13.09.09 17:51
Hallo,
ich würde dir das TDrawGrid empfehlen. Hab mal ein Spiel angefangen zu schreiben, wo es auch darum geht auf welches Feld geklickt wird.
TDrawGrid hat einige Vorteile:
- einfache Handhabung beim Zeichnen da fertige Komponente
- schnelle Komponente (schneller als einzelne Elemente)
- der aber für deinen Fall größte Vorteil ist, es gibt die Funktion "MouseCoord()", diese Funktion gibt dir direkt die Werte für die Zeile und Spalte zurück auf die geklickt wurde :zustimm: :dance2:
Zum verwenden kannst du ja die inaktiven Zeilen ausblenden und das Grid auf die größe deines Form Fensters anpassen. Wenn du die einzelnen Kästen nicht sehen willst kannst du auch die Striche verstecken.
Hoffe ich konnte weiterhelfen
Gruß Jack
jaenicke - So 13.09.09 17:54
Dafür hat man halt auch ne zusätzliche visuelle Komponente. Wenn das so reicht, ist das ja ok.
Ich selbst wollte beim Periodensystem z.B. flexibler bleiben (verschiedene Rastergrößen und Abstände, ...), usw., das ging mit der PaintBox sehr viel einfacher.
jackle32 - So 13.09.09 18:06
Da stimm ich dir zu für das Periodensystemproblem ist es nicht das optimale. Was aber in diesem Fall ja mit dem speziellen Aufbau zu tun hat.
Für das Problem, das man eine Fläche mit vielen gleichmäßigen Formen, ist das TDrawGrid eine sehr schnelle und unkomplizierte Lösung, da die Funktion die man braucht eigentlich alle schon in die Komponente gepackt sind.
Gruß Jack
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!