Skip to content

Repository files navigation

anatomy-locator

아픈 부위를 가리키는 도구. 진단하지 않는다. 자세한 배경과 범위 경계는 SPEC.md 참조.

실행

pnpm install
pnpm dev
  • / — 지시 도구 (제품)
  • /author.html — 좌표 저작 도구 (M1). 별도 엔트리라 제품 번들에 섞이지 않는다.

배포

main에 푸시하면 .github/workflows/deploy.yml이 GitHub Pages로 올린다 (pnpm lint → pnpm build → 업로드). tsc -b가 build에 포함되므로 타입 오류는 배포를 막는다.

한 번은 손으로 켜야 한다: Settings → Pages → Source를 "GitHub Actions"로.

빌드는 base: './'라 저장소 이름이 어디에도 박혀 있지 않다. 프로젝트 사이트 (/pain-drawing/), 포크, 커스텀 도메인에서 모두 그대로 동작한다.

refs/의 도판은 배포물에 들어가지 않는다 — 어떤 코드도 import하지 않고 public/이 아니라 dist/에 복사되지 않는다.

구조

src/
  types/anatomy.types.ts        스키마 — Structure / StructureInView / View 분리
  lib/
    geometry.ts                 ribbon() 중심선+폭 → path, 좌표 정규화, 좌우 반전
    color.ts                    조직 색 채도 조절 — 깊이 램프
    probe.ts                    isPointInFill 기반 히트테스트
    reference.ts                내보내기 블록 + URL 상태 직렬화
    search.ts                   이름 네 벌(한글 전통·개정·영문·라틴어) 점수 매칭
    registration.ts             참조 이미지 ↔ 뷰 좌표 상사변환 (랜드마크 정합).
                                자세가 다른 자료는 분절별로 — fitSegmented·applyAcross
    serialize.ts                Structure/StructureInView → 붙여넣기용 TS·JSON
  data/
    index.ts                    조립 + 개발 모드 무결성 검사
    mirror.ts                   반대쪽 뷰 파생 — 좌표를 복제하지 않는다
    tissue.ts                   조직 유형별 색·라벨
    foot/
      structures.ts             뷰 무관 구조 메타데이터 — 부위 단위로 공유
      plantar/
        view.ts                 뷰 정의 (윤곽·층·bbox·랜드마크·뼈 참조)
        placements.ts           이 뷰에서의 depth + shapes
      dorsal/
        view.ts                 발바닥 기하를 좌우 반전 — 구조는 따로 찍는다
        placements.ts           발등 층 구성 (지대·장신근건·단신근·심부)
    knee/                       (감춤 — 스키마 검증용으로만 남아 있다)
      structures.ts             인대 8 · 연골 2 — 전부 attachments를 쓴다
      anterior/                 표층 · 관절낭/측부인대 · 반월판 · 십자인대
      posterior/                앞 뷰를 좌우 반전 — 슬개골·경골조면만 뺐다
    lower-leg/
      structures.ts             종아리에만 있는 23개. 경계를 넘는 것은 id로 공유
      posterior/                근막 · 비복근 · 가자미근 · 심부 굴근
      lateral/                  뒤 뷰의 반전이 아니다 — 따로 찍은 다른 면
      medial/                   경골 내측면(정강이 부목)과 족근관
      anterior/                 앞 칸. 14개 중 6개가 발등 뷰와 같은 레코드다
    thigh/
      structures.ts           허벅지에만 있는 26개. 무릎·종아리 레코드 9개를 함께 쓴다
      posterior/              근막 · 햄스트링 표층/심층 · 좌골신경과 대내전근
      anterior/               근막·서혜인대 · 대퇴삼각 · 광근 · 뼈에 붙은 층
      medial/                 내전근 다섯과 내전근관(대퇴동맥이 여기서 깊어진다)
      lateral/                장경인대가 덮은 면. 대전자·장경인대 증후군 자리
  components/
    anatomy-view/             (도판 겹쳐 보기 포함 — 이미지는 켤 때 내려온다)               SVG 도해 + 히트테스트 대상 등록, 인접 층 고스트,
                                내측·외측 가장자리 표시
    depth-rail/                 층 선택 + 다른 층 후보 표시. 피부→뼈 단면으로 읽힌다
    region-switch/              발 ↔ 종아리 전환. 좌우는 유지한다
    view-switch/                오른발 ↔ 왼발, 발바닥 ↔ 발등 전환
    probe-readout/              한 점 아래 구조를 층별로 나열
    structure-search/           이름 → 위치. 여러 뷰에 있으면 전부 제시한다
    structure-detail/           선택 구조 상세
    reference-export/           블록·URL 복사
  author/                       저작 도구 (별도 엔트리)
    author.tsx                  상태 조립 — 정합·도형·메타데이터·내보내기
    canvas.tsx                  참조 이미지 + 중심선 편집 SVG
    draft.ts                    편집 중 표현 ↔ 스키마 변환
    storage.ts                  localStorage 세션 (이미지는 저장 안 함)

