Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Gradmaß zu X,Y Koordinaten (https://www.delphipraxis.net/99786-gradmass-zu-x-y-koordinaten.html)

axellang 17. Sep 2007 21:42


Gradmaß zu X,Y Koordinaten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Leute,

nachdem ich heute, wie es auch bisher in diesem Forum war, bestens bedient worden bin codevervollstaendigung, gleich noch ein Problemchen. Zurzeit arbeite ich an einem Projekt zur Auswertung von Schussergebnissen. Kurz zusammengefasst; Mietgliederverwaltung, Disziplinen, Mannschaften, Teilnehmer, Schießarten, Schussbilddiagramme, Turniere, Preisgelder usw.
alles in allem, alles was so eine DB basierte Anwendung so hergibt.

Das Ganze ist eine Netzwerkfähige Lösung, basierend auf dem MSSQL 2005 Express bzw. MSSQL Server >7. Das ist zwar Arbeit, aber da kenne ich mich aus (DB) und da bin ich zuhause. Nun bin ich auf ein Problem gestoßen wo ich nicht so genau weiß, wie es zu therapieren ist.

Um was geht es:

Bei der Schußauswertung gibt der Schütze seine Scheiben ab die dann von einer sog. Auswertungsmaschine ausgewertet werden. Dazu wird Scheibe für Scheibe in die Auswertungsmaschine gelegt, die mittels Scanner die Treffer auswertet. Die Auswertemaschine ist per RS232 Schnittstelle mit dem Rechner verbunden und sendet die ausgelesenen Ergebnisse an die Anwendung die es anfordert. In diesem speziellen Fall sendet die Auswertemaschine die Ergebnisse in folgender Formatierung:

String + CheckSumme + CR:

Das sieht dann so aus:

Sch=[Schußnr.];[Ringwert];[Teilerwert*];[Winkel*];[Flag*];[CheckSum*]

(Original Datenstring von der Auswertemaschine pro Schuß)

SCH=3;10.0;358.6;101.5;G#


* Teilerwert: Je kleiner der Teilerwert umso näher ist man der Mitte, ergo dem Zehner.
* Winkel: in Grad; Oben ist 0° rechts 90° usw.
* Flag: G = Gültig; U = Ungültig; K = Schuß muss kontrolliert werden.
* CheckSum <32, wird 32 dazuaddiert (XOR-Verknüpfung aller Zeichen).

Nachdem alle Scheiben (Serie) ausgewertet worden sind, soll ein Schußbild der Serie angezeigt werden (meist 40 Schuß auf 20 Scheiben, ergo 2 Schuß pro Scheibe). Das bedeutet: Alle abgegebenen Schüsse (Serie) sollen auf einer Scheibe angezeigt werden damit sich der Schütze einen Überblick über seine Serie verschaffen kann. Außerdem soll nach jeder Auswertung, also pro Scheibe, die Treffer auf der Scheibe im Programm angezeigt werden.

Mein Problem ist:

Es gibt Auswertemaschinen die senden keinen Winkel in Grad, sondern gleich die richtigen Koordinaten zu, z.B. X:120, Y: 230 aber diese eine sendet das im Gradmaß. Wie rechne ich das um, um die X, Y Koordinaten zu bekommen, um den Schuß, Schüsse auf der Scheibe darzustellen.

Im Forum habe ich einen Post gefunden Gradmaß zu Mauskoordinaten, in dem X, Y zu Gradmaß umgerechnet wird. Geil dachte ich, dann muss ich nur noch andersrum rechen, doch Pustekuchen, das funktioniert nicht. Also packte ich meine verstaubten Schulbücher aus und zog mir Trigonmetrische Funktionen wieder rein, aber irgendwie machte es nicht: Heureka. Deshalb habe ich eine kleine Anwendung geschrieben die das Problem verdeutlichen soll.

Zur Anwendung:

Nach dem Start wird eine Zielscheibe gezeichnet und ein Treffer wird angezeigt. Dieser Treffer wird auf der original Scheibe, von der Auswertemaschine, mit einem Winkel (Gradmaß) von 101.5 angegeben. Der oben angegebene Rückgabestring von der Auswertemaschine stimmt mit der Trefferanzeige in meiner Anwendung ± 1mm überein.

Wie könnt Ihr mir helfen:

Wie muss ich rechnen, damit ich den Treffr den ich als Gradmaß von der Auswertemaschine erhalte, genau dort in meiner Anwendung platziere, wie dieser auf der Originalscheibe zu sehen ist?


Alexander

ken_jones 17. Sep 2007 22:48

Re: Gradmaß zu X,Y Koordinaten
 
Salut Alexander,

Tja, Trigonometrie ist bei mir auch ne Weile her, aber so mal ins blaue geschossen sag ich jetzt mal:

Ich kenne mich mit diesen Scheiben überhaupt nicht aus, aber du sagst, je kleiner der Teilerwert ist, desto Näher ist man dem Zehner. Also nehme ich mal an: 0 = Volltreffer, 10'000 = Niete.
Die Grafik für die Scheibe ist 500 x 500 Pixel gross (Width x Height), die Mitte der Scheibe ist 0,0 (also nicht oben Links), dann brauchen wir dazu einen Offset: XOfs = Width div 2; YOfs = Height div 2

Dann würde ich mal Tippen die Winkel und Teilermasse folgendermassen in Koordinaten umzurechnen:

X := XOfs + (Width / 10'000 * Teiler * Sin(Winkel))
Y := YOfs - (Height / 10'000 * Teiler * Cos(Winkel))

Beispiel:

Winkel = 101.5 Grad
Sin(Winkel) = 0.9799
Cos(Winkel) = -0.1993
Teiler = 358

X := 250 + (250 / 10'000 * 358 * 0.9799) = 258
Y := 250 - (250 / 10'000 * 358 * -0.1993) = 252

Der Treffer ist somit leicht rechts unten auf der Scheibe.

Vielleicht lieg ich völlig im Wald, ist jetzt alles rasch im Kopf entstanden.

axelf98 17. Sep 2007 23:32

Re: Gradmaß zu X,Y Koordinaten
 
Zu Bedenken: Der Rechner rechnet intern mit Bogenmaß für das gilt:

Code:
2*pi = 360 Grad

Bogenmaß b
Winkel w

b = w*pi/180
w = b*180/pi

axellang 18. Sep 2007 00:19

Re: Gradmaß zu X,Y Koordinaten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo ken_jones,

erstmal danke für Deine Antwort doch leider stimmt es nicht bzw. ich komme nicht auf den
richtigen Treffer(?)

Auf die Größe der Scheibe kommt es nicht an. Ich habe hier das
original Programm zur Auswertung der Trefferzahlen (Übrigens
mit D2 oder D3 geschrieben. Soll erneuert werden). Dort kann man z.B,
einen Zoom einstellen da werden nur die Ringe 5-10 dargestellt.
Also nicht das Img gezoomt sondern mann kann am Anfang der Auswertung
einstellen; Nur im Zoom anzeigen. Dann werden nur die Ringe 5-10 dargestellt.

Es geht darum das oben 0° sind, die rechte Ringbegrenzung ist 90° unten 180° und oben 360° (Laut Schnittstellenbeschreibung Auswertemaschine).

Deshalb, so denke ich, ist es egal wie groß die Scheibe ist, es geht um die Gradangabe.
In meiner Anwendung, die ich zum testen bereitgestellt habe, ist ein Edit-Feld in dem
man die Gradzahl eintragen kann und über den btn Schuß kann man überprüfen ob der Schuß
an der richtigen stelle ist. Leider ist hinter dem btn kein Ereignis hinterlegt weil ich
nicht weiß wie der,die,das auszusehen hat.

Hier eine Serie mit 10 Schuß wie es die Auswertemaschine sendet:


SCH=1;6.0;3373.0;300.7;G+
SCH=2;7.0;3112.0;58.3;G6
SCH=3;10.0;358.5;101.0;G%
SCH=4;8.0;1766.0;247.0;G'
SCH=5;8.0;1808.0;220.9;G)
SCH=6;7.0;2486.0;333.4;G"
SCH=7;7.0;3031.0;283.5;G!
SCH=8;7.0;2896.0;251.4;G$
SCH=9;8.0;1726.0;186.6;G&
SCH=10;7.0;2415.0;158.4;G0


Und dass dazugehörige Screenshot aus dem Auswerte Programm im Anhang.

Axel

DGL-luke 18. Sep 2007 05:46

Re: Gradmaß zu X,Y Koordinaten
 
hallo,

du musst in deine berechnung, wenn du die exakten koordinaten haben willst, die größe der scheibe einstellen. bzw. was die auswertungsmaschine als grenzen für die entfernung nimmt.

Das sollte auch in der Dokumentation der Auswertungsmaschine stehen.

heißt vielleicht "10.0" einfach 1er und "1.0" 10er? Wär zwar bescheuert...

Nikolas 18. Sep 2007 07:55

Re: Gradmaß zu X,Y Koordinaten
 
Dein Problem ist doch eigentlich die Umrechnung von kartesischen in Polarkoordinaten, oder? Dann sollte dir Wikipedia: Polarkoordinaten helfen.

Aber eigentlich sollte der Code von ken_jones ganz gut sein. Und wenn du 0° oben hast, musst du eben
x=x_mitte+radius*(WinkelInRad-pi/4) rechnen.

Ich hab grad kein Windows, könntest du vielleicht mal die Ausgabe von seinem Code als Screenshot hier reinstellen?

mbamler 18. Sep 2007 08:47

Re: Gradmaß zu X,Y Koordinaten
 
Arcus-Tangens (ArcTan) sollte das Mittel der Wahl sein ...

Gruß
Matthias

Nikolas 18. Sep 2007 09:21

Re: Gradmaß zu X,Y Koordinaten
 
Nein. Er will doch von der polaren Darstellung zur kartesischen und nicht umgekehrt.

ken_jones 18. Sep 2007 10:31

Re: Gradmaß zu X,Y Koordinaten
 
So wie ich das sehe, brauchst du leider schon die Scheibengrösse in Pixel. Mit Winkel und Radius bestimmst du dann den Zielpunkt in der Grafik.
Und im weitren war ich mit meiner Schätzung von 10'000 als maximaler Teilerwert etwas daneben, es scheint bei dieser Scheibe wohl in die Richtung von 16'000 zu gehen.
Ich hab deinen Source mal runtergeladen und folgendermassen ergänzt:

Auf der Form ein edtTeiler (TEdit) hinzugefügt, um den Teilerwert anzugeben (hatte keine Lust den String "SCH=1;6.0;3373.0;300.7;G+" auseinanderzupriemeln).
Jetzt musst du halt auf der Form dann rasch Winkel und Teiler eingeben.

Die Schussprozedur habe ich folgendermassen ergänzt: (Danke an axelf98, Bogenmass hatte ich ganz vergessen!)

Delphi-Quellcode:
procedure TForm1.btnShootNowClick(Sender: TObject);
var
  x, y : Integer;
  w   : Real;
begin
  w := StrToFloat(edtDegree.Text)*pi/180;

  x := Trunc( XCenter + (Image1.Width / 16000 * StrToFloat(edtTeiler.Text) * Sin(w)));
  y := Trunc( YCenter - (Image1.Height / 16000 * StrToFloat(edtTeiler.Text) * Cos(w)));

  DrawShot(Image1.Canvas,x,y,8,clGreen);

end;
Guck mal wie das in etwa stimmt.

axellang 19. Sep 2007 08:38

Re: Gradmaß zu X,Y Koordinaten
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo ken_jones,

ja das war es. Ich habe es mit einigen Trefferergebnissen ausprobiert und die Markierung stimmt mit der
auf der org. Scheibe überein. Leider war ich gestern den ganzen Tag über außer Haus (Schulung beim Kunden) so das ich es nicht mit der Auswertemaschine testen konnte was ich heute im laufe des Tages nachholen werde. Witzig ist, das ich hier bei mir, auch ein TEdit mit der Bezeichnung edtTeiler angelegt habe und mit verschiedenen Teilerwerten rumhantierte.

Dabei ist mir folgendes aufgefallen: Das der max. mögliche Teiler im alten Auswerteprogramm bei 8875,0 liegt (siehe Bild 1) und wenn man vollkommen daneben schießt, also dem äußersten Rand der Scheibe, die Treffer in einem Halbkreis am Rand der Scheibe platziert werden (siehe Bild 2). Was mich vermuten lässt, das die keine Kreise auf einem TImage zeichnen so wie ich, sondern TShape := Circle verwenden um so die Scheibe zu erstellen.

Es werden so viele Shape's aufeinander gelegt um so die Zielscheibe zu erhalten. Muss das noch testen.
Doch eines ist sicher, Dein Code ist des Rätsels Lösung und mein Dank dafür :cheers: . Auch an axelf98. Ja klar intern wird im Bogenmaß gerechnet.

Zitat:

@DGL-Luke,
Das sollte auch in der Dokumentation der Auswertungsmaschine stehen.
Das sollte auch so sein, aber es gibt keine Dokumentation. Es gibt eine RS232 Schnittstellenbeschreibung die so gut ist das ich nur mithilfe von einem Serial Port Monitor herausgefunden habe wie die Auswertemaschine mit dem hauseigenem Programm kommuniziert. Auch mein Anruf beim Hersteller brachte nicht viel. Auf die versprochene Mail mit weiteren Beschreibungen warte ich noch bis heute. Aber das war mir schon klar. Die wollen schließlich ihre eigene Software verkaufen.


Ich werde das in den nächsten Tagen mit den Shape's testen und mich wieder melden.

Bis dahin einen herzlichen Dank

Alexander Lang
________________________


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz