Back to Body Journal
SOURCE / PINNED RELEASE

Made of little things.

Body Journal

Release
e8049f8da4e2…
Author-recorded commit
61c04bf0e8aa…
License
LICENSE
Author’s source reference
nostr://npub182jczunncwe0jn6frpqwq3e0qjws7yqqnc3auccqv9nte2dnd63scjm4rf/wss%3A%2F%2Fgit.napplet.soy%2F/n-6c4554844c7

Archive hash verified: 4369d778da046a8b…. The source-to-build association is the author’s claim; it has not been independently rebuilt.

src/body-regions.ts
import type { Point3 } from './case.js';

export interface SurfaceRegion { part: string; label: string; zone: string }
/** Canonical surface coordinates: +X patient left, +Y up, +Z front.
 * Plain-language approximate regions, deliberately independent of camera/pose.
 * This atlas needs clinical review; it never identifies an internal structure.
 */
export function skinRegion(point: Point3, bone: string): SurfaceRegion {
  const [x,y,z]=point, left=x>=0, side=left?'Left':'Right', slug=left?'left':'right';
  let part='torso', area='', detail='';
  const face=(centerZ=0)=>z>=centerZ?'front':'back';
  const limbSurface=(centerX:number,centerZ:number)=>Math.abs(x-centerX)>Math.abs(z-centerZ)*1.15 ? ((x-centerX)*(left?1:-1)>0?'outer side':'inner side') : face(centerZ);
  const third=(fraction:number)=>fraction<.33?'upper third':fraction>.67?'lower third':'middle third';
  if (/index|middle|pinky|ring|thumb/.test(bone)) {
    const finger=bone.split('_')[0].replace('pinky','little finger').replace(/^(index|middle|ring)$/,'$1 finger');
    area=`${side} ${finger}`; part=`${slug}-hand`; detail=bone.includes('_03')?'tip':bone.includes('_02')?'middle segment':'base';
  } else if (/hand/.test(bone)) { area=`${side} hand`; part=`${slug}-hand`; detail=z>.02?'palm side':'back of hand'; }
  else if (/upperarm|lowerarm|clavicle/.test(bone) && Math.abs(x)>.15) {
    if (y>1.31) { area=`${side} shoulder`; part=`${slug}-shoulder`; detail=face(.02); }
    else if (Math.abs(y-1.133)<.04) { area=`${side} elbow`; part=`${slug}-elbow`; detail=limbSurface((left?1:-1)*.262,.02); }
    else if (y<.94) { area=`${side} wrist`; part=`${slug}-hand`; detail=face(.02); }
    else { const upper=y>1.133; area=`${side} ${upper?'upper arm':'forearm'}`; part=`${slug}-${upper?'upperarm':'forearm'}`; const fraction=upper?(1.368-y)/.235:(1.133-y)/.233; detail=`${limbSurface((left?1:-1)*(.176+(1.368-y)*.365),.02)} · ${third(fraction)}`; }
  } else if (/thigh|calf|foot|ball/.test(bone) && y<.91) {
    if (y<.11) {
      part=`${slug}-foot`;
      if (y>.065) { area=`${side} ankle`; detail=limbSurface((left?1:-1)*.188,.023); }
      else if (z<.01) area=`${side} heel`;
      else if (z>.17) area=`${side} toes`;
      else { area=`${side} foot`; detail=y<.022?'sole':'top'; }
    } else if (Math.abs(y-.492)<.055) { area=`${side} knee`; part=`${slug}-knee`; detail=limbSurface((left?1:-1)*.148,.039); }
    else { const upper=y>.492; area=`${side} ${upper?'thigh':'lower leg'}`; part=`${slug}-${upper?'thigh':'calf'}`; const f=upper?(.897-y)/.405:(.492-y)/.42; detail=`${limbSurface((left?1:-1)*(.105+(.897-y)*.102),.025)} · ${third(f)}`; }
  } else if (y>1.49) {
    part='head'; area=y>1.66?'Scalp':z<-.015?'Back of head':Math.abs(x)>.065?`${side} side of head`:y>1.61?'Forehead':y<1.54?'Chin / jaw':'Face';
  } else if (y>1.40) { part='neck'; area=`${Math.abs(x)<.025?'':side+' '}${face()=='front'?'front':'back'} of neck`; }
  else {
    const prefix=Math.abs(x)<.045?'Central':side;
    if (y<1.0) { part='pelvis'; area=`${prefix} ${z<0?'buttock':Math.abs(x)>.12?'hip':'groin / pelvis'}`; }
    else if (z<-.015) area=`${prefix} ${y>1.20?'upper':y>1.10?'mid':'lower'} back`;
    else area=`${prefix} ${y>1.25?'upper chest':y>1.16?'lower chest':y>1.08?'upper abdomen':'lower abdomen'}`;
  }
  const label=area+(detail?' · '+detail:'');
  return {part,label,zone:label.toLowerCase().replace(/[^a-z0-9]+/g,'-').replace(/-$/,'')};
}