scripts/copy-plates.mjs       `View.plates`가 가리키는 도판을 refs/ → public/으로.
                              배포본은 커밋하지 않고 dev·build 때 만든다
docs/adr/                     되돌리기 어려운 결정의 기록

저작 도구 사용 순서

  1. 참조 정합 — 이미지를 올리고 view.landmarks 기준점을 차례로 클릭한다. 2점부터 변환이 잡히고 3점 이상은 최소제곱. 반전 여부는 잔차가 작은 쪽으로 자동 선택되므로 반대쪽 발 사진도 그대로 쓸 수 있다. rms가 정합 품질이다. 뷰에 분절이 있으면(무릎) 한 번에 한 분절씩 맞춘다. 칩이 분절별 rms를 보여주고, 이미지는 지금 고른 분절의 자리에 놓인다.
  2. 도형 — 캔버스 클릭으로 중심선 점 추가, 끌어서 이동, 방향키로 미세 조정 (Shift 10씩), 폭은 슬라이더. Ctrl+Z로 되돌리기. 관절을 건너는 리본은 걸침을 지정한다. 출발 분절의 자리에서 그리고, 첫 점이 출발 쪽 부착부·마지막 점이 도착 쪽이다 — 점 순서가 곧 방향이다.
  3. 메타데이터 — 이름 3종·조직·층·기시/정지. 조직을 인대나 연골로 바꾸면 폼이 attachments 2칸으로 바뀐다. 근막일 때만 어느 쪽인지 저작자가 고른다 (족저건막은 방향이 있고 관절낭은 없다).
  4. 내보내기 — TS 블록을 structures.ts / placements.ts에 붙여넣는다. 출처를 채우면 fidelity: 'traced' 블록도 함께 나온다.

