@technobuddha/library
Version:
A large library of useful functions
28 lines • 2.55 kB
JavaScript
import { crossProduct } from "./cross-product.js";
import { lineLength } from "./line-length.js";
/**
* Determines whether a given point lies on a specified line segment or its extension.
* @param point - The Cartesian coordinates of the point to test.
* @param line - The line segment defined by its endpoints.
* @param options - see {@link OnLineOptions}
* @returns `true` if the point lies on the line segment (or its extension if `extend` is true), otherwise `false`.
* @example
* ```typescript
* isOnLine({ x: 2, y: 2 }, { x0: 0, y0: 0, x1: 4, y1: 4 }); // true
* ```
* @group Geometry
* @category Line Segment
* @category Point
*/
export function isOnLine(point, line, { tolerance = 1e-10, extend = false } = {}) {
const isOnExtendedLine = Math.abs(crossProduct(point, { x: line.x0, y: line.y0 }, { x: line.x1, y: line.y1 })) <
tolerance;
if (extend) {
return isOnExtendedLine;
}
const len = lineLength(line);
return (isOnExtendedLine &&
lineLength({ x0: line.x0, y0: line.y0, x1: point.x, y1: point.y }) <= len &&
lineLength({ x0: line.x1, y0: line.y1, x1: point.x, y1: point.y }) <= len);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtb24tbGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pcy1vbi1saW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFvQjlDOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUN0QixLQUFnQixFQUNoQixJQUFpQixFQUNqQixFQUFFLFNBQVMsR0FBRyxLQUFLLEVBQUUsTUFBTSxHQUFHLEtBQUssS0FBb0IsRUFBRTtJQUV6RCxNQUFNLGdCQUFnQixHQUNwQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3JGLFNBQVMsQ0FBQztJQUVaLElBQUksTUFBTSxFQUFFLENBQUM7UUFDWCxPQUFPLGdCQUFnQixDQUFDO0lBQzFCLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsT0FBTyxDQUNMLGdCQUFnQjtRQUNoQixVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRztRQUN6RSxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxDQUMxRSxDQUFDO0FBQ0osQ0FBQyJ9