fix(abut): 말뚝 머리를 저판 안으로 100 mm 넣어 바닥면 줄무늬(z-fighting) 제거

- 말뚝 윗면이 저판 바닥·버림 윗면과 같은 높이에 있어, 아래에서 보면 원 안에 줄무늬가 생겼음
- 그리는 말뚝 머리를 저판 안으로 0.1 m 넣어 윗면이 저판 속에 숨도록 함. 선단 EL은 그대로
- 테스트 1건 추가. 전체 662건 통과, 타입 검사 · 빌드 통과

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ypshimandClaude Opus 5.5 committed 2026-11-04 08:53:46 +09:00
1 parent 372d759eb7
commit 4eb92d381d
2 files changed
+12 -1

No files matched your search

+5 -1
View File
@@ -21,6 +21,8 @@ const SLAB_LENGTH_M = 7;
const SLAB_FALL = 0.04;
/** 접속슬래브와 날개벽 안쪽면 사이 간격 (m), spec_abut §4.8 "날개벽 20". */
const SLAB_CLEARANCE_M = 0.02;
/** 말뚝 두부 매입 (m): the drawn pile head goes this far into the 저판 (drawing only). */
const PILE_HEAD_EMBED_M = 0.1;
/** Eight-corner slab with its top sloping away from the wall. Indexed by (s end, t end, bottom/top). Double-sided: the winding is not critical. */
function slabGeometry(plan: [number, number][], bottomEl: (s: number, t: number) => number): THREE.BufferGeometry {
@@ -289,7 +291,9 @@ export function buildAbutGroup(
// 말뚝: 원기둥 (지름 입력, 기본 D600) at each row, from the 기초 하단 down to the 선단.
if (members.pileBottomEl !== undefined && footingBottom !== undefined) {
const height = footingBottom - members.pileBottomEl;
// The pile head runs PILE_HEAD_EMBED_M into the 저판, so its top cap is hidden inside the slab and does not z-fight
// with the 저판 bottom (the striped discs seen from below, 2026-11-04). The 선단 EL is unchanged.
const height = footingBottom + PILE_HEAD_EMBED_M - members.pileBottomEl;
for (const row of members.piles) {
for (const s of row.s) {
// 말뚝 지름은 입력값 (QA-5). Each row moves along s with the skew, like the 저판 (시안: 열마다 skew만큼 밀림).
+7
View File
@@ -56,4 +56,11 @@ describe('교대 확대기초 · 말뚝 (시안 ②, 3D)', () => {
for (const s of ['1열 · 전면 · t +2150 · 6본', '2열 · t +850 · 6본', '3열 · 배면 · t −1150 · 6본', '4600 = 뒷굽쪽 650 · 2000 · 1300 · 650 전면', '교대축']) expect(svg).toContain(s);
expect(svg.match(/<circle /g)).toHaveLength(18);
});
it('the pile head sits 100 mm inside the 저판 (no top cap on the 저판 bottom face), the 선단 stays at the 선단 EL', () => {
const { m, g } = group();
const box = new THREE.Box3().setFromObject((g.getObjectByName('piles') as THREE.Group).children[0]);
expect(box.max.y).toBeCloseTo(m.footingBottomEl! + 0.1, 4);
expect(box.min.y).toBeCloseTo(m.pileBottomEl!, 4);
});
});