설계상 지켜야 할 것

  • shape는 path 문자열로 저장하지 않는다. 중심선 p + 폭 w 숫자 배열로 저장하고 ribbon()이 렌더 시점에 path를 만든다. 좌표 하나만 손으로 고칠 수 있고 diff가 읽힌다.
  • 정밀도 주장도 StructureInView가 할 수 있다. 도판이 층별이라 트레이싱도 층별로 끝난다. placement가 provenance를 생략하면 뷰 값을 상속하고, 적으면 그 구조만 따로 주장한다. 덕분에 부분 트레이싱이 정직하게 표현된다. 종아리가 그 상태로 간다 — Gray's에 비복근을 온전히 그린 도판도, 다리 외측면 도판도 없으므로 그 자리들은 뷰가 올라가도 fidelity: 'schematic'을 명시해 상속을 끊는다.
  • 등급은 셋이다 — schematic < normalized < traced. 가운데가 있는 이유는 자료와 뷰의 비율이 다를 때 상사변환이 존재하지 않기 때문이다. 그때는 좌표 대신 "어느 높이에서 폭의 몇 지점인가"만 옮긴다(lib/normalize.ts). 순서와 상대 위치는 살아남고 모양과 각도는 살아남지 않는다. 근거는 SPEC "비율이 다른 자료 — 정규화 대응".
  • 조직 종류가 서술 형태를 정한다. 인대·연골은 attachments 2개, 근육·힘줄은 기시/정지. 섞으면 컴파일되지 않는다. 판별 기준은 조직 이름이 아니라 당기는 방향의 유무여서, 근막만 양쪽을 허용한다 — 족저건막은 방향이 있고 관절낭은 없다. attachments가 잇는 것도 뼈로 한정하지 않는다: 반월판은 두 부착부가 모두 경골이고 슬개하 횡인대는 반월판 둘을 잇는다.
  • depth는 Structure가 아니라 StructureInView의 속성이다. 같은 구조가 뷰마다 다른 층에 있을 수 있다. dorsal-interossei가 발바닥 L4 ↔ 발등 L3로 갈리는 게 실제 사례다. 층 번호는 뷰 안에서만 뜻이 있다 — 발등에는 발바닥의 1~4층 같은 교과서적 체계가 없어서, 같은 번호라도 같은 깊이를 뜻하지 않는다. pcl은 같은 층 체계 안에서 보는 방향만으로 갈린다(앞 L3 ↔ 뒤 L2). 한 뷰 안에서도 자리마다 다를 수 있다 — 대내전근은 허벅지 뒤에서 안쪽 모서리가 L1(근막 바로 밑)이고 가운데가 L3(햄스트링 밑 바닥)다. 깊이가 뷰가 아니라 점의 성질이기 때문이고, 그래서 한 구조가 한 뷰에 두 번 놓일 수 있다(깊이마다 한 번, 서로 다른 자리). 근거는 ADR 0002. 종아리 가로단면(Gray440)이 이걸 자료로 증명한다: 같은 경골신경이 뒤 뷰에서는 심부 굴근보다 얕고(L3에서 굴근 위) 안쪽 뷰에서는 더 깊다(L2 굴근 밑 L3). 둘 다 맞다 — 깊이는 절대 위치가 아니라 그 뷰가 들어가는 방향으로 잰 거리이기 때문이다.
  • 이름의 근거는 ta가 댄다. name의 네 이름은 전부 우리가 적은 것이라 스스로 검증되지 않는다. ta는 국제 표준(TA98)에 그 코드로 실린 항목이 있고 라틴어 이름이 우리 la와 같다는 대조 결과다. 대응 항목이 없으면 비운다 — 표준이 우리보다 잘게 나눈 자리(비골근지대는 상·하 둘)에서 하나를 골라 적으면 그 레코드가 아닌 것을 가리키게 된다. 근거는 SPEC "표준 용어 대조".
  • boneRef도 뷰의 속성이다. 무릎 뒤 뷰는 앞 뷰 기하를 좌우 반전한 것이지만 슬개골과 경골조면은 뺐다. 앞에서만 보이는 뼈 표지이기 때문이다.
  • 면을 바꾸면 선택과 지시 지점을 버린다. 발바닥 ↔ 발등은 다른 구조가 놓인 다른 공간이고 층 수도 다르다(5 vs 4). 좌우 전환은 같은 좌표계라 유지한다.
  • Structure는 뷰가 아니라 부위에 속한다. 그래서 data/foot/structures.ts가 뷰 폴더 밖에 있다. 발바닥·발등이 같은 레코드를 참조한다.
  • 비활성 층을 display:none으로 끄지 않는다. isPointInFill은 DOM에 있는 element만 판정한다. 얕은 층은 절단연(점선), 깊은 층은 옅은 채움으로 계속 그리고 pointer-events: none만 건다. isPointInFill은 fill="none"과 pointer-events에 영향받지 않아 고스트로 그린 층도 후보로 잡힌다.
  • 반대쪽은 표시 옵션이 아니라 뷰다. 좌표가 URL로 나가는 이상 좌우가 상태에 없으면 at=이 두 곳을 가리키게 된다. 반전 뷰는 원본 좌표를 그대로 쓰고 렌더에서만 뒤집으므로, 정규화 좌표가 한 공간에 남아 좌우 지점 이송이 공짜다. 대신 독립 트레이싱으로 오해되지 않게 mirrorOf가 파생 관계를 남긴다.
  • 화면 좌우가 해부학적으로 어느 쪽인지는 뷰가 직접 말한다(edges). side 하나로 유도할 수 없다 — 같은 오른발이라도 발바닥은 무지가 화면 오른쪽, 발등은 왼쪽이다. 근거는 refs/README.md "좌우는 어떻게 판별했나".
  • 도판은 근거지 클릭 대상이 아니다. 트레이싱한 뷰는 그 도판을 뷰 좌표 위에 도로 얹어 겹쳐 볼 수 있다(View.plates, 기본 꺼짐). 히트테스트는 여전히 SVG 도형의 isPointInFill이고 이미지에는 pointer-events: none이 걸린다. 이미지맵이나 캔버스 픽킹으로 옮기지 않는 이유는 ADR 0001에 있다 — 요약하면 도판이 층별로 없고, 층마다 갈아 끼우면 윤곽이 흔들리고, 후보 목록이 무너지고, 정밀도 고지가 과장된다.
  • 겹쳐 볼 수 있는 것은 상사변환으로 얹힌 뷰뿐이다. normalized 대응에는 도판을 되돌릴 변환이 아예 없다. 등급이 기능 가용성으로 드러나는 자리다. 반전 뷰에도 달지 않는다 — 인쇄된 라벨이 거울로 뒤집힌다.
  • 반환은 단일 정답이 아니라 후보 목록이다. 표면 한 점 아래에 4~5개가 겹친다.
  • 역방향 조회는 지시 지점을 만들지 않는다. 이름으로 찾으면 뷰·층을 옮기고 선택만 한다. 없는 좌표를 지어내면 사용자가 짚지도 않은 곳이 at=으로 URL에 남는다. 대신 면을 건너뛸 때 선택은 들고 간다 — 안 그러면 옮겨간 이유가 사라진다.

