![]() |
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 ![]() 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 ![]() 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 |
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. |
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 |
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 |
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... |
Re: Gradmaß zu X,Y Koordinaten
Dein Problem ist doch eigentlich die Umrechnung von kartesischen in Polarkoordinaten, oder? Dann sollte dir
![]() 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? |
Re: Gradmaß zu X,Y Koordinaten
Arcus-Tangens (ArcTan) sollte das Mittel der Wahl sein ...
Gruß Matthias |
Re: Gradmaß zu X,Y Koordinaten
Nein. Er will doch von der polaren Darstellung zur kartesischen und nicht umgekehrt.
|
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:
Guck mal wie das in etwa stimmt.
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; |
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:
![]() 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 19:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz