fix(shape): 꺾임점 근처 계단 경계를 꺾임점에 맞춘다
계단 경계가 꺾임점에서 블럭 반폭(0.6 m) 이내이면 경계를 꺾임점으로 옮겨, 계단면이 미터면과 같아져 두 구간이 쐐기 틈 없이 만난다 (산외교 P11 후열 ⑥|⑦: 15.07 → 15.14). 양쪽 받침이 꺾임점에서 블럭 반폭 이상 떨어질 때만 옮긴다. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
bd84ac6176
commit
9777938aa8
2 files changed
+62
-2
No files matched your search
@@ -334,9 +334,14 @@ export function buildPier(input: PierInput, ctx: PierContext = {}): PierModel {
|
||||
if (unequalRows) { frontPlaced.sort((a,b)=>a.g-b.g); backPlaced.sort((a,b)=>a.g-b.g); }
|
||||
|
||||
// Step boundaries sit midway between consecutive front bearings in coping coordinates (spec §4.3).
|
||||
// A step boundary less than half a block from the kink moves onto it (2026-11-10), so the step face is the mitre
|
||||
// plane and the two stretches meet without a wedge; only when both bearings stay half a block away from the kink.
|
||||
const halfBlock = DIM.blockSize / 2;
|
||||
const toKink = (bound: number, gLeft: number, gRight: number) =>
|
||||
kinkG !== null && Math.abs(bound - kinkG) < halfBlock && kinkG - gLeft >= halfBlock && gRight - kinkG >= halfBlock ? kinkG : bound;
|
||||
const bounds = [0];
|
||||
for (let k = 0; k < frontPlaced.length - 1; k++) {
|
||||
bounds.push((frontPlaced[k].g + frontPlaced[k + 1].g) / 2);
|
||||
bounds.push(toKink((frontPlaced[k].g + frontPlaced[k + 1].g) / 2, frontPlaced[k].g, frontPlaced[k + 1].g));
|
||||
}
|
||||
bounds.push(L);
|
||||
// 교좌면 EL per bearing (2026-11-10): when given, it is the coping top of that bearing's step; otherwise z − h1 (z − h2 behind).
|
||||
@@ -349,7 +354,7 @@ export function buildPier(input: PierInput, ctx: PierContext = {}): PierModel {
|
||||
// front bound snaps to it, so slightly staggered rows (P1, ≈ 0.09 m) keep one boundary and no sliver step.
|
||||
const backBound = (k: number) => {
|
||||
const own = (backPlaced[k-1].g + backPlaced[k].g) / 2;
|
||||
return !unequalRows && Math.abs(own - bounds[k]) < DIM.blockSize / 2 ? bounds[k] : own;
|
||||
return !unequalRows && Math.abs(own - bounds[k]) < halfBlock ? bounds[k] : toKink(own, backPlaced[k-1].g, backPlaced[k].g);
|
||||
};
|
||||
const backSegments: Segment[] = backPlaced.map((b,k) => ({
|
||||
s0: k === 0 ? 0 : backBound(k),
|
||||
|
||||
Reference in new issue
Block a user