Files
walkersim/src/geometry.js

76 lines
2.0 KiB
JavaScript

import { dist, vec } from './math.js';
const RAW_POINTS = {
A: vec(78.468674, 129.90132),
B: vec(137.85054, 130.12675),
O: vec(108.00143, 129.68732),
C0: vec(107.73979, 134.64543),
D0: vec(91.864792, 153.45453),
E0: vec(123.05698, 152.69731),
F0: vec(77.341405, 173.08926),
G0: vec(138.20833, 172.9466),
};
const RAW_LEG_LENGTH = dist(RAW_POINTS.C0, RAW_POINTS.G0);
const TARGET_LEG_LENGTH_CM = 45;
const SCALE_TO_CM = TARGET_LEG_LENGTH_CM / RAW_LEG_LENGTH;
export const POINTS = {
A: vec(RAW_POINTS.A.x * SCALE_TO_CM, RAW_POINTS.A.y * SCALE_TO_CM),
B: vec(RAW_POINTS.B.x * SCALE_TO_CM, RAW_POINTS.B.y * SCALE_TO_CM),
O: vec(RAW_POINTS.O.x * SCALE_TO_CM, RAW_POINTS.O.y * SCALE_TO_CM),
C0: vec(RAW_POINTS.C0.x * SCALE_TO_CM, RAW_POINTS.C0.y * SCALE_TO_CM),
D0: vec(RAW_POINTS.D0.x * SCALE_TO_CM, RAW_POINTS.D0.y * SCALE_TO_CM),
E0: vec(RAW_POINTS.E0.x * SCALE_TO_CM, RAW_POINTS.E0.y * SCALE_TO_CM),
F0: vec(RAW_POINTS.F0.x * SCALE_TO_CM, RAW_POINTS.F0.y * SCALE_TO_CM),
G0: vec(RAW_POINTS.G0.x * SCALE_TO_CM, RAW_POINTS.G0.y * SCALE_TO_CM),
};
const rOC = dist(POINTS.O, POINTS.C0);
const rAD = dist(POINTS.A, POINTS.D0);
const rCD = dist(POINTS.C0, POINTS.D0);
const rCF = dist(POINTS.C0, POINTS.F0);
const rBE = dist(POINTS.B, POINTS.E0);
const rCE = dist(POINTS.C0, POINTS.E0);
const rCG = dist(POINTS.C0, POINTS.G0);
export const LENGTHS = {
rOC,
rAD,
rCD,
rCF,
rBE,
rCE,
rCG,
kL: rCF / rCD,
kR: rCG / rCE,
};
export const BASE_DIMENSIONS_CM = {
crank: rOC,
leg: rCG,
tendon: rBE,
body: dist(POINTS.A, POINTS.B),
};
export function mechanismBounds() {
const pts = Object.values(POINTS);
let minX = Infinity;
let minY = Infinity;
let maxX = -Infinity;
let maxY = -Infinity;
for (const p of pts) {
minX = Math.min(minX, p.x);
minY = Math.min(minY, p.y);
maxX = Math.max(maxX, p.x);
maxY = Math.max(maxY, p.y);
}
const pad = 30;
return {
minX: minX - pad,
minY: minY - pad,
maxX: maxX + pad,
maxY: maxY + pad,
};
}