# クラスター自動推定をやめ、手動の組み替え操作を持つ ## 結論 KLE取り込み時のクラスター自動推定(P-3)は採らない。代わりに、絶対配置を保ったままクラスターを 作り・原点と基準角度を動かせる手動操作をエディタの基本機能として持つ。 自動推定が不要になった理由ではなく、そもそも手動操作が独立に必須だった、という結論。 PHYレイヤー.md の既存記述が2箇所でこれを前提にしていた。 - 「回転中心を保存したい場合はクラスターにする」 — 後から原点を置く手段がなければ使えない - 「照合できないキーは root 直下に新規キーとして置く。クラスターへの割り当てはユーザーが行う」 ## 案の比較 | 案 | 過去のKLE資産 | 誤り | | --- | --- | --- | | 自動推定 | 一発で階層が付く場合がある | 推定を外したときユーザーが直せない(直す手段=手動操作がないため) | | 手動の組み替え | 選択してまとめる手数がかかる | ユーザーの意図がそのまま入るので誤りがない | | 両方 | 同上 | 手動操作があれば推定の価値は初期値の提案に落ちる。初期値は小さく済む(下記) | 「両方」を棄却したのではなく、手動操作を定義した時点で推定の取り分が 「クラスター化時に選択キーの共通角度を基準角度の初期値に採る」程度まで縮んだ。 これは「どのキーをまとめるか」を機械が決めていないので、自動推定とは別物として本文に入れた。 ## 2つの演算への還元 思いついた操作(グループ化・出し入れ・解除・原点移動・基準角度変更)は全部これで書ける。 - reparent: `M_i' = M_C⁻¹ · M_i` - reframe: `M_i' = M_C'⁻¹ · M_C · M_i` Transform が回転+平行移動のみ = 剛体変換の群なので、合成と逆変換について閉じている。 せん断・拡縮が出てこないので、結果は必ず Transform で表せる。ここが成立しなければ 「絶対座標を変えないまま」は近似になっていた。 Size / switchOffset / orientation はローカル値で親の変換を受けない定義なので、影響を受けない。 ## スナップとの衝突 基準角度を15度の倍数でない値にすると、配下の平行移動成分に `R(-θ)` が掛かって非グリッド値になる。 ここを丸めると絶対配置が動く = 機能の目的が崩れる。よって2つ決めた。 - スナップは手作業の入力時のみ。計算結果には適用しない - グリッドは操作開始時の値を基準とする相対グリッド。ローカル原点基準の絶対グリッドにしない (非グリッド値を持つキーを後から掴んだとき、絶対配置が勝手に動くのを防ぐ) ## 浮動小数の累積(実装時の注意、本文には書かない) 原点・角度の調整を繰り返すと `M_C'⁻¹ · M_C` の合成が積み重なる。 対話操作の間は操作開始時の絶対座標スナップショットを基準に relative を再計算すれば、 誤差は1操作ぶんに収まる。相対座標が正本であることとは矛盾しない(セッション中の作業用の値)。