From 604808ede7562ac74f21bd532a97769a16ca12f1 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 27 Oct 2026 20:41:00 +0900 Subject: [PATCH] =?UTF-8?q?fix(562-3):=20D03=20=EA=B0=88=EB=9E=98=20?= =?UTF-8?q?=EC=8B=9C=EC=9E=91=20=3D=20=EA=B0=80=EC=9E=A5=20=EA=B0=80?= =?UTF-8?q?=EA=B9=8C=EC=9A=B4=20=EA=BA=BE=EC=9E=84=EC=A0=90=20=C2=B7=20?= =?UTF-8?q?=EC=A0=9C=EC=95=BD=20=EA=B8=B0=EC=9A=B8=EA=B8=B0=20=EC=B9=B8=20?= =?UTF-8?q?=3D=20=EC=98=A4=EB=A5=B4=EB=82=B4=EB=A6=BC=20=EA=B0=99=EC=9D=80?= =?UTF-8?q?=20=ED=81=AC=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 갈래 · 마크 누름: 붙는 반경 안 꺾임점 중 첫 것이 아니라 가장 가까운 것(짧은 구간이 붙어 있으면 앞 점이 잡히던 흠) - 562-1 짝이 |기울기|로 셈 → 칸 이름 「기울기(± 같음)」 · 자리 없음 안내 ±값 Co-Authored-By: Claude Opus 5.5 --- D03_PlanAnalysis/D03_PlanAnalysis_UI_Draw.ts | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/D03_PlanAnalysis/D03_PlanAnalysis_UI_Draw.ts b/D03_PlanAnalysis/D03_PlanAnalysis_UI_Draw.ts index 484d8809b..b6a0d0916 100644 --- a/D03_PlanAnalysis/D03_PlanAnalysis_UI_Draw.ts +++ b/D03_PlanAnalysis/D03_PlanAnalysis_UI_Draw.ts @@ -4,7 +4,8 @@ * * 본선 = D02 시점에서 · D02 종점 둘레(SNAP_PX)에 오면 종점에 붙고 그 점에서 끝. * 미리보기 = 마지막 점 → 마우스 길이(m) · 원지반 기울기(%, + 오르막) — 제약 칸 넷: - * 자유 · 길이 고정 · 기울기 고정(마우스 방향 첫 자리) · 둘 다(양각기 원 위 후보 중 마우스에 가까운 것). + * 자유 · 길이 고정 · 기울기 고정(마우스 방향 첫 자리) · 둘 다(양각기 원 위 후보 중 마우스에 가까운 것) · + * 제약 기울기 = 오르내림 같은 크기(562-1 짝이 |기울기|로 셈) · 미리보기 값은 + 오르막 / − 내리막. * 갈래 = 기존 선 꺾임점(선 위면 꺾임점 끼움)을 눌러 시작 · 구역 마크 = 선 위 누름(오른쪽 = 지움). * 키 = Enter 끝 · Esc 이번 긋기 취소 · Backspace 마지막 점 빼기(설정 창 단축키 표 D03 줄). * 셈 = 562-1 짝(`logic/D03_PlanAnalysis_Draw`) · 꼴 다루기 = `logic/D03_PlanAnalysis_Plan` · @@ -165,7 +166,7 @@ export function createPlanDraw(params: PlanDrawParams): PlanDraw { }); lengthField.input.dataset.role = "draw-length"; const slopeField = createInputField({ - label: "기울기(+ 오르막)", + label: "기울기(± 같음)", type: "number", value: String(slopePct), unit: "%", @@ -240,10 +241,10 @@ export function createPlanDraw(params: PlanDrawParams): PlanDraw { point = fixedLengthPoint(from, cursor, lengthM); } else if (kind === "slope") { point = fixedSlopePoint(from, cursor, slopePct, z); - if (!point) note = `이 방향엔 ${signed(slopePct)} % 자리 없음`; + if (!point) note = `이 방향엔 ±${fmt(Math.abs(slopePct))} % 자리 없음`; } else if (kind === "both") { point = compassPoint(from, cursor, lengthM, slopePct, z); - if (!point) note = `반지름 ${fmt(lengthM)} m 원 위에 ${signed(slopePct)} % 자리 없음`; + if (!point) note = `반지름 ${fmt(lengthM)} m 원 위에 ±${fmt(Math.abs(slopePct))} % 자리 없음`; } const at = point ?? cursor; const length = segmentLength(from, at); @@ -268,7 +269,14 @@ export function createPlanDraw(params: PlanDrawParams): PlanDraw { let bestPx = LINE_HIT_PX; params.network().lines.forEach((line, index) => { if (line.vertices.length < 2) return; - const vertex = line.vertices.findIndex((v) => near(map.toScreen(v), [px, py], SNAP_PX)); + // 붙는 반경 안 꺾임점 중 가장 가까운 것 + let vertex = -1; + let vertexPx = SNAP_PX; + line.vertices.forEach((v, i) => { + const [vx, vy] = map.toScreen(v); + const d = Math.hypot(vx - px, vy - py); + if (d <= vertexPx) [vertex, vertexPx] = [i, d]; + }); const atM = vertex >= 0 ? lineLength(line.vertices.slice(0, vertex + 1))