fix(shape): 꺾임점 계단면을 미터면과 일치시킨다
계단 경계를 꺾임점에 맞춰도 각 구간의 계단면은 자기 축에 직각이고 미터면은 θ/2 기울어, 코핑 폭 안에서 ±(B/2)·tan(θ/2) (P11 ±0.12 m)의 삼각형 조각이 남았다. 꺾임점의 계단면을 각 구간 프로파일에서 미터 퍼짐 + 10 mm만큼 잘려 나가는 쪽으로 옮겨, 구간 0은 앞 상면을, 구간 1은 뒤 상면을 미터면까지 가져가게 한다. 3D와 도면 투영이 모두 미터면으로 자르므로 둘 다 반영된다. 퍼짐이 블럭 반폭 이상이면 바꾸지 않는다. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
a39a1ba8d2
commit
9f336e2be4
2 files changed
+36
-3
No files matched your search
@@ -89,3 +89,29 @@ describe('전·후열 나눔선 하나 (B, 2026-11-10)', () => {
|
||||
for (const k of [0, 1]) expect(split(m, k)).toBeCloseTo((meanN(m, '전열', k) + meanN(m, '후열', k)) / 2, 9);
|
||||
});
|
||||
});
|
||||
|
||||
describe('꺾임점 계단면 = 미터면 (2026-11-10)', () => {
|
||||
// Top of a stepped profile at s: the last top point at or before s.
|
||||
const topAt = (m: ReturnType<typeof buildPier>, profile: [number, number][], s: number) =>
|
||||
profile.slice(0, profile.findIndex(([ps]) => ps > s + 1e-9)).filter(([, z]) => z > m.endBottom + 1e-9).pop()![1];
|
||||
|
||||
it('over the whole mitre spread, stretch 0 keeps the top before the kink and stretch 1 the top after it', () => {
|
||||
const m = buildPier(p11());
|
||||
const kink = kinkOf(m);
|
||||
const spread = (m.copingB / 2) * Math.tan((8.767 * Math.PI) / 360);
|
||||
// The back part carries the ⑥|⑦ step at the kink: ⑥ top (back segment 1) before, ⑦ top (segment 2) after.
|
||||
expect(m.backSegments![2].s0).toBeCloseTo(kink, 9);
|
||||
const before = m.backSegments![1].top, after = m.backSegments![2].top;
|
||||
expect(after - before).toBeGreaterThan(0.5);
|
||||
const backPart = (k: number) => {
|
||||
const parts = m.copingParts.filter((p) => p.k === k);
|
||||
return parts.find((p) => p.profile.some(([, z]) => Math.abs(z - after) < 1e-9))!;
|
||||
};
|
||||
// Stretch 0 (local s = g): just short of the far edge of the mitre spread, still the ⑥ top.
|
||||
expect(topAt(m, backPart(0).profile, kink + spread - 1e-6)).toBeCloseTo(before, 9);
|
||||
// Stretch 1 (local s = g − kink): just past the near edge of the spread, already the ⑦ top.
|
||||
expect(topAt(m, backPart(1).profile, -spread + 1e-6)).toBeCloseTo(after, 9);
|
||||
// Away from the kink the profiles are unchanged: the ⑦ top in stretch 0 a block past the kink.
|
||||
expect(topAt(m, backPart(0).profile, kink + DIM.blockSize / 2 + 0.1)).toBeCloseTo(after, 9);
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user