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.
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(/-$/,'')};
}