마일스톤

  • M0 스키마 + ribbon() 렌더러 + isPointInFill probe, 발바닥 데이터 이식
  • M1 저작 도구 — 정합·중심선 편집·메타데이터·내보내기 동작. 인수 테스트(발바닥 재트레이싱)는 아직 실행 안 됨. 참조 자료는 Gray's 1918 족저 층별 도판(PD)으로 정했다 — SPEC "주의 1 — 자료 선택"
  • M2 발바닥 뷰 완성 — 역방향 조회(이름 → 위치) 포함. 네 가지 이름 어느 것으로도 찾히고, 여러 뷰에 걸친 구조는 뷰마다 층을 함께 보여준다
  • M2.5 발등으로 다중 뷰 검증 — dorsal-interossei가 발바닥 L4 ↔ 발등 L3로 갈리며 Structure/StructureInView 분리가 처음 검증됐다
  • M3 무릎으로 검증 — attachments는 버티지 못했다. 옵셔널 필드라 아무것도 막지 않아서 유니온으로 고쳤다. 자세한 내용은 SPEC "인대 스키마". 단, 무릎은 제품 화면에서 감췄다 — 검증용 부위였지 대상 부위가 아니다
  • 종아리 — 첫 확대 부위. 네 면으로 다리를 한 바퀴 돌았고 placement 112개가 **전부 reachable: true**다. 부위 경계를 넘는 구조를 id로 공유해 Structure가 부위가 아니라 구조 하나에 붙는다는 것을 검증했다
  • 허벅지 — 둘째 확대 부위. 네 면으로 한 바퀴 돌았고 placement 59개 (좌우 포함 118개)가 **전부 reachable: true**다. 앞·뒤 뷰는 Gray430·Gray434에서 트레이싱했다(20개가 traced). 부위 참조가 아래로도 간다는 것을 검증했다 — 종아리는 발·무릎 레코드를 위에서 참조했는데, 허벅지는 자기 근육이 무릎을 넘어 닿는 힘줄을 아래에서 참조한다
  • 다음 부위 — 어깨는 보류. SPEC "부위를 고르는 기준"

