fix: Fussabdruecke aller Festbauteile im Segmentbudget (Modus 2)

Leitsatz, aus dem alle Einzelaenderungen folgen (neu als Abschnitt 0 in
doc/VarioFoerderer_Linienzug_Prinzipien.md): die gezeichneten GERADEN
besitzen den Pfad, ein gezeichneter Bogen ist Hilfsgeometrie und nennt nur
Ort und Drehsinn. Jedes fest gebaute Teil zieht seine Laenge von dem
Segment ab, auf dem es steht - und zwar in LAENGEN- UND HOEHENbilanz mit
demselben, GEMESSENEN Wert.

Behoben:
- AS-Element: Fussabdruck wurde bei vf-start = 0 gar nicht abgezogen
  (die Trimmung lief nur im Front-Lauf, der dort leer ist). Jetzt gemessen
  aus dem gebauten KS_AUS - ein aus dem Block-dx gerechneter Wert lag
  184 mm daneben.
- Abschlussbogen + Motorstation: standen auf dem letzten Segment des
  VF-Laufs, fehlten aber im Budget (feste-vf traegt den Motor nur im Zweig
  OHNE flache Zone).
- ES-Element: die letzte Gerade reservierte nur den Laengsanteil. Jetzt die
  Strecke, die auch den Querversatz aufhebt (vfl-es-achs-reserve) - Vorgabe:
  quer zur KS_AUS-Achse MUSS 0 sein, laengs darf abweichen, dZ MUSS 0 sein.
- ES-Abzug griff auch, wenn ein Back-Lauf zwischen VF-Lauf und ES liegt,
  und verkuerzte dann das falsche Segment um die volle ES-Laenge (878 mm).
  Jetzt nur noch bei direktem Anschluss (vf-ende = n-1).
- Eck-Bauteile: Vario-Kurve/Gefaellebogen ersetzen den gezeichneten Bogen
  mit eigenem Fussabdruck. Die Differenz der Tangentenabstaende geht als
  Zuschlag an beide angrenzenden Geraden (vfl-eck-korrekturen/-zerlegen),
  damit die Mittellinie beide beruehrt. Der gezeichnete Radius kuerzt sich
  dabei heraus. GF-Boegen werden geneigt eingebaut - ihr Grundriss-
  Fussabdruck wird mit vfl-projiziere-neigung projiziert.
- Kletterlaenge wurde anteilig mit der Planlaenge im Zaehler und dem
  korrigierten climber-span im Nenner verteilt; die Anteile summierten sich
  dadurch auf weniger als 1.
- Absturz bei fehlendem Uebergangsbogen: get-bogen-mass wurde zweimal fuer
  dieselbe Suche aufgerufen und sein nil ungeprueft an
  vfl-projiziere-neigung gereicht.

Messreihe ueber die Sitzung (gleicher Pfad, Abweichung quer):
695.7 -> 270 -> 139.5 -> 98.5 -> 45.7 -> 2.4 -> 0.2 mm, dZ durchgehend 0.
Beide Pfad-Varianten (Ecke als Vario-Kurve bzw. als GF-Bogen) landen auf
demselben Wert - 0.2 mm ist die Messaufloesung, kein Restfehler.

