import { TransformPoint } from '../types/transform-point.js'; import { getCentroid } from '../shape/get-centroid.js'; import { Shape } from '../shape/shape.js'; import { getTransformPointBuckets } from '../hash/get-transform-point-buckets.js'; import { isBucketZero } from '../hash/is-bucket-zero.js'; import { getShapeEdges } from '../shape/get-shape-edges.js'; import { fromCentroidAndAngle } from '../shape/from-centroid-and-angle.js'; import { addVector } from '../vector/add-vector.js'; import { subtractVector } from '../vector/subtract-vector.js'; import { comparePoints } from './compare-points.js'; const { PI, round, atan2 } = Math; function getTransformPoints( shapes: Shape[]): Map { const transformPoints: TransformPoint[] = []; // -------------- // Centroids (c) // -------------- for (let i=0; i { const { c, θm, sides } = shape; const ps = fromCentroidAndAngle(c, θm, sides, 1); return getShapeEdges(ps) }).flat(); for (const ls of edges) { { const v = ls[0]; const c = subtractVector(addVector(v,[-v[1],v[0]]),v); const θ2 = round(atan2(c[1], c[0])/PI*12); transformPoints.push({ v, θ2, pointType: 'v', index: 0 }); } { const v = getCentroid(ls); const c = subtractVector(ls[1],v); const θ2 = round(2*atan2(c[1], c[0])/PI*12); transformPoints.push({ v, θ2, pointType: 'h', index: 0 }); } } let cc = 0; let vv = 0 let hh = 0; const transformPoints_ = getUniqueVerticesNotZero(transformPoints) .sort((a,b) => comparePoints(a.v,b.v)) .map(tp => ({ ...tp, index: (tp.pointType === 'c' && ++cc) || (tp.pointType === 'v' && ++vv) || (tp.pointType === 'h' && ++hh) || 0, }) ); const transformPointMap: Map = new Map( transformPoints_ .map(v => [v.pointType + v.index, v]) ); return transformPointMap; } function getUniqueVerticesNotZero( vertices: TransformPoint[]) { const vertexSet: Set = new Set(); const vertices_: TransformPoint[] = []; for (const vertex of vertices) { const hashes = getTransformPointBuckets(vertex.v); if (isBucketZero(hashes)) { continue; // no origins allowed } let found = false; for (let j=0; j