Voraussetzung: "Globaler Code - Teil I“
Nachdem ich den ersten Teil des globalen Code hier im Blog vorgestellt habe, wollte ich mal eben schnell den nächsten Beitrag schreiben wo es um Convenience-Angebote für den Spieler geht. U.a sollen die Finalkoordinaten lesbar ausgegeben werden.
Es dürfte so gut wie jeder WIG-Owner sich schon desöftern über das für uns ungewohnte Dezimalgrad-Format (z.B
Als Geocacher ist man ja eher das Grad, Dezimalminuten-Format (
Und wenn man dann noch Koordinaten in lua als
Abb.1 zeigt uns mit
Beginnend mit der
Die Umrechnung des Nachkommateil der Dezimalgrad in Minuten und Dezimalminuten habe ich ausgeglieder da es später beim Längenanteil der Koordinaten wiederverwendet werden kann.
Dabei wird in Zeile 81 der Nachkommaanteil mit 60 multipliziert und auf drei Stellen hinterm Komma gerundet.
Dies geschieht in Zeile 82 wo mit
Bleibt noch die Runden-Funktion, die gibt es in lua nämlich nicht fertig. Jedenfalls nicht für Dezimalzahlen. Man kann eine Dezimalzahl auf den Ganzteil abrunden (2.88484 => 2) oder aufrunden (4.127 => 5). Um mathematisch Runden zu können bedient man sich eines Trickes, indem man mit
Bsp.: 2,6 + 0,5 ergäbe 3,1; abgerundet mit math.floor ergibt 3. Gegenbeispiel 2,3 + 0,5 ergibt 2,8; abgerundet auf den Ganzzahlanteil ergibt 2.
Wem jetzt der Schädel wegen zu viel Mathe qualt, der sei beruhigt, das war's mit Mathe, nun kommt nur noch eine Abkürzung für's Debug-Logging.
Wie ich bereits in Einen Wherigo debuggen beschrieben habe, ist es oft ziemlich hilfreich mit
Da der Informatiker faul ist, ergibt sich die "Notwendigkeit" das mit
Die Zeilen 95 - 99 beschäftigen sich mit dem Problem, dass man in lua keinen String mit nil oder nem Boolean verknüpfen kann. So ist gesichert, dass in Zeile 101 nur Zahlen und Strings konkateniert werden.
Nachdem ich den ersten Teil des globalen Code hier im Blog vorgestellt habe, wollte ich mal eben schnell den nächsten Beitrag schreiben wo es um Convenience-Angebote für den Spieler geht. U.a sollen die Finalkoordinaten lesbar ausgegeben werden.
Es dürfte so gut wie jeder WIG-Owner sich schon desöftern über das für uns ungewohnte Dezimalgrad-Format (z.B
50.6651666666667N
7.4682E
) bei der Koordinatenverarbeitung in Urwigo geärgert haben.
Als Geocacher ist man ja eher das Grad, Dezimalminuten-Format (
N 50° 39.910, E 7° 28.092
) gewöhnt
sein.
Und wenn man dann noch Koordinaten in lua als
Waypoint
direkt definiert (Wherigo.ZonePoint(50.6651666666667,
7.4682, 0)
) ist die manuelle Hin- und Herrechnerei ziemlich aufwändig.
In manchen Fällen ist es empfehlenswert die Koordinaten lesbar auf dem Display auszugeben, z.B. wenn der Final etwas
kompliziert zu erreichen ist. Damit man neben dem Wherigo-ZonePoint keine extra String-Version der Koordinaten im
Dezimalminuten-Format im Code zu pflegen hat, empfiehlt es sich das ganze automatisch umrechnen zu lassen. Kommt
vorallem gut, wenn sich die Location ändert, oder ne neue Location hinzukommt.
Abb.1 zeigt uns mit
buildReadableCoorString
eine Helfermethode die genau dies macht. Zunächst wird in
Zeile 71 und 72 der Waypoint in den Breiten- und Längengrad aufgesplittet.
Beginnend mit der
latitude
also dem Breitengrad werden mit math.floor
der
Vorkommateil, also die Gradzahlen abgeschnitten und abgezogen vom ganzen der Nachkommateil gebildet. (Zeile 74.
lat - tmp
).
Die Umrechnung des Nachkommateil der Dezimalgrad in Minuten und Dezimalminuten habe ich ausgeglieder da es später beim Längenanteil der Koordinaten wiederverwendet werden kann.
Dabei wird in Zeile 81 der Nachkommaanteil mit 60 multipliziert und auf drei Stellen hinterm Komma gerundet.
N 50° 39.9100023347
sähe nicht so gelungen aus.
Als Ergebnis würde N 50° 39.91
herauskommen was auch nicht zu 100% korrekt aussieht. Es fehlt die
abschießende 0.
Dies geschieht in Zeile 82 wo mit
string.format("%.3f", val)
auf 3 Stellen hinterm Komma (bzw. Punkt) mit
Nullen aufgefüllt wird.
Bleibt noch die Runden-Funktion, die gibt es in lua nämlich nicht fertig. Jedenfalls nicht für Dezimalzahlen. Man kann eine Dezimalzahl auf den Ganzteil abrunden (2.88484 => 2) oder aufrunden (4.127 => 5). Um mathematisch Runden zu können bedient man sich eines Trickes, indem man mit
+ 0.5
die Rundungsgrenze auf die ganze
Zahl verschiebt und dann abrundet.
Bsp.: 2,6 + 0,5 ergäbe 3,1; abgerundet mit math.floor ergibt 3. Gegenbeispiel 2,3 + 0,5 ergibt 2,8; abgerundet auf den Ganzzahlanteil ergibt 2.
mult = 10 ^ (idp or 0)
ergibt 1000, da idp mit 3 (Nachkommastellen) übergeben wird. In der Schule
haben ja gelernt: Multiplikation mit 10 hoch x heißt das Komma um x Stellen nach rechts verschieben.
Aus 0,9100023347 wird dann 910,0023347; das ganze addiert um 0,5 => 910,5023347; auf Ganzzahlanteil abgerundet =>
910; Zum Schluss wird das Komma wieder um drei Stellen nach links verschoben, d.h. Division durch 10 hoch 3 = 1000
- ergibt 0,91
Wem jetzt der Schädel wegen zu viel Mathe qualt, der sei beruhigt, das war's mit Mathe, nun kommt nur noch eine Abkürzung für's Debug-Logging.
Wie ich bereits in Einen Wherigo debuggen beschrieben habe, ist es oft ziemlich hilfreich mit
print
den aktuellen Stand von
Variablen auf die Simulatorkonsole zu schreiben.
Da der Informatiker faul ist, ergibt sich die "Notwendigkeit" das mit
p
abzukürzen.
pt
hingegen bringt uns jetzt noch echten Mehrwert, indem vor die Logzeile die aktuelle Uhrzeit
geschrieben wird. So kann man leichter zusammenhängende Aktionen erkennen und sich besser durch die
Von-Oben-Nach-Unten Syntax des Logfiles wühlen. Es gibt übrigens keine Genauigkeit auf den Millisekundenbereich. Die
Sekunde ist die kleinste Zeiteinheit, die ihr im Wherigo messen könnt.
Die Zeilen 95 - 99 beschäftigen sich mit dem Problem, dass man in lua keinen String mit nil oder nem Boolean verknüpfen kann. So ist gesichert, dass in Zeile 101 nur Zahlen und Strings konkateniert werden.
Damit die Umrechnung der Koordinaten auch in anderen Hemisphären als nur N und E funktioniert habe ich eine Funktion angepasst:
AntwortenLöschenfunction buildReadableCoorString(waypoint)
local lon = waypoint.longitude
local lat = waypoint.latitude
local str = ""
local tmp
-- latitude
tmp = math.floor(math.abs(lat))
if lat > 0 then
str = str .. "N"
else
str = str .. "S"
end
str = str .. tmp .. " " .. buildMinAndDecimalMin(math.abs(lat) - tmp)
-- longitude
tmp = math.floor(math.abs(lon))
if lon > 0 then
str = str .. " E "
else
str = str .. " W "
end
str = str .. tmp .. " " .. buildMinAndDecimalMin(math.abs(lon) - tmp)
return str
end
Wenn Sie den Service eines zuverlässigen Hackers benötigen, um ein Handy oder eine Datenbank zu hacken, Strafregister zu löschen oder Ihr gestohlenes Bitcoin wiederherzustellen, wenden Sie sich an easybinarysolutions@gmail.com oder whatsapp: +1 3478577580
AntwortenLöschen