21 neue file-freie Unit-Tests mit den echten Messwerten; TEST_UNIT 866/866.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-10-26 14:29:43 +01:00
parent aabac03d7c
commit ce4ad0f328
5 changed files with 1231 additions and 31 deletions
+60 -1
View File
@@ -409,7 +409,7 @@
;; vfl-par-gf-laenge - wie lang wird das GF-Stueck dazwischen?
;; Die Plan-Turn-Werte unten sind die Vorzeichen-Konvention aus
;; vf-element-plan-turn (KS_EIN -> KS_AUS in der XY-Ebene, links positiv).
(defun tu-tests-vfl-parallel ( / _b30 _b60 _b90 _kand _l _plan _plan3 _g _p _w)
(defun tu-tests-vfl-parallel ( / _b30 _b60 _b90 _kand _l _plan _plan3 _g _p _w _ez)
(princ "\n[vf_linienzug Parallel zum Kreisel]")
;; --- Bogenwahl: der Bogen muss den AS-Schwenk GENAU aufheben ---
@@ -516,6 +516,65 @@
(tu-nil "vfl-m2-anfang/kein-string" (vfl-m2-anfang-norm 3))
(tu-nil "vfl-m2-anfang/nil" (vfl-m2-anfang-norm nil))
;; --- Eck-Korrektur: gezeichneter Bogen gegen Eck-Bauteil ---
;; Die Ecke des Pfads wird durch ein reales Bauteil ersetzt, dessen
;; Fussabdruck abweichen darf. Die Differenz wird auf die Richtungen der
;; beiden angrenzenden Geraden zerlegt. Werte aus dem echten Lauf vom
;; 2026-10-26: 90-Grad-Ecke, Pfad R500 (Sehne 707.1 -> 500/-500), gebaute
;; Vario-Kurve wirkt wie R406.2 -> je 93.78 mm auf beide Nachbargeraden.
(setq _ez (vfl-eck-zerlegen 500.0 -500.0 406.22 -406.22 (- (/ pi 2.0))))
(tu-eqf "vfl-eck-zerlegen/90-grad-davor" 93.78 (car _ez))
(tu-eqf "vfl-eck-zerlegen/90-grad-danach" 93.78 (cadr _ez))
;; 30-Grad-Ecke links, Gefaellebogen R500 trifft den Pfad fast exakt:
;; nur 0.85 mm, und zwar ausschliesslich auf der Geraden DAVOR.
(setq _ez (vfl-eck-zerlegen 250.0 66.99 249.15 66.99 (/ pi 6.0)))
(tu-eqf "vfl-eck-zerlegen/30-grad-davor" 0.85 (car _ez))
(tu-eqf "vfl-eck-zerlegen/30-grad-danach" 0.0 (cadr _ez))
;; Deckungsgleiches Bauteil -> kein Zuschlag auf keiner Seite.
(setq _ez (vfl-eck-zerlegen 500.0 -500.0 500.0 -500.0 (- (/ pi 2.0))))
(tu-eqf "vfl-eck-zerlegen/gleich-davor" 0.0 (car _ez))
(tu-eqf "vfl-eck-zerlegen/gleich-danach" 0.0 (cadr _ez))
;; Ohne Schwenk ist die Zerlegung nicht eindeutig - nil statt Division durch 0.
(tu-nil "vfl-eck-zerlegen/ohne-schwenk"
(vfl-eck-zerlegen 100.0 0.0 90.0 0.0 0.0))
;; GF-Boegen werden GENEIGT eingebaut: ihr Grundriss-Fussabdruck ist kuerzer
;; als flach gemessen, und genau diese Differenz muss in die Eck-Korrektur.
;; Werte aus dem echten Lauf 2026-10-26: Gefaellebogen_rechts_90_R500 flach
;; dx=500 dz=-28.6, bei 3 Grad eingebaut 497.8 - die 2.2 mm blieben vorher
;; als Rest am Kettenende stehen. Negatives dz muss dabei VERKUERZEN.
(tu-eqf "vfl-projiziere-neigung/gf-bogen-3-grad"
(- (* 500.0 (cos (* 3.0 (/ pi 180.0))))
(* 28.6 (sin (* 3.0 (/ pi 180.0)))))
(car (vfl-projiziere-neigung 500.0 -28.6 3.0)))
(tu-true "vfl-projiziere-neigung/gf-bogen-kuerzer-als-flach"
(< (car (vfl-projiziere-neigung 500.0 -28.6 3.0)) 500.0))
;; Waagerecht eingebaut (Vario-Kurve) bleibt der Fussabdruck unveraendert.
(tu-eqf "vfl-projiziere-neigung/waagerecht" 500.0
(car (vfl-projiziere-neigung 500.0 -28.6 0.0)))
;; --- ES-Reservierung auf die KS_AUS-Achse ---
;; Vorgabe: quer zur KS_AUS-Achse MUSS 0 sein, laengs darf abweichen.
;; Der reine Laengsanteil reicht dafuer NICHT - er laesst den bauteileigenen
;; Querversatz stehen. Werte aus dem echten Lauf 2026-10-26:
;; ES_Element_30_rechts an einer Geraden mit hz=-60, Schwenk -30 Grad,
;; Fussabdruck (laengs 575.84 | quer -52.54). Reserve 484.8 statt 575.8 -
;; die Gerade wird also rund 91 mm laenger und hebt den Querversatz auf.
(tu-eqf "vfl-es-achs-reserve/echt-30-grad" 484.838050570331
(vfl-es-achs-reserve 575.84 -52.54 -60.0 -30.0))
;; Ohne Querversatz bleibt es beim reinen Laengsanteil.
(tu-eqf "vfl-es-achs-reserve/ohne-quer" 500.0
(vfl-es-achs-reserve 500.0 0.0 -60.0 -30.0))
;; Ohne Schwenk faellt die Achse mit der Fahrtrichtung zusammen - dann gibt
;; es keinen aufhebbaren Querversatz und der Laengsanteil ist richtig
;; (Nenner 0, Rueckfall statt Division durch null).
(tu-eqf "vfl-es-achs-reserve/ohne-schwenk" 575.84
(vfl-es-achs-reserve 575.84 -52.54 -60.0 0.0))
;; Richtungsunabhaengig: dieselbe Geometrie um 90 Grad gedreht gibt
;; denselben Wert - die Reserve haengt an den Winkeln zueinander, nicht
;; an der Lage im Welt-KS.
(tu-eqf "vfl-es-achs-reserve/gedreht" 484.838050570331
(vfl-es-achs-reserve 575.84 -52.54 30.0 -30.0))
;; --- Rueckwaerts bauen: Punkt entgegen der Fahrtrichtung zuruecksetzen ---
;; vfl-rueck-punkt ist der Rechenkern des Rueckwaerts-Baus: zu einem
;; BEKANNTEN Endpunkt den Startpunkt eines Bausteins finden. Vorwaerts gilt