현재 상태 메모

  • 트레이싱 진행 중이다. 19개 중 13개가 traced다 — 1층 두 외전근(Fig. 443), 2층 전체(Fig. 444), 3층 전체(Fig. 445), 4층 골간근(Fig. 446·447). 남은 6개는 L0 족저건막 3개, L1 단지굴근, L4 비골근장건·후경골건이다. 건막과 단지굴근은 443에서 건막이 잘려 기시부가 가려 못 했고, 두 힘줄은 발바닥을 지나가지만 다른 부위에서 와서 층별 도판에 온전히 안 나온다. 뷰는 여전히 fidelity: 'schematic'이다 — 윤곽·뼈 참조는 손으로 그린 것이기 때문이다. UI는 이 혼합 상태를 그대로 말한다(푸터는 "일부만", 구조 상세는 구조별 근거).
  • 왼발 뷰는 오른발에서 파생된 것이다. 좌표를 따로 뜨지 않았고 트레이싱 상태도 오른발과 같다. 내보내기 블록은 (mirrored)로, 푸터는 좌우 차이를 반영하지 않는다고 말한다.
  • 발등 뷰의 기하는 발바닥을 좌우 반전한 것이다(x' = 310 − x). 같은 발의 반대 면이라 실루엣·뼈·발가락은 거울상이 맞다. 독립 트레이싱이 아니므로 발바닥 윤곽의 폭 보정도 그대로 따라온다.
  • 발등 구조는 배측골간근만 도판(Fig. 446)에서 왔고 나머지 9개는 모식도다. 발등을 층별로 벗긴 도판이 아직 없다.
  • 무릎은 제품 화면에 안 나온다 (Region.hidden). 데이터는 그대로 조립되고 ?view=knee-anterior로는 열린다. 이 도구는 눌러서 만져지는 것을 가리키는데 십자인대·반월판은 위치만 맞고 깊이는 닿지 않는다. reachable: false를 항목마다 붙여도 깊이 레일이라는 장치가 "더 내려가 보라"고 권하는 걸 못 막는다. 스키마 검증의 증거라서 지우지는 않았다. 판별 기준은 SPEC "부위를 고르는 기준".
  • 무릎은 전부 모식도다. 구조 21개, 배치 앞 13 · 뒤 15를 전부 손으로 찍었고 뷰가 schematic이라 푸터도 그렇게 말한다. 뒤 뷰의 기하는 앞 뷰를 좌우 반전한 것이고(x' = 320 − x), 관절 안의 구조는 좌표까지 반전값이다 — 같은 무릎을 반대에서 본 것이라 전두면 위치가 거울상이기 때문이다. 표층(햄스트링건·비복근두)과 후방인대만 새로 찍었다.
  • 무릎 도판은 아직 안 받았다. 예전에 "egress 정책이 위키미디어를 막는다"고 적어 뒀는데 그건 그 환경의 제약이었다 — 허벅지 도판은 Commons에서 그냥 받았다(refs/README.md "무릎 — 아직 도판이 없다"). 남은 것은 자료 접근이 아니라 자세 문제다: 관절 내부가 보이는 도판은 굽힌 무릎이고 우리 뷰는 편 무릎이라 얹을 상사변환이 없다. 그래서 분절 정합을 미리 만들어 뒀다(아래).
  • 자세가 바뀌는 관절은 분절마다 따로 정합한다. 관절 내부가 보이는 도판은 무릎을 굽힌 자세고 뷰는 편 무릎이라 전체를 얹는 상사변환이 없다. 뼈 하나 안에서는 있으므로 View.segments(대퇴골 / 경골·비골)로 나눠 fitSegmented()가 각각 구하고, 관절을 건너는 도형만 applyAcross()가 두 변환 사이를 보간한다. 합성 도판으로 검증했다 — 분절 정합은 오차 1e-13, 단일 정합은 경골 몸통에서 32.8 어긋난다. 단, 걸친 구조의 중간부는 트레이싱이 아니라 재구성이다. 양 끝 부착부만 정확하고, 무릎 인대는 거의 전부 여기 해당한다. 근거와 한계는 refs/README.md "2번을 골랐다 — 분절 정합".
  • reachable: false는 무릎에서 처음 쓰였다 — 십자인대·횡인대·슬와근건·후방인대는 관절 안이라 지시한 점 아래에 있는 건 맞지만 밖에서 누를 수 없다. 발에서는 전부 true였다. 이건 필드가 검증됐다기보다 그 부위가 안 맞는다는 신호였다.
  • 안쪽 뷰는 통증 위치 때문에 넣었다. 경골 내측면은 근육이 안 덮어 뼈를 직접 누르게 되고(내측 경골 스트레스 증후군), 복사뼈 뒤 굴근지대 밑이 족근관이다. 둘 다 손가락으로 정확히 짚는 자리다. 이 뷰의 L3은 다른 두 면과 달리 깊이가 아니라 한 통로에 모인 것들로 묶인다 — 층 번호가 뷰 안에서만 뜻을 갖는다는 규칙이 없으면 표현할 수 없다.
  • 앞 뷰는 대부분 재사용이다. 14개 중 6개(신근지대·전경골근건·장지신근건· 장무지신근건·제3비골근·심비골신경)가 발등 뷰와 같은 레코드다. 앞 칸은 종아리에서 발등으로 그대로 이어지는 칸이라 그렇게 되는 게 맞다. 심비골신경은 이제 발등 L3 · 종아리 바깥 L3 · 종아리 앞 L2 — 뷰마다 번호가 다르다.
  • 종아리는 전부 모식도다. 구조 23개를 새로 만들고 배치 112개(좌우 포함)를 손으로 찍었다. 도판은 없다. 뒤 뷰는 무릎 아래부터 발꿈치까지, 바깥 뷰는 뒤 뷰의 반전이 아니라 따로 찍은 면이다 — 발등이 발바닥의 거울상인 것과 달리 옆면은 뒤에서 본 면의 거울상이 아니다.
  • 부위 경계를 넘는 구조는 레코드를 공유한다. 비골근장건·후경골건·장지굴근건· 장무지굴근건·심비골신경은 발에, 비복근 두 갈래는 무릎에 이미 있던 것을 종아리 placement가 id로 참조한다. 그래서 후경골건이 발바닥 L4이자 종아리 뒤 L3가 되면서도 레코드는 하나다. 발바닥 도판에서 트레이싱하지 못한 두 힘줄이 종아리에서는 자리를 얻었다.
  • 허벅지 앞·뒤 뷰는 도판에서 왔다. Gray430(앞)·Gray434(뒤)를 받아 refs/에 넣었고, 실루엣을 행마다 기계로 재서 윤곽을 만들고 근육 경계를 높이별로 읽어 얹었다. 변환은 등방 배율 0.9 + 평행이동뿐이라 상사변환이고, 그래서 옮긴 구조는 fidelity: 'traced'다. 배율이 두 도판에서 같은 것은 맞춘 것이다 — 두 도판의 허벅지 길이 대 폭이 0.41 대 0.42로 사실상 같아서 같은 배율을 쓰면 앞뒤 뷰의 굵기가 맞는다.
  • 뷰를 도판에 맞춰 다시 그렸다. 손으로 그린 원래 윤곽은 사타구니~슬개골 길이/폭이 2.66이었는데 도판은 2.14이고 실제 허벅지가 2.1쯤이다. 종아리 앞 뷰에서는 도판 쪽이 더 틀려서 normalized로 갔지만, 허벅지는 반대라 뷰를 고치는 쪽이 맞았다. 등급을 고르는 기준이 "정합이 되느냐"가 아니라 "어느 비율을 믿느냐"라는 게 두 사례로 갈린다.
  • 네 면 중 어느 것도 다른 면의 반전이 아니다. 앞은 사두근 하나가 채우고 뒤는 햄스트링이 두 줄로 갈리며, 위 경계도 앞은 사타구니 주름이라 비스듬하고 뒤는 엉덩이 주름이라 거의 가로다.
  • 안쪽·바깥 뷰는 여전히 전부 모식도다. Gray's 1918에 허벅지를 안쪽이나 바깥에서 벗긴 도판이 없다. Gray433은 내전근 심층을 보여주지만 앞에서 본 그림이라 90° 돌려야 하고 그건 상사변환이 아니다. 대신 층 순서는 근거가 있다 — Gray432(허벅지 중간 가로단면)가 안쪽에서 바깥으로 박근 → 장내전근 → 대내전근 순을 그리고, 대퇴동정맥·복재신경을 봉공근과 장내전근 사이 깊은 곳에 함께 둔다. 순서는 있고 좌표는 없다는 상태를 placement마다 fidelity: 'schematic'을 명시해 끊어 둔다.
  • 허벅지 배치 59개 중 20개가 traced다(좌우 포함 118 / 40). 앞 뷰 19개 중 11개, 뒤 뷰 15개 중 9개. 남은 것은 도판에 아예 안 그려진 신경·혈관과, 덮여서 경계를 못 읽는 배 둘(중간광근·반막양근)이다. 반막양근은 힘줄만 traced이고 배는 schematic이라, 배와 힘줄을 따로 두는 규칙이 정밀도에서도 값을 한다.
  • 허벅지에서 부위 참조가 아래로 간다. 대퇴사두근건·햄스트링 세 힘줄· 장경인대는 무릎에, 대복재정맥·복재신경·경골신경·총비골신경은 종아리에 이미 있던 레코드다. 배는 허벅지에 있고 힘줄은 무릎에 있는 것이 맞다 — 만져지는 자리가 다르기 때문이다. 감춰 둔 무릎 데이터가 이 경로로 제품 화면에 다시 나온다: 힘줄은 관절 속이 아니라 피부 밑이라 감출 이유가 없었다.
  • 대퇴동맥이 뷰마다 층이 다르다. 앞 뷰 L1(대퇴삼각 — 근막 바로 밑이라 맥박이 잡힌다) · 안쪽 뷰 L3(봉공근 밑 내전근관). 치골근은 반대로 앞에서 L3, 안쪽에서 L2다. 종아리 가로단면이 자료로 증명했던 규칙이 허벅지에서는 해부학적으로 필연인 자리로 나타난다.
  • 허벅지 구조 26개는 TA98 코드가 전부 붙었다. 부위 중 처음이다. 우리가 고른 단위(근육 배·신경·혈관·근막)가 표준이 이름 붙이는 단위와 같기 때문이고, 힘줄 때문에 비는 자리는 무릎 레코드라 이 목록에 없다.
  • 뷰 자체는 아직 schematic이다. 앞·뒤 뷰의 윤곽은 도판에서 왔지만 넙다리뼈는 손으로 그렸다(Gray430·434에 드러난 뼈가 슬개골뿐이다). View.fidelity는 윤곽·뼈 참조·랜드마크 셋 모두에 대한 주장이므로 가장 약한 것을 따른다. 발바닥 뷰가 같은 상태다 — 뷰는 모식도인데 placement 열셋이 traced인 그 구조.
  • 허벅지 앞·뒤 뷰는 도판을 겹쳐 볼 수 있다. 깊이 레일의 "도판 겹치기"를 켜면 Gray430·Gray434가 뷰 좌표 위에 도로 얹힌다. traced 도형이 도판 위에 앉고 schematic 도형이 떠 있는 게 눈으로 보인다. 도판이 실제로 그린 층 (L1·L2)에서만 나오고, L0·L3에서는 토글 자체가 없다 — 없는 걸 있다고 하지 않는다. 근거는 ADR 0001.
  • 깊은 층의 모식도는 실제 크기로 그린다. 모식도는 아무것도 주장하지 않지만 크기까지 아무래도 좋다는 뜻은 아니다 — 작게 그리면 그 층을 짚었을 때 아무것도 안 잡히고, 그건 "여기엔 아무것도 없다"는 틀린 말이 된다. 격자로 재보니 허벅지 깊은 층이 817%만 채워져 있어(종아리 3441%) 다섯 개를 해부학적 크기로 고쳤다.
  • 정밀도 고지 문구는 데이터가 결정하므로 UI에 하드코딩하지 않는다.
  • view.landmarks 4점(종골 후연·제1중족골두·제5중족골 조면·무지 끝)은 모식도 좌표 위에서 잡은 기준점이다. M1에서 참조 이미지 정합에 쓰고, 트레이싱으로 교체할 때 같은 키를 맞춘다.
  • plantar-foot-locator.jsx는 이식 전 프로토타입이며 빌드에 포함되지 않는다.

About

Point to where it hurts — pick the anatomical structure under a spot on the foot or lower leg and export a precise reference for a person or an LLM. Not a diagnostic tool.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages