@technobuddha/library
Version:
A large library of useful functions
36 lines • 2.04 kB
JavaScript
import { modulo } from "./modulo.js";
/**
* Generate normalized edge angles from polygon edges.
* @param polygon - The polygon to extract edge angles from
* @param normalizeTo - Angle to normalize to (e.g., Math.PI * 2 for full rotation, Math.PI / 2 for quadrant)
* @returns Generator that yields edge angles, normalized to the specified range
* @example
* ```typescript
* const polygon: Polygon = [
* { x: 0, y: 0 },
* { x: 1, y: 1 },
* { x: 0, y: 2 },
* { x: -1, y: 1 }
* ];
* const angles = edgeAngles(polygon);
* for (const angle of angles) {
* console.log(angle);
* }
* // Output:
* // 0.7853981633974483
* // 2.356194490192345
* // 3.9269908169872414
* // 5.497787143782138
* ```
* @group Geometry
* @category Polygon
*/
export function* edgeAngles(polygon, normalizeTo = Math.PI * 2) {
for (let i = 0; i < polygon.length; i++) {
const p1 = polygon[i];
const p2 = polygon[modulo(i + 1, polygon.length)];
const angle = Math.atan2(p2.y - p1.y, p2.x - p1.x);
yield modulo(angle, normalizeTo);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRnZS1hbmdsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZWRnZS1hbmdsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVyQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUNILE1BQU0sU0FBUyxDQUFDLENBQUMsVUFBVSxDQUN6QixPQUFnQixFQUNoQixjQUFzQixJQUFJLENBQUMsRUFBRSxHQUFHLENBQUM7SUFFakMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN4QyxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sTUFBTSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNuQyxDQUFDO0FBQ0gsQ0FBQyJ9