[FIX] Weltposition verpackter Separator_SP-Symbole bei gekippten Ketten
ssg-collect-nested-inserts-rel/csv:sep-proxies-erzeugen nahmen bislang eine reine Z-Drehung ohne OCS-/Extrusionsrichtung an. Fuer die um den Gefaelle-/ Neigungswinkel gekippte Staustrecke/Separator-Kette (Gefaellestrecke.lsp, vf_standard.lsp) ist das falsch: die eingebettete Separator_SP-Weltposition blieb dadurch unabhaengig von der gewaehlten Fahrtrichtung eingefroren. Fix generalisiert die Rotationskomposition auf volle 3x3-Matrizen (Arbitrary Axis Algorithm fuer die Extrusion, neue mat3-*-Helfer in ssg_core.lsp statt vf_core.lsp, da ssg_core immer vor jedem Feature-Modul geladen ist). Fuer flache Elemente (Extrusion (0 0 1)) reduziert sich das exakt auf die alte reine Z-Drehung - kein Verhaltensunterschied dort. Verifiziert per Python/ezdxf-Nachbau des neuen Algorithmus gegen die drei real gebauten Testzeichnungen (data/gf.dxf, data/gf_north.dxf, data/gf_south.dxf): liefert jetzt fuer alle drei Fahrtrichtungen exakt die unabhaengig berechnete Grundwahrheit statt eines eingefrorenen Werts. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+9
-36
@@ -119,42 +119,15 @@
|
||||
;; ============================================================
|
||||
;; TEIL 4b: KS-FRAME MATHEMATIK
|
||||
;; ============================================================
|
||||
|
||||
;; Vektorkreuzprodukt a x b
|
||||
(defun vec3-cross (a b)
|
||||
(list (- (* (cadr a)(caddr b)) (* (caddr a)(cadr b)))
|
||||
(- (* (caddr a)(car b)) (* (car a)(caddr b)))
|
||||
(- (* (car a)(cadr b)) (* (cadr a)(car b)))))
|
||||
|
||||
;; Vektor auf Einheitslaenge normieren
|
||||
(defun vec3-normalize (v / len)
|
||||
(setq len (vec-length v))
|
||||
(if (> len 1e-10)
|
||||
(list (/ (car v) len) (/ (cadr v) len) (/ (caddr v) len))
|
||||
'(1.0 0.0 0.0)))
|
||||
|
||||
;; 3x3-Rotationsmatrix (Zeilenliste) mal 3D-Vektor
|
||||
(defun mat3-mul-vec3 (R v / r0 r1 r2)
|
||||
(setq r0 (car R) r1 (cadr R) r2 (caddr R))
|
||||
(list (+ (* (car r0)(car v)) (* (cadr r0)(cadr v)) (* (caddr r0)(caddr v)))
|
||||
(+ (* (car r1)(car v)) (* (cadr r1)(cadr v)) (* (caddr r1)(caddr v)))
|
||||
(+ (* (car r2)(car v)) (* (cadr r2)(cadr v)) (* (caddr r2)(caddr v)))))
|
||||
|
||||
;; Rotationsmatrix R sodass: R*xe=xt, R*ye=yt, R*ze=zt
|
||||
;; (xt yt zt) = Ziel-Achsen; (xe ye ze) = Quell-Achsen (je normierte Einheitsvektoren)
|
||||
;; Formel: R = M_target * M_source^T
|
||||
;; R[i][j] = xt[i]*xe[j] + yt[i]*ye[j] + zt[i]*ze[j]
|
||||
(defun mat3-from-frames (xt yt zt xe ye ze)
|
||||
(list
|
||||
(list (+ (* (car xt)(car xe)) (* (car yt)(car ye)) (* (car zt)(car ze)))
|
||||
(+ (* (car xt)(cadr xe)) (* (car yt)(cadr ye)) (* (car zt)(cadr ze)))
|
||||
(+ (* (car xt)(caddr xe)) (* (car yt)(caddr ye)) (* (car zt)(caddr ze))))
|
||||
(list (+ (* (cadr xt)(car xe)) (* (cadr yt)(car ye)) (* (cadr zt)(car ze)))
|
||||
(+ (* (cadr xt)(cadr xe)) (* (cadr yt)(cadr ye)) (* (cadr zt)(cadr ze)))
|
||||
(+ (* (cadr xt)(caddr xe)) (* (cadr yt)(caddr ye)) (* (cadr zt)(caddr ze))))
|
||||
(list (+ (* (caddr xt)(car xe)) (* (caddr yt)(car ye)) (* (caddr zt)(car ze)))
|
||||
(+ (* (caddr xt)(cadr xe)) (* (caddr yt)(cadr ye)) (* (caddr zt)(cadr ze)))
|
||||
(+ (* (caddr xt)(caddr xe)) (* (caddr yt)(caddr ye)) (* (caddr zt)(caddr ze))))))
|
||||
;; vec3-cross/vec3-normalize/mat3-mul-vec3/mat3-from-frames (und die
|
||||
;; OCS-/Extrusions-Helfer mat3-mul-mat3/mat3-ocs-basis/mat3-ocs-matrix/
|
||||
;; mat3-rz/mat3-from-normal-rotation) sitzen in ssg_core.lsp, nicht hier:
|
||||
;; ssg-collect-nested-inserts-rel (Export-Zuordnung verpackter Separatoren)
|
||||
;; braucht sie ebenfalls und ist ein CORE-Modul, das IMMER vor vf_core.lsp
|
||||
;; geladen ist - vf_core.lsp selbst ist nur ein Feature-Modul (nicht jede
|
||||
;; Zeichnung laedt VarioFoerderer). Damit beide Seiten dieselbe, einzige
|
||||
;; Definition nutzen, wohnen die allgemeinen Vektor-/Matrix-Helfer im immer
|
||||
;; geladenen Core (wie ssg-rot-matrix-zy schon dort wohnt) statt hier.
|
||||
|
||||
;; Normierter KS-Rahmen aus rohen KS-Daten (origin x-end y-end z-end)
|
||||
;; Eingabe: Teilliste aus extract-ks-from-block-raw, z.B. (cadr (assoc "KS_EIN" ks-data))
|
||||
|
||||
Reference in New Issue
Block a user