qcast-front/.claude/memory/project_shoulder_absorbed_thresholds.md

3.4 KiB
Raw Blame History

name description type
SHOULDER_ABSORBED 임계는 모든 가드에서 동일하게 < 10 skeleton-utils.js 의 흡수 판정 임계는 OVER_EPS=0.5 → planeSize=5 대응 위해 < 10. 가드 추가 시 동일 값. project

규칙: wallBaseLine.attributes.planeSize 로 흡수 판정하는 모든 가드는 임계 < 10 사용.

관련 가드 (2026-04-27 기준):

  • skeleton-utils.js:1608 SHOULDER_ABSORBED skip — < 10
  • skeleton-utils.js:1475-1481 SHOULDER-ADJACENT processInBoth HIP_SKIP — < 10 (이전 < 1 이었으나 통일)
  • skeleton-utils.js:1797 SHOULDER-ADJACENT left_out OUT_SKIP — < 10
  • skeleton-utils.js:1923 SHOULDER-ADJACENT right_out OUT_SKIP — < 10
  • skeleton-utils.js:2084 SHOULDER-ADJACENT top_out OUT_SKIP — < 10
  • skeleton-utils.js:2207 SHOULDER-ADJACENT bottom_out OUT_SKIP — < 10
  • skeleton-utils.js:1517-1546 (processInBoth) SK-VERTEX-PROXIMITY HIP_SKIP_VERTEX_MISS — target 이 skPolygonPoints (createInnerLinesFromSkeleton 6번째 인자, drawSkeletonRidgeRoof 에서 changRoofLinePoints, drawSkeletonRidgeRoofFromBaseLines 에서 rawPoints 전달) 의 vertex 5px 이내 아니면 skip. 2-hop 흡수 (인접 pair 가 stretched 되어 prev/next planeSize 가드를 통과하는 케이스) 도 차단. ※ closure 가 아닌 인자로 전달 — processInBoth 는 createInnerLinesFromSkeleton 안, changRoofLinePoints 는 skeletonBuilder 스코프라 직접 참조 시 ReferenceError.

Why:

  • useMovementSetting.jsOVER_EPS=0.5 캔버스 단위 → calcLinePlaneSize× 10 곱하므로 잔여 길이=0.5 시 planeSize=5.
  • 가드 임계가 < 1 이면 planeSize=5 흡수가 가드 통과 → phantom HIP/extensionLine.
  • 정상 baseLine 은 통상 50+ → < 10 이어도 false positive 없음.
  • 임계가 두 곳에서 다르면 한쪽만 흡수 인식하고 다른 쪽은 정상 처리 → 직사각형으로 합쳐진 폴리곤에 공중에 뜬 HIP 빗변(예: H-6) 출현.

How to apply:

  • 흡수 판정 가드를 새로 추가할 때 임계는 항상 < 10 (또는 SHOULDER_ABSORBED skip 라인의 임계와 명시적으로 동기화).
  • OVER_EPS 가 변경되면 임계도 재계산: 임계 ≥ OVER_EPS × 10 + 안전마진(5).
  • 가드들의 임계는 코드 가까이에 비교용 주석으로 cross-reference 유지.

증상 사례:

  • (1) ㅗ 폴리곤에서 B-2 (bottom-left horizontal) 를 위로 이동해 B-4 (bottom-right horizontal) 와 평행/연속시킴.
    • 직사각형으로 흡수돼야 하는데 (700,548)→(750,598) 위치에 H-6 (HIP extensionLine) 가 phantom 으로 그려짐.
    • 원인: pair#3 vertical step 흡수(planeSize=5) → pair#4 인접 가드 < 1 통과 → processInBoth HIP 생성.
    • 수정: processInBoth HIP_SKIP 가드 임계 < 10 으로 통일.
  • (2) bump (돌출부) 폴리곤에서 left wall 을 바깥으로 이동해 인접 pair 흡수 → roofline 밖에 H-12 출현 + updateAndAddLine NOT FOUND.
    • 원인 1: pair#6 흡수 후 pair#7 의 _out 분기가 dissolved 된 옛 roof.points 코너 참조.
    • 원인 2 (1차 수정 후 잔류): pair#0 (top_in, processInBoth) 의 END 가 흡수된 pair#6 의 옛 roof 코너 (587,-108) 를 참조 → target=(587,-31) 이 새 SK 외부에 phantom HIP 생성.
    • 수정 1: _out 4 경로에 인접 흡수 가드 추가.
    • 수정 2: processInBoth 의 createHipLine 호출 전 SK-VERTEX-PROXIMITY 검사 추가. target 이 changRoofLinePoints vertex 5px 이내 아니면 skip.