From 4eb92d381da95e50bd37349ff6c3f2a4f1f86ed4 Mon Sep 17 00:00:00 2001 From: ypshim Date: Wed, 4 Nov 2026 08:53:46 +0900 Subject: [PATCH] =?UTF-8?q?fix(abut):=20=EB=A7=90=EB=9A=9D=20=EB=A8=B8?= =?UTF-8?q?=EB=A6=AC=EB=A5=BC=20=EC=A0=80=ED=8C=90=20=EC=95=88=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20100=20mm=20=EB=84=A3=EC=96=B4=20=EB=B0=94=EB=8B=A5?= =?UTF-8?q?=EB=A9=B4=20=EC=A4=84=EB=AC=B4=EB=8A=AC(z-fighting)=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 말뚝 윗면이 저판 바닥·버림 윗면과 같은 높이에 있어, 아래에서 보면 원 안에 줄무늬가 생겼음 - 그리는 말뚝 머리를 저판 안으로 0.1 m 넣어 윗면이 저판 속에 숨도록 함. 선단 EL은 그대로 - 테스트 1건 추가. 전체 662건 통과, 타입 검사 · 빌드 통과 Co-Authored-By: Claude Opus 5.5 --- src/view/abut-scene.ts | 6 +++++- tests/abut-footing.test.ts | 7 +++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/view/abut-scene.ts b/src/view/abut-scene.ts index 0823449..e90cbe2 100644 --- a/src/view/abut-scene.ts +++ b/src/view/abut-scene.ts @@ -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만큼 밀림). diff --git a/tests/abut-footing.test.ts b/tests/abut-footing.test.ts index aa4bd4a..8bc5a32 100644 --- a/tests/abut-footing.test.ts +++ b/tests/abut-footing.test.ts @@ -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(/ { + 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); + }); });