123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249 |
- import {
- lineIntersectsLine,
- lineRotate,
- pointInEllipse,
- pointInPolygon,
- pointLeftofLine,
- pointOnCurve,
- pointOnEllipse,
- pointOnLine,
- pointOnPolygon,
- pointOnPolyline,
- pointRightofLine,
- pointRotate,
- } from "./geometry";
- import { Curve, Ellipse, Line, Point, Polygon, Polyline } from "./shape";
- describe("point and line", () => {
- const line: Line = [
- [1, 0],
- [1, 2],
- ];
- it("point on left or right of line", () => {
- expect(pointLeftofLine([0, 1], line)).toBe(true);
- expect(pointLeftofLine([1, 1], line)).toBe(false);
- expect(pointLeftofLine([2, 1], line)).toBe(false);
- expect(pointRightofLine([0, 1], line)).toBe(false);
- expect(pointRightofLine([1, 1], line)).toBe(false);
- expect(pointRightofLine([2, 1], line)).toBe(true);
- });
- it("point on the line", () => {
- expect(pointOnLine([0, 1], line)).toBe(false);
- expect(pointOnLine([1, 1], line, 0)).toBe(true);
- expect(pointOnLine([2, 1], line)).toBe(false);
- });
- });
- describe("point and polylines", () => {
- const polyline: Polyline = [
- [
- [1, 0],
- [1, 2],
- ],
- [
- [1, 2],
- [2, 2],
- ],
- [
- [2, 2],
- [2, 1],
- ],
- [
- [2, 1],
- [3, 1],
- ],
- ];
- it("point on the line", () => {
- expect(pointOnPolyline([1, 0], polyline)).toBe(true);
- expect(pointOnPolyline([1, 2], polyline)).toBe(true);
- expect(pointOnPolyline([2, 2], polyline)).toBe(true);
- expect(pointOnPolyline([2, 1], polyline)).toBe(true);
- expect(pointOnPolyline([3, 1], polyline)).toBe(true);
- expect(pointOnPolyline([1, 1], polyline)).toBe(true);
- expect(pointOnPolyline([2, 1.5], polyline)).toBe(true);
- expect(pointOnPolyline([2.5, 1], polyline)).toBe(true);
- expect(pointOnPolyline([0, 1], polyline)).toBe(false);
- expect(pointOnPolyline([2.1, 1.5], polyline)).toBe(false);
- });
- it("point on the line with rotation", () => {
- const truePoints = [
- [1, 0],
- [1, 2],
- [2, 2],
- [2, 1],
- [3, 1],
- ] as Point[];
- truePoints.forEach((point) => {
- const rotation = Math.random() * 360;
- const rotatedPoint = pointRotate(point, rotation);
- const rotatedPolyline: Polyline = polyline.map((line) =>
- lineRotate(line, rotation, [0, 0]),
- );
- expect(pointOnPolyline(rotatedPoint, rotatedPolyline)).toBe(true);
- });
- const falsePoints = [
- [0, 1],
- [2.1, 1.5],
- ] as Point[];
- falsePoints.forEach((point) => {
- const rotation = Math.random() * 360;
- const rotatedPoint = pointRotate(point, rotation);
- const rotatedPolyline: Polyline = polyline.map((line) =>
- lineRotate(line, rotation, [0, 0]),
- );
- expect(pointOnPolyline(rotatedPoint, rotatedPolyline)).toBe(false);
- });
- });
- });
- describe("point and polygon", () => {
- const polygon: Polygon = [
- [10, 10],
- [50, 10],
- [50, 50],
- [10, 50],
- ];
- it("point on polygon", () => {
- expect(pointOnPolygon([30, 10], polygon)).toBe(true);
- expect(pointOnPolygon([50, 30], polygon)).toBe(true);
- expect(pointOnPolygon([30, 50], polygon)).toBe(true);
- expect(pointOnPolygon([10, 30], polygon)).toBe(true);
- expect(pointOnPolygon([30, 30], polygon)).toBe(false);
- expect(pointOnPolygon([30, 70], polygon)).toBe(false);
- });
- it("point in polygon", () => {
- const polygon: Polygon = [
- [0, 0],
- [2, 0],
- [2, 2],
- [0, 2],
- ];
- expect(pointInPolygon([1, 1], polygon)).toBe(true);
- expect(pointInPolygon([3, 3], polygon)).toBe(false);
- });
- });
- describe("point and curve", () => {
- const curve: Curve = [
- [1.4, 1.65],
- [1.9, 7.9],
- [5.9, 1.65],
- [6.44, 4.84],
- ];
- it("point on curve", () => {
- expect(pointOnCurve(curve[0], curve)).toBe(true);
- expect(pointOnCurve(curve[3], curve)).toBe(true);
- expect(pointOnCurve([2, 4], curve, 0.1)).toBe(true);
- expect(pointOnCurve([4, 4.4], curve, 0.1)).toBe(true);
- expect(pointOnCurve([5.6, 3.85], curve, 0.1)).toBe(true);
- expect(pointOnCurve([5.6, 4], curve, 0.1)).toBe(false);
- expect(pointOnCurve(curve[1], curve, 0.1)).toBe(false);
- expect(pointOnCurve(curve[2], curve, 0.1)).toBe(false);
- });
- });
- describe("point and ellipse", () => {
- const ellipse: Ellipse = {
- center: [0, 0],
- angle: 0,
- halfWidth: 2,
- halfHeight: 1,
- };
- it("point on ellipse", () => {
- [
- [0, 1],
- [0, -1],
- [2, 0],
- [-2, 0],
- ].forEach((point) => {
- expect(pointOnEllipse(point as Point, ellipse)).toBe(true);
- });
- expect(pointOnEllipse([-1.4, 0.7], ellipse, 0.1)).toBe(true);
- expect(pointOnEllipse([-1.4, 0.71], ellipse, 0.01)).toBe(true);
- expect(pointOnEllipse([1.4, 0.7], ellipse, 0.1)).toBe(true);
- expect(pointOnEllipse([1.4, 0.71], ellipse, 0.01)).toBe(true);
- expect(pointOnEllipse([1, -0.86], ellipse, 0.1)).toBe(true);
- expect(pointOnEllipse([1, -0.86], ellipse, 0.01)).toBe(true);
- expect(pointOnEllipse([-1, -0.86], ellipse, 0.1)).toBe(true);
- expect(pointOnEllipse([-1, -0.86], ellipse, 0.01)).toBe(true);
- expect(pointOnEllipse([-1, 0.8], ellipse)).toBe(false);
- expect(pointOnEllipse([1, -0.8], ellipse)).toBe(false);
- });
- it("point in ellipse", () => {
- [
- [0, 1],
- [0, -1],
- [2, 0],
- [-2, 0],
- ].forEach((point) => {
- expect(pointInEllipse(point as Point, ellipse)).toBe(true);
- });
- expect(pointInEllipse([-1, 0.8], ellipse)).toBe(true);
- expect(pointInEllipse([1, -0.8], ellipse)).toBe(true);
- expect(pointInEllipse([-1, 1], ellipse)).toBe(false);
- expect(pointInEllipse([-1.4, 0.8], ellipse)).toBe(false);
- });
- });
- describe("line and line", () => {
- const lineA: Line = [
- [1, 4],
- [3, 4],
- ];
- const lineB: Line = [
- [2, 1],
- [2, 7],
- ];
- const lineC: Line = [
- [1, 8],
- [3, 8],
- ];
- const lineD: Line = [
- [1, 8],
- [3, 8],
- ];
- const lineE: Line = [
- [1, 9],
- [3, 9],
- ];
- const lineF: Line = [
- [1, 2],
- [3, 4],
- ];
- const lineG: Line = [
- [0, 1],
- [2, 3],
- ];
- it("intersection", () => {
- expect(lineIntersectsLine(lineA, lineB)).toBe(true);
- expect(lineIntersectsLine(lineA, lineC)).toBe(false);
- expect(lineIntersectsLine(lineB, lineC)).toBe(false);
- expect(lineIntersectsLine(lineC, lineD)).toBe(true);
- expect(lineIntersectsLine(lineE, lineD)).toBe(false);
- expect(lineIntersectsLine(lineF, lineG)).toBe(true);
- });
- });
|