From 68c0fca1249fe9108aec54c7d1c1eacd73a15fde Mon Sep 17 00:00:00 2001 From: Wouter van Wageningen Date: Fri, 28 Apr 2023 16:42:35 +0000 Subject: [PATCH] Code and tests --- packages/core/src/index.mjs | 2 ++ packages/core/src/utils.mjs | 19 +++++++++++++++ packages/core/tests/utils.test.mjs | 37 ++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+) diff --git a/packages/core/src/index.mjs b/packages/core/src/index.mjs index 38657c84c0d..fe75b9f5ad1 100644 --- a/packages/core/src/index.mjs +++ b/packages/core/src/index.mjs @@ -13,6 +13,7 @@ import { beamIntersectsX, beamIntersectsY, beamsIntersect, + beamIntersectsCurve, capitalize, circlesIntersect, curveEdge, @@ -55,6 +56,7 @@ export { beamIntersectsX, beamIntersectsY, beamsIntersect, + beamIntersectsCurve, capitalize, circlesIntersect, curveEdge, diff --git a/packages/core/src/utils.mjs b/packages/core/src/utils.mjs index aea6af3d686..11b49f8b5f8 100644 --- a/packages/core/src/utils.mjs +++ b/packages/core/src/utils.mjs @@ -111,6 +111,25 @@ export function beamsIntersect(a1, a2, b1, b2) { } } +/** + * Find the intersections between an endless line (beam) and a curve + * + * + * @param {Point} start - Start Point of the line + * @param {Point} end - End Point of the line + * @param {Point} from - Start Point of the curve + * @param {Point} cp1 - Control Point at the start of the curve + * @param {Point} cp2 - Control Point at the end of the curve + * @param {Point} to - End Point of the curve + * @return {Array} intersections - An array of Points at the intersections + */ +export function beamIntersectsCurve(start, end, from, cp1, cp2, to) { + let _start = new Point(start.x + (start.x - end.x) * 1000, start.y + (start.y - end.y) * 1000) + let _end = new Point(end.x + (end.x - start.x) * 1000, end.y + (end.y - start.y) * 1000) + console.log({ _start: _start, _end: _end }) + return lineIntersectsCurve(_start, _end, from, cp1, cp2, to) +} + /** * Returns the string you pass with with the first character converted to uppercase * diff --git a/packages/core/tests/utils.test.mjs b/packages/core/tests/utils.test.mjs index bd0817f0ee6..cc5b88a78b7 100644 --- a/packages/core/tests/utils.test.mjs +++ b/packages/core/tests/utils.test.mjs @@ -11,6 +11,7 @@ import { splitCurve, beamIntersectsX, beamIntersectsY, + beamIntersectsCurve, units, lineIntersectsCurve, curveIntersectsX, @@ -70,6 +71,42 @@ describe('Utils', () => { expect(round(X.x)).to.equal(7.14) expect(round(X.y)).to.equal(40) }) + it('Should find no intersections between a curve and a beam', () => { + let A = new Point(10, 10) + let Acp = new Point(10, 30) + let B = new Point(110, 10) + let Bcp = new Point(110, 30) + let E = new Point(10, 40) + let D = new Point(20, 40) + + let hit = beamIntersectsCurve(E, D, A, Acp, Bcp, B) + expect(hit).to.equal(false) + }) + + it('Should find one intersections between a curve and a beam', () => { + let A = new Point(10, 10) + let Acp = new Point(10, 30) + let B = new Point(110, 10) + let Bcp = new Point(110, 30) + let E = new Point(50, 14) + let D = new Point(55, 16) + + let hit = beamIntersectsCurve(E, D, A, Acp, Bcp, B) + expect(round(hit.x)).to.equal(75.79) + expect(round(hit.y)).to.equal(24.31) + }) + + it('Should find two intersections between a curve and a beam', () => { + let A = new Point(10, 10) + let Acp = new Point(10, 30) + let B = new Point(110, 10) + let Bcp = new Point(110, 30) + let E = new Point(0, 14) + let D = new Point(5, 15) + + let hits = beamIntersectsCurve(E, D, A, Acp, Bcp, B) + expect(hits.length).to.equal(2) + }) it("Should return false when two lines don't intersect", () => { let a = new Point(10, 20)