Karte: die Welt ist doppelt so breit wie mapSize
Die Parzellen lagen im Wald. Ich hatte -mapSize/2 bis +mapSize/2 angenommen — naheliegend beim Namen, aber falsch: die Koordinaten laufen von -mapSize bis +mapSize. Damit wurde jede Parzelle um Faktor zwei vom Mittelpunkt weggezogen. Schlimmer als der Fehler war meine Pruefung. Der Zonentest hat die Koordinaten auf ihre eigene Bounding-Box normiert und danach geschaut, ob die Felder in der richtigen Ecke liegen. Das besteht bei JEDEM Massstab, weil die Anordnung zueinander ja stimmt. 14 von 15 Treffern klangen ueberzeugend und sagten ueber den Massstab genau nichts aus. Gemessen wurde es dann so: die eingebrannte Legende steht sowohl im Feed-Bild als auch im Ingame-Screenshot, damit laesst sich der eine aufs andere umrechnen. Vier Parzellen an den vier Ecken ergaben eine Weltbreite von 7822 bei mapSize 4096 — Faktor 1,91 bei rund 5 Prozent Ablesegenauigkeit. Dabei ist noch etwas herausgekommen: die Marken H1..H8 auf dem Luftbild sind als Passpunkte hervorragend, nicht wertlos, wie ich in der Doku behauptet hatte. Mit richtigem Massstab liegen alle acht Hofparzellen unter 13 px von ihrer Marke; mit falschem rund 200. Das ist jetzt der Test — acht Passpunkte, die jede kuenftige Verschiebung sofort auffliegen lassen, statt eines Zonenvergleichs, der alles durchwinkt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+18
-9
@@ -40,17 +40,26 @@ welchem Hof gehört, steht in keinem Endpunkt — deshalb die Zuordnung im Panel
|
|||||||
|
|
||||||
## Koordinaten
|
## Koordinaten
|
||||||
|
|
||||||
Weltkoordinaten laufen von `-mapSize/2` bis `+mapSize/2`. Auf das Luftbild
|
**x nach rechts, z nach unten, und die Welt läuft von `-mapSize` bis
|
||||||
gerechnet: **x nach rechts, z nach unten**, linear über die volle Breite.
|
`+mapSize`** — also doppelt so weit, wie der Name vermuten lässt.
|
||||||
|
|
||||||
Gegen die Ingame-Karte geprüft: 14 von 15 markanten Feldnummern landen in der
|
Das ist die Stelle, an der man zweimal falsch abbiegt:
|
||||||
richtigen Zone. Der eine Ausreisser ist ein sehr grosses Feld, dessen
|
|
||||||
Schwerpunkt knapp über einer Zonengrenze liegt.
|
|
||||||
|
|
||||||
**Die eingebrannten Beschriftungen H1…H8 im Luftbild taugen nicht zum
|
`-mapSize/2 … +mapSize/2` wirkt naheliegend und sieht auf den ersten Blick
|
||||||
Kalibrieren.** Die zeichnet der Map-Ersteller ans Hofgebäude, nicht in den
|
sogar richtig aus, weil die Parzellen zueinander stimmen. Tatsächlich zieht es
|
||||||
Schwerpunkt der Parzelle, und die Nummern daneben müssen nicht zur Farmland-ID
|
jede Parzelle um Faktor zwei vom Mittelpunkt weg, und am Ende liegen die
|
||||||
passen. Wer daran ausrichtet, landet gut 200 px daneben.
|
Felder im Wald.
|
||||||
|
|
||||||
|
Ein Test, der die Koordinaten auf ihre eigene Bounding-Box normiert, merkt das
|
||||||
|
**nicht** — er prüft nur die Anordnung und besteht bei jedem Maßstab.
|
||||||
|
|
||||||
|
### Woran man es festmacht
|
||||||
|
|
||||||
|
Viele Karten tragen eingebrannte Marken `H1…H8` mit einer Legende, welche
|
||||||
|
Parzelle das ist (`131 H1`, `132 H2`, …). Das sind acht kostenlose Passpunkte.
|
||||||
|
Mit dem richtigen Maßstab liegen die Parzellen-Schwerpunkte **unter 15 px** von
|
||||||
|
ihrer Marke entfernt, gemessen auf einem 1024er Bild; mit dem falschen rund
|
||||||
|
200 px. Der Unterschied ist so deutlich, dass eine einzige Prüfung reicht.
|
||||||
|
|
||||||
## Was es nicht gibt
|
## Was es nicht gibt
|
||||||
|
|
||||||
|
|||||||
+16
-4
@@ -161,12 +161,24 @@ export const hofFarbe = (hof) => HOF_FARBEN[(hof - 1) % HOF_FARBEN.length];
|
|||||||
const esc = (s) => String(s).replace(/[<>&"']/g, (c) =>
|
const esc = (s) => String(s).replace(/[<>&"']/g, (c) =>
|
||||||
({ '<': '<', '>': '>', '&': '&', '"': '"', "'": ''' }[c]));
|
({ '<': '<', '>': '>', '&': '&', '"': '"', "'": ''' }[c]));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wie breit ist die Welt auf dem Luftbild?
|
||||||
|
*
|
||||||
|
* Nicht `mapSize`, sondern das Doppelte: die Koordinaten laufen von -mapSize
|
||||||
|
* bis +mapSize. Gemessen, nicht geraten — vier Parzellen an den vier Ecken
|
||||||
|
* gegen die Ingame-Karte gerechnet ergaben 7822 bei mapSize 4096, also
|
||||||
|
* Faktor 1,91 bei einer Ablesegenauigkeit von rund 5 %.
|
||||||
|
*
|
||||||
|
* Wer -mapSize/2..+mapSize/2 annimmt, zieht alles um Faktor zwei vom
|
||||||
|
* Mittelpunkt weg. Das sieht auf den ersten Blick plausibel aus, weil die
|
||||||
|
* Anordnung zueinander stimmt — nur liegt dann jede Parzelle im Wald.
|
||||||
|
*/
|
||||||
|
export const WELT_FAKTOR = 2;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Die Karte als SVG.
|
* Die Karte als SVG.
|
||||||
*
|
*
|
||||||
* Weltkoordinaten laufen von -groesse/2 bis +groesse/2; x nach rechts, z nach
|
* x nach rechts, z nach unten, linear über das ganze Luftbild.
|
||||||
* unten, linear über das ganze Luftbild. Das ist gegen die Ingame-Karte
|
|
||||||
* geprüft: 14 von 15 markanten Feldnummern landen in der richtigen Zone.
|
|
||||||
*
|
*
|
||||||
* @param {object} stand Ergebnis von statsLesen()
|
* @param {object} stand Ergebnis von statsLesen()
|
||||||
* @param {string} bildB64 Luftbild vom Server als base64-JPEG
|
* @param {string} bildB64 Luftbild vom Server als base64-JPEG
|
||||||
@@ -174,7 +186,7 @@ const esc = (s) => String(s).replace(/[<>&"']/g, (c) =>
|
|||||||
* @param {Record<number,string>} namen Hof-Nummer → Anzeigename
|
* @param {Record<number,string>} namen Hof-Nummer → Anzeigename
|
||||||
*/
|
*/
|
||||||
export function karteSvg(stand, bildB64, S = 1024, namen = {}) {
|
export function karteSvg(stand, bildB64, S = 1024, namen = {}) {
|
||||||
const G = stand.groesse;
|
const G = stand.groesse * WELT_FAKTOR;
|
||||||
const px = (w) => ((w + G / 2) / G) * S;
|
const px = (w) => ((w + G / 2) / G) * S;
|
||||||
const teile = [];
|
const teile = [];
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user