@inglorious/engine 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -36
- package/package.json +20 -33
- package/src/engine/ai/movement/dynamic/align.js +63 -63
- package/src/engine/ai/movement/dynamic/arrive.js +42 -43
- package/src/engine/ai/movement/dynamic/evade.js +38 -38
- package/src/engine/ai/movement/dynamic/face.js +19 -20
- package/src/engine/ai/movement/dynamic/flee.js +45 -45
- package/src/engine/ai/movement/dynamic/look-where-youre-going.js +16 -17
- package/src/engine/ai/movement/dynamic/match-velocity.js +51 -50
- package/src/engine/ai/movement/dynamic/pursue.js +38 -38
- package/src/engine/ai/movement/dynamic/seek.js +44 -44
- package/src/engine/ai/movement/dynamic/wander.js +31 -32
- package/src/engine/ai/movement/kinematic/align.js +37 -37
- package/src/engine/ai/movement/kinematic/arrive.js +42 -42
- package/src/engine/ai/movement/kinematic/face.js +19 -20
- package/src/engine/ai/movement/kinematic/flee.js +26 -26
- package/src/engine/ai/movement/kinematic/seek.js +26 -26
- package/src/engine/ai/movement/kinematic/seek.test.js +42 -42
- package/src/engine/ai/movement/kinematic/wander-as-seek.js +31 -31
- package/src/engine/ai/movement/kinematic/wander.js +27 -27
- package/src/engine/animation/sprite.js +101 -0
- package/src/engine/animation/ticker.js +38 -0
- package/src/engine/behaviors/camera.js +68 -0
- package/src/engine/behaviors/controls/dynamic/modern.js +76 -0
- package/src/engine/behaviors/controls/dynamic/shooter.js +84 -0
- package/src/engine/behaviors/controls/dynamic/tank.js +69 -0
- package/src/engine/behaviors/controls/event-handlers.js +17 -0
- package/src/engine/behaviors/controls/kinematic/modern.js +76 -0
- package/src/engine/behaviors/controls/kinematic/shooter.js +82 -0
- package/src/engine/behaviors/controls/kinematic/tank.js +67 -0
- package/src/engine/behaviors/debug/collision.js +35 -0
- package/src/engine/behaviors/fps.js +29 -0
- package/src/engine/behaviors/fsm.js +33 -0
- package/src/{game/decorators → engine/behaviors}/fsm.test.js +49 -56
- package/src/engine/behaviors/game.js +15 -0
- package/src/engine/behaviors/input/controls.js +37 -0
- package/src/engine/behaviors/input/gamepad.js +114 -0
- package/src/engine/behaviors/input/input.js +48 -0
- package/src/engine/behaviors/input/keyboard.js +64 -0
- package/src/engine/behaviors/input/mouse.js +91 -0
- package/src/engine/behaviors/physics/bouncy.js +25 -0
- package/src/engine/behaviors/physics/clamped.js +36 -0
- package/src/{game/decorators/collisions.js → engine/behaviors/physics/collidable.js} +20 -24
- package/src/engine/behaviors/physics/jumpable.js +145 -0
- package/src/engine/behaviors/ui/button.js +17 -0
- package/src/engine/collision/detection.js +110 -115
- package/src/engine/core/api.js +34 -0
- package/src/engine/core/dev-tools.js +135 -0
- package/src/engine/core/engine.js +119 -0
- package/src/engine/core/loop.js +15 -0
- package/src/engine/{loop → core/loops}/animation-frame.js +25 -26
- package/src/engine/{loop → core/loops}/elapsed.js +22 -23
- package/src/engine/{loop → core/loops}/fixed.js +27 -28
- package/src/engine/{loop → core/loops}/flash.js +13 -14
- package/src/engine/{loop → core/loops}/lag.js +26 -27
- package/src/engine/core/select.js +26 -0
- package/src/engine/core/store.js +178 -0
- package/src/engine/core/store.test.js +110 -0
- package/src/engine/movement/dynamic/modern.js +21 -24
- package/src/engine/movement/dynamic/tank.js +43 -43
- package/src/engine/movement/kinematic/modern.js +16 -16
- package/src/engine/movement/kinematic/modern.test.js +27 -27
- package/src/engine/movement/kinematic/tank.js +27 -27
- package/src/engine/physics/bounds.js +138 -0
- package/src/engine/physics/position.js +43 -0
- package/src/engine/physics/position.test.js +80 -0
- package/src/engine/systems/sprite-animation.js +27 -0
- package/src/main.js +10 -5
- package/src/renderers/canvas/absolute-position.js +18 -0
- package/src/renderers/canvas/camera.js +13 -0
- package/src/renderers/canvas/canvas-renderer.js +68 -0
- package/src/{ui → renderers}/canvas/character.js +38 -35
- package/src/{ui → renderers}/canvas/form/button.js +25 -25
- package/src/{ui → renderers}/canvas/fps.js +18 -18
- package/src/renderers/canvas/image/hitmask.js +51 -0
- package/src/{ui → renderers}/canvas/image/image.js +34 -37
- package/src/{ui → renderers}/canvas/image/sprite.js +49 -49
- package/src/{ui → renderers}/canvas/image/tilemap.js +66 -64
- package/src/{ui → renderers}/canvas/mouse.js +37 -37
- package/src/renderers/canvas/rendering-system.js +79 -0
- package/src/{ui → renderers}/canvas/shapes/circle.js +29 -31
- package/src/{ui → renderers}/canvas/shapes/rectangle.js +27 -31
- package/src/renderers/react/game/character/index.jsx +20 -0
- package/src/{ui → renderers}/react/game/cursor/index.jsx +20 -20
- package/src/{ui → renderers}/react/game/form/fields/field/index.jsx +56 -56
- package/src/{ui → renderers}/react/game/form/fields/index.jsx +12 -12
- package/src/{ui → renderers}/react/game/form/index.jsx +22 -22
- package/src/{ui → renderers}/react/game/fps/index.jsx +16 -16
- package/src/{ui → renderers}/react/game/game.jsx +72 -71
- package/src/{ui → renderers}/react/game/index.jsx +29 -29
- package/src/{ui → renderers}/react/game/platform/index.jsx +30 -30
- package/src/{ui → renderers}/react/game/scene/index.jsx +27 -25
- package/src/{ui → renderers}/react/game/sprite/index.jsx +60 -58
- package/src/{ui → renderers}/react/game/stats/index.jsx +22 -22
- package/src/{ui → renderers}/react/hocs/with-absolute-position/index.jsx +20 -20
- package/src/{ui → renderers}/react/index.jsx +9 -9
- package/src/utils/algorithms/decision-tree.js +24 -24
- package/src/utils/algorithms/decision-tree.test.js +153 -102
- package/src/utils/algorithms/path-finding.js +155 -155
- package/src/utils/algorithms/path-finding.test.js +151 -151
- package/src/utils/data-structures/array.js +83 -83
- package/src/utils/data-structures/array.test.js +173 -173
- package/src/utils/data-structures/board.js +159 -159
- package/src/utils/data-structures/board.test.js +242 -242
- package/src/utils/data-structures/boolean.js +9 -9
- package/src/utils/data-structures/heap.js +164 -164
- package/src/utils/data-structures/heap.test.js +103 -103
- package/src/utils/data-structures/object.js +138 -102
- package/src/utils/data-structures/object.test.js +218 -121
- package/src/utils/data-structures/objects.js +66 -48
- package/src/utils/data-structures/objects.test.js +99 -99
- package/src/utils/data-structures/tree.js +36 -36
- package/src/utils/data-structures/tree.test.js +33 -33
- package/src/utils/functions/functions.js +19 -19
- package/src/utils/functions/functions.test.js +23 -23
- package/src/utils/math/geometry/circle.js +70 -117
- package/src/utils/math/geometry/circle.test.js +97 -97
- package/src/utils/math/geometry/hitmask.js +70 -39
- package/src/utils/math/geometry/hitmask.test.js +155 -84
- package/src/utils/math/geometry/line.js +35 -35
- package/src/utils/math/geometry/line.test.js +49 -49
- package/src/utils/math/geometry/point.js +78 -71
- package/src/utils/math/geometry/point.test.js +81 -81
- package/src/utils/math/geometry/rectangle.js +76 -45
- package/src/utils/math/geometry/rectangle.test.js +42 -42
- package/src/utils/math/geometry/segment.js +80 -80
- package/src/utils/math/geometry/segment.test.js +183 -183
- package/src/utils/math/geometry/triangle.js +15 -15
- package/src/utils/math/geometry/triangle.test.js +11 -11
- package/src/utils/math/linear-algebra/2d.js +28 -28
- package/src/utils/math/linear-algebra/2d.test.js +17 -17
- package/src/utils/math/linear-algebra/quaternion.js +22 -22
- package/src/utils/math/linear-algebra/quaternion.test.js +25 -25
- package/src/utils/math/linear-algebra/quaternions.js +20 -20
- package/src/utils/math/linear-algebra/quaternions.test.js +29 -29
- package/src/utils/math/linear-algebra/vector.js +327 -302
- package/src/utils/math/linear-algebra/vector.test.js +265 -257
- package/src/utils/math/linear-algebra/vectors.js +122 -122
- package/src/utils/math/linear-algebra/vectors.test.js +65 -65
- package/src/utils/math/linear-interpolation.js +9 -0
- package/src/utils/math/numbers.js +90 -90
- package/src/utils/math/numbers.test.js +137 -137
- package/src/utils/math/rng.js +44 -44
- package/src/utils/math/rng.test.js +39 -39
- package/src/utils/math/statistics.js +43 -43
- package/src/utils/math/statistics.test.js +47 -47
- package/src/utils/math/trigonometry.js +89 -89
- package/src/utils/math/trigonometry.test.js +52 -52
- package/src/utils/physics/acceleration.js +61 -63
- package/src/utils/physics/friction.js +28 -30
- package/src/utils/physics/friction.test.js +42 -44
- package/src/utils/physics/gravity.js +69 -71
- package/src/utils/physics/gravity.test.js +77 -80
- package/src/utils/physics/jump.js +31 -41
- package/src/utils/physics/velocity.js +36 -38
- package/src/docs/ai/movement/dynamic/align.js +0 -131
- package/src/docs/ai/movement/dynamic/arrive.js +0 -88
- package/src/docs/ai/movement/dynamic/dynamic.mdx +0 -99
- package/src/docs/ai/movement/dynamic/dynamic.stories.js +0 -58
- package/src/docs/ai/movement/dynamic/evade.js +0 -72
- package/src/docs/ai/movement/dynamic/face.js +0 -90
- package/src/docs/ai/movement/dynamic/flee.js +0 -38
- package/src/docs/ai/movement/dynamic/look-where-youre-going.js +0 -114
- package/src/docs/ai/movement/dynamic/match-velocity.js +0 -92
- package/src/docs/ai/movement/dynamic/pursue.js +0 -72
- package/src/docs/ai/movement/dynamic/seek.js +0 -37
- package/src/docs/ai/movement/dynamic/wander.js +0 -71
- package/src/docs/ai/movement/kinematic/align.js +0 -122
- package/src/docs/ai/movement/kinematic/arrive.js +0 -78
- package/src/docs/ai/movement/kinematic/face.js +0 -82
- package/src/docs/ai/movement/kinematic/flee.js +0 -36
- package/src/docs/ai/movement/kinematic/kinematic.mdx +0 -67
- package/src/docs/ai/movement/kinematic/kinematic.stories.js +0 -42
- package/src/docs/ai/movement/kinematic/seek.js +0 -34
- package/src/docs/ai/movement/kinematic/wander-as-seek.js +0 -62
- package/src/docs/ai/movement/kinematic/wander.js +0 -28
- package/src/docs/bounds.js +0 -7
- package/src/docs/code-reuse.js +0 -35
- package/src/docs/collision/circles.js +0 -58
- package/src/docs/collision/collision.mdx +0 -27
- package/src/docs/collision/collision.stories.js +0 -22
- package/src/docs/collision/platform.js +0 -76
- package/src/docs/collision/tilemap.js +0 -181
- package/src/docs/empty.js +0 -1
- package/src/docs/engine.mdx +0 -81
- package/src/docs/engine.stories.js +0 -37
- package/src/docs/event-handlers.js +0 -68
- package/src/docs/framerate.js +0 -37
- package/src/docs/game.jsx +0 -15
- package/src/docs/image/image.js +0 -19
- package/src/docs/image/image.stories.js +0 -22
- package/src/docs/image/sprite.js +0 -39
- package/src/docs/image/tilemap.js +0 -84
- package/src/docs/input/controls.js +0 -67
- package/src/docs/input/gamepad.js +0 -67
- package/src/docs/input/input.mdx +0 -55
- package/src/docs/input/input.stories.js +0 -27
- package/src/docs/input/keyboard.js +0 -58
- package/src/docs/input/mouse.js +0 -32
- package/src/docs/instances.js +0 -49
- package/src/docs/player/dynamic/double-jump.js +0 -90
- package/src/docs/player/dynamic/dynamic.stories.js +0 -32
- package/src/docs/player/dynamic/jump.js +0 -83
- package/src/docs/player/dynamic/modern-controls.js +0 -57
- package/src/docs/player/dynamic/shooter-controls.js +0 -51
- package/src/docs/player/dynamic/tank-controls.js +0 -44
- package/src/docs/player/kinematic/double-jump.js +0 -90
- package/src/docs/player/kinematic/jump.js +0 -82
- package/src/docs/player/kinematic/kinematic.stories.js +0 -32
- package/src/docs/player/kinematic/modern-controls.js +0 -56
- package/src/docs/player/kinematic/shooter-controls.js +0 -48
- package/src/docs/player/kinematic/tank-controls.js +0 -42
- package/src/docs/quick-start/first-game.js +0 -49
- package/src/docs/quick-start/hello-world.js +0 -1
- package/src/docs/quick-start.mdx +0 -127
- package/src/docs/quick-start.stories.js +0 -17
- package/src/docs/recipes/add-and-remove.js +0 -71
- package/src/docs/recipes/add-instance.js +0 -42
- package/src/docs/recipes/decision-tree.js +0 -169
- package/src/docs/recipes/random-instances.js +0 -25
- package/src/docs/recipes/recipes.mdx +0 -81
- package/src/docs/recipes/recipes.stories.js +0 -37
- package/src/docs/recipes/remove-instance.js +0 -52
- package/src/docs/recipes/states.js +0 -64
- package/src/docs/ui/button.js +0 -28
- package/src/docs/ui/form.stories.js +0 -55
- package/src/docs/ui-chooser.jsx +0 -6
- package/src/docs/utils/data-structures/object.mdx +0 -47
- package/src/docs/utils/data-structures/objects.mdx +0 -30
- package/src/docs/utils/functions/functions.mdx +0 -34
- package/src/docs/utils/math/geometry/circle.mdx +0 -55
- package/src/docs/utils/math/geometry/point.mdx +0 -38
- package/src/docs/utils/math/geometry/rectangle.mdx +0 -24
- package/src/docs/utils/math/geometry/segment.mdx +0 -55
- package/src/docs/utils/math/geometry/triangle.mdx +0 -22
- package/src/docs/utils/math/linear-algebra/2d.mdx +0 -22
- package/src/docs/utils/math/linear-algebra/quaternion.mdx +0 -21
- package/src/docs/utils/math/linear-algebra/quaternions.mdx +0 -22
- package/src/docs/utils/math/linear-algebra/vector.mdx +0 -177
- package/src/docs/utils/math/linear-algebra/vectors.mdx +0 -58
- package/src/docs/utils/math/numbers.mdx +0 -76
- package/src/docs/utils/math/random.mdx +0 -35
- package/src/docs/utils/math/statistics.mdx +0 -38
- package/src/docs/utils/math/trigonometry.mdx +0 -85
- package/src/docs/utils/physics/friction.mdx +0 -20
- package/src/docs/utils/physics/gravity.mdx +0 -28
- package/src/engine/loop.js +0 -15
- package/src/engine/store.js +0 -174
- package/src/engine/store.test.js +0 -256
- package/src/engine.js +0 -74
- package/src/game/animation.js +0 -26
- package/src/game/bounds.js +0 -66
- package/src/game/decorators/character.js +0 -5
- package/src/game/decorators/clamp-to-bounds.js +0 -15
- package/src/game/decorators/controls/dynamic/modern.js +0 -48
- package/src/game/decorators/controls/dynamic/shooter.js +0 -47
- package/src/game/decorators/controls/dynamic/tank.js +0 -55
- package/src/game/decorators/controls/kinematic/modern.js +0 -49
- package/src/game/decorators/controls/kinematic/shooter.js +0 -45
- package/src/game/decorators/controls/kinematic/tank.js +0 -52
- package/src/game/decorators/debug/collisions.js +0 -32
- package/src/game/decorators/double-jump.js +0 -70
- package/src/game/decorators/fps.js +0 -30
- package/src/game/decorators/fsm.js +0 -27
- package/src/game/decorators/game.js +0 -11
- package/src/game/decorators/image/image.js +0 -5
- package/src/game/decorators/image/sprite.js +0 -5
- package/src/game/decorators/image/tilemap.js +0 -5
- package/src/game/decorators/input/controls.js +0 -27
- package/src/game/decorators/input/gamepad.js +0 -74
- package/src/game/decorators/input/input.js +0 -41
- package/src/game/decorators/input/keyboard.js +0 -49
- package/src/game/decorators/input/mouse.js +0 -65
- package/src/game/decorators/jump.js +0 -72
- package/src/game/decorators/platform.js +0 -5
- package/src/game/decorators/ui/button.js +0 -21
- package/src/game/sprite.js +0 -119
- package/src/ui/canvas/absolute-position.js +0 -17
- package/src/ui/canvas/image/hitmask.js +0 -37
- package/src/ui/canvas.js +0 -81
- package/src/ui/react/game/character/index.jsx +0 -30
- package/src/utils/math/geometry/platform.js +0 -42
- package/src/utils/math/geometry/platform.test.js +0 -133
- /package/src/{ui → renderers}/react/game/character/character.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/cursor/cursor.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/form/fields/field/field.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/form/fields/fields.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/form/form.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/platform/platform.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/scene/scene.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/sprite/sprite.module.css +0 -0
- /package/src/{ui → renderers}/react/hocs/with-absolute-position/with-absolute-position.module.scss +0 -0
|
@@ -1,81 +1,81 @@
|
|
|
1
|
-
import { expect, test } from "vitest"
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
intersectsCircle,
|
|
5
|
-
intersectsPoint,
|
|
6
|
-
intersectsRectangle,
|
|
7
|
-
} from "./point.js"
|
|
8
|
-
|
|
9
|
-
test("it should prove that two equal points intersect", () => {
|
|
10
|
-
const point1 = [1.5, 1.5, 0]
|
|
11
|
-
const point2 = [1.5, 1.5, 0]
|
|
12
|
-
|
|
13
|
-
expect(intersectsPoint(point1, point2)).toBe(true)
|
|
14
|
-
})
|
|
15
|
-
|
|
16
|
-
test("it should prove that two different points do not intersect", () => {
|
|
17
|
-
const point1 = [1.5, 1.5, 0]
|
|
18
|
-
const point2 = [2, 1, 0]
|
|
19
|
-
|
|
20
|
-
expect(intersectsPoint(point1, point2)).toBe(false)
|
|
21
|
-
})
|
|
22
|
-
|
|
23
|
-
test("it should prove that a point inside of a circle intersects with it", () => {
|
|
24
|
-
const point = [1.5, 1.5, 0]
|
|
25
|
-
const circle = {
|
|
26
|
-
position: [1, 1, 0],
|
|
27
|
-
radius: 1,
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
expect(intersectsCircle(point, circle)).toBe(true)
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
test("it should prove that a point on the border of a circle intersects with it", () => {
|
|
34
|
-
const point = [2, 1, 0]
|
|
35
|
-
const circle = {
|
|
36
|
-
position: [1, 1, 0],
|
|
37
|
-
radius: 1,
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
expect(intersectsCircle(point, circle)).toBe(true)
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
test("it should prove that a point outside of a circle does not intersect with it", () => {
|
|
44
|
-
const point = [2, 2, 0]
|
|
45
|
-
const circle = {
|
|
46
|
-
position: [1, 1, 0],
|
|
47
|
-
radius: 1,
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
expect(intersectsCircle(point, circle)).toBe(false)
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
test("it should prove that a point inside of a rectangle intersects with it", () => {
|
|
54
|
-
const point = [1.5, 1.5, 0]
|
|
55
|
-
const rectangle = {
|
|
56
|
-
position: [1, 1, 0],
|
|
57
|
-
size: [2, 2, 0],
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
expect(intersectsRectangle(point, rectangle)).toBe(true)
|
|
61
|
-
})
|
|
62
|
-
|
|
63
|
-
test("it should prove that a point on the border of a rectangle intersects with it", () => {
|
|
64
|
-
const point = [2, 1, 0]
|
|
65
|
-
const rectangle = {
|
|
66
|
-
position: [1, 1, 0],
|
|
67
|
-
size: [2, 2, 0],
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
expect(intersectsRectangle(point, rectangle)).toBe(true)
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
test("it should prove that a point outside of a rectangle does not intersect with it", () => {
|
|
74
|
-
const point = [2.5, 2.5, 0]
|
|
75
|
-
const rectangle = {
|
|
76
|
-
position: [1, 1, 0],
|
|
77
|
-
size: [2, 2, 0],
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
expect(intersectsRectangle(point, rectangle)).toBe(false)
|
|
81
|
-
})
|
|
1
|
+
import { expect, test } from "vitest"
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
intersectsCircle,
|
|
5
|
+
intersectsPoint,
|
|
6
|
+
intersectsRectangle,
|
|
7
|
+
} from "./point.js"
|
|
8
|
+
|
|
9
|
+
test("it should prove that two equal points intersect", () => {
|
|
10
|
+
const point1 = [1.5, 1.5, 0]
|
|
11
|
+
const point2 = [1.5, 1.5, 0]
|
|
12
|
+
|
|
13
|
+
expect(intersectsPoint(point1, point2)).toBe(true)
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
test("it should prove that two different points do not intersect", () => {
|
|
17
|
+
const point1 = [1.5, 1.5, 0]
|
|
18
|
+
const point2 = [2, 1, 0]
|
|
19
|
+
|
|
20
|
+
expect(intersectsPoint(point1, point2)).toBe(false)
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
test("it should prove that a point inside of a circle intersects with it", () => {
|
|
24
|
+
const point = [1.5, 1.5, 0]
|
|
25
|
+
const circle = {
|
|
26
|
+
position: [1, 1, 0],
|
|
27
|
+
radius: 1,
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
expect(intersectsCircle(point, circle)).toBe(true)
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
test("it should prove that a point on the border of a circle intersects with it", () => {
|
|
34
|
+
const point = [2, 1, 0]
|
|
35
|
+
const circle = {
|
|
36
|
+
position: [1, 1, 0],
|
|
37
|
+
radius: 1,
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
expect(intersectsCircle(point, circle)).toBe(true)
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
test("it should prove that a point outside of a circle does not intersect with it", () => {
|
|
44
|
+
const point = [2, 2, 0]
|
|
45
|
+
const circle = {
|
|
46
|
+
position: [1, 1, 0],
|
|
47
|
+
radius: 1,
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
expect(intersectsCircle(point, circle)).toBe(false)
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
test("it should prove that a point inside of a rectangle intersects with it", () => {
|
|
54
|
+
const point = [1.5, 1.5, 0]
|
|
55
|
+
const rectangle = {
|
|
56
|
+
position: [1, 1, 0],
|
|
57
|
+
size: [2, 2, 0],
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
expect(intersectsRectangle(point, rectangle)).toBe(true)
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
test("it should prove that a point on the border of a rectangle intersects with it", () => {
|
|
64
|
+
const point = [2, 1, 0]
|
|
65
|
+
const rectangle = {
|
|
66
|
+
position: [1, 1, 0],
|
|
67
|
+
size: [2, 2, 0],
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
expect(intersectsRectangle(point, rectangle)).toBe(true)
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
test("it should prove that a point outside of a rectangle does not intersect with it", () => {
|
|
74
|
+
const point = [2.5, 2.5, 0]
|
|
75
|
+
const rectangle = {
|
|
76
|
+
position: [1, 1, 0],
|
|
77
|
+
size: [2, 2, 0],
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
expect(intersectsRectangle(point, rectangle)).toBe(false)
|
|
81
|
+
})
|
|
@@ -1,45 +1,76 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @typedef {import("./types").
|
|
3
|
-
* @typedef {import("./types").
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
import { intersectsRectangle as
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* @
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
*
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {import("./types").Circle} Circle
|
|
3
|
+
* @typedef {import("./types").Rectangle} Rectangle
|
|
4
|
+
* @typedef {import("./types").Platform} Platform
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { intersectsRectangle as circleIntersectsRectangle } from "./circle.js"
|
|
8
|
+
import { intersectsRectangle as pointIntersectsRectangle } from "./point.js"
|
|
9
|
+
|
|
10
|
+
const HALF = 2
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Checks if a rectangle intersects with a point.
|
|
14
|
+
* @param {Rectangle} rectangle - The rectangle to check.
|
|
15
|
+
* @param {Point} point - The point to check.
|
|
16
|
+
* @returns {boolean} True if the point intersects the circle, false otherwise.
|
|
17
|
+
*/
|
|
18
|
+
export function intersectsPoint(rectangle, point) {
|
|
19
|
+
return pointIntersectsRectangle(point, rectangle)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Checks if a rectangle intersects with a circle.
|
|
24
|
+
*
|
|
25
|
+
* @param {Rectangle} rectangle - The rectangle to check.
|
|
26
|
+
* @param {Circle} circle - The circle to check.
|
|
27
|
+
* @returns {boolean} True if the rectangle intersects the circle, false otherwise.
|
|
28
|
+
*/
|
|
29
|
+
export function intersectsCircle(rectangle, circle) {
|
|
30
|
+
return circleIntersectsRectangle(circle, rectangle)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Determines whether a rectangle intersects another in 3D space.
|
|
35
|
+
*
|
|
36
|
+
* @param {Rectangle} rectangle1 - The first rectangle, defined by its position (x, y, z) and size (width, height, depth).
|
|
37
|
+
* @param {Rectangle} rectangle2 - The second rectangle, defined by its position (x, y, z) and size (width, height, depth).
|
|
38
|
+
* @returns {boolean} True if the two rectangles intersect, false otherwise.
|
|
39
|
+
*/
|
|
40
|
+
export function intersectsRectangle(rectangle1, rectangle2) {
|
|
41
|
+
const [x1, y1, z1] = rectangle1.position
|
|
42
|
+
const [w1, h1, d1] = rectangle1.size
|
|
43
|
+
const halfW1 = w1 / HALF
|
|
44
|
+
const halfH1 = h1 / HALF
|
|
45
|
+
const halfD1 = d1 / HALF
|
|
46
|
+
|
|
47
|
+
const left1 = x1 - halfW1
|
|
48
|
+
const right1 = x1 + halfW1
|
|
49
|
+
const bottom1 = y1 - halfH1
|
|
50
|
+
const top1 = y1 + halfH1
|
|
51
|
+
const back1 = z1 - halfD1
|
|
52
|
+
const front1 = z1 + halfD1
|
|
53
|
+
|
|
54
|
+
const [x2, y2, z2] = rectangle2.position
|
|
55
|
+
const [w2, h2, d2] = rectangle2.size
|
|
56
|
+
const halfW2 = w2 / HALF
|
|
57
|
+
const halfH2 = h2 / HALF
|
|
58
|
+
const halfD2 = d2 / HALF
|
|
59
|
+
|
|
60
|
+
const left2 = x2 - halfW2
|
|
61
|
+
const right2 = x2 + halfW2
|
|
62
|
+
const bottom2 = y2 - halfH2
|
|
63
|
+
const top2 = y2 + halfH2
|
|
64
|
+
const back2 = z2 - halfD2
|
|
65
|
+
const front2 = z2 + halfD2
|
|
66
|
+
|
|
67
|
+
// AABB intersection test
|
|
68
|
+
return (
|
|
69
|
+
left1 <= right2 &&
|
|
70
|
+
right1 >= left2 &&
|
|
71
|
+
bottom1 <= top2 &&
|
|
72
|
+
top1 >= bottom2 &&
|
|
73
|
+
back1 <= front2 &&
|
|
74
|
+
front1 >= back2
|
|
75
|
+
)
|
|
76
|
+
}
|
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
import { expect, test } from "vitest"
|
|
2
|
-
|
|
3
|
-
import { intersectsRectangle } from "./rectangle.js"
|
|
4
|
-
|
|
5
|
-
test("it should prove that a rectangle crossing another one intersects with it", () => {
|
|
6
|
-
const rectangle1 = {
|
|
7
|
-
position: [0, 0, 0],
|
|
8
|
-
size: [2, 2, 2],
|
|
9
|
-
}
|
|
10
|
-
const rectangle2 = {
|
|
11
|
-
position: [1, 1, 1],
|
|
12
|
-
size: [2, 2, 2],
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
expect(intersectsRectangle(rectangle1, rectangle2)).toBe(true)
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
test("it should prove that a rectangle right on top of another intersects with it", () => {
|
|
19
|
-
const rectangle1 = {
|
|
20
|
-
position: [0, 0, 0],
|
|
21
|
-
size: [2, 2, 2],
|
|
22
|
-
}
|
|
23
|
-
const rectangle2 = {
|
|
24
|
-
position: [0, 0, 0],
|
|
25
|
-
size: [2, 0, 2],
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
expect(intersectsRectangle(rectangle1, rectangle2)).toBe(true)
|
|
29
|
-
})
|
|
30
|
-
|
|
31
|
-
test("it should prove that a rectangle not crossing another one does not intersect with it", () => {
|
|
32
|
-
const rectangle1 = {
|
|
33
|
-
position: [0, 0, 0],
|
|
34
|
-
size: [2, 2, 2],
|
|
35
|
-
}
|
|
36
|
-
const rectangle2 = {
|
|
37
|
-
position: [3, 3, 3],
|
|
38
|
-
size: [2, 2, 2],
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
expect(intersectsRectangle(rectangle1, rectangle2)).toBe(false)
|
|
42
|
-
})
|
|
1
|
+
import { expect, test } from "vitest"
|
|
2
|
+
|
|
3
|
+
import { intersectsRectangle } from "./rectangle.js"
|
|
4
|
+
|
|
5
|
+
test("it should prove that a rectangle crossing another one intersects with it", () => {
|
|
6
|
+
const rectangle1 = {
|
|
7
|
+
position: [0, 0, 0],
|
|
8
|
+
size: [2, 2, 2],
|
|
9
|
+
}
|
|
10
|
+
const rectangle2 = {
|
|
11
|
+
position: [1, 1, 1],
|
|
12
|
+
size: [2, 2, 2],
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
expect(intersectsRectangle(rectangle1, rectangle2)).toBe(true)
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
test("it should prove that a rectangle right on top of another intersects with it", () => {
|
|
19
|
+
const rectangle1 = {
|
|
20
|
+
position: [0, 0, 0],
|
|
21
|
+
size: [2, 2, 2],
|
|
22
|
+
}
|
|
23
|
+
const rectangle2 = {
|
|
24
|
+
position: [0, 0, 0],
|
|
25
|
+
size: [2, 0, 2],
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
expect(intersectsRectangle(rectangle1, rectangle2)).toBe(true)
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
test("it should prove that a rectangle not crossing another one does not intersect with it", () => {
|
|
32
|
+
const rectangle1 = {
|
|
33
|
+
position: [0, 0, 0],
|
|
34
|
+
size: [2, 2, 2],
|
|
35
|
+
}
|
|
36
|
+
const rectangle2 = {
|
|
37
|
+
position: [3, 3, 3],
|
|
38
|
+
size: [2, 2, 2],
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
expect(intersectsRectangle(rectangle1, rectangle2)).toBe(false)
|
|
42
|
+
})
|
|
@@ -1,80 +1,80 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @typedef {import("./types").Segment} Segment
|
|
3
|
-
* @typedef {import("./types").Point} Point
|
|
4
|
-
* @typedef {import("./types").Circle} Circle
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import {
|
|
8
|
-
magnitude,
|
|
9
|
-
setMagnitude,
|
|
10
|
-
} from "@inglorious/utils/math/linear-algebra/vector.js"
|
|
11
|
-
import {
|
|
12
|
-
distance,
|
|
13
|
-
dot,
|
|
14
|
-
subtract,
|
|
15
|
-
sum,
|
|
16
|
-
} from "@inglorious/utils/math/linear-algebra/vectors.js"
|
|
17
|
-
|
|
18
|
-
const BEFORE_SEGMENT = 0
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Calculates the coefficients [a, b, c] of the line equation ax + bz + c = 0
|
|
22
|
-
* for a given segment in 2D space.
|
|
23
|
-
*
|
|
24
|
-
* @param {Segment} segment - The segment defined by its start (`from`) and end (`to`) points.
|
|
25
|
-
* @returns {[number, number, number]} An array [a, b, c] representing the line equation.
|
|
26
|
-
*/
|
|
27
|
-
export function coefficients(segment) {
|
|
28
|
-
const [x1, , z1] = segment.from
|
|
29
|
-
const [x2, , z2] = segment.to
|
|
30
|
-
return [z1 - z2, x2 - x1, (x1 - x2) * z1 + x1 * (z2 - z1)]
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Finds the closest point on a segment to a given point in 3D space.
|
|
35
|
-
*
|
|
36
|
-
* @param {Segment} segment - The segment defined by its start (`from`) and end (`to`) points.
|
|
37
|
-
* @param {Point} point - The point in 3D space represented as [x, y, z].
|
|
38
|
-
* @returns {Point} The closest point on the segment to the given point.
|
|
39
|
-
*/
|
|
40
|
-
export function closestPoint(segment, point) {
|
|
41
|
-
const shiftedSegment = subtract(segment.to, segment.from)
|
|
42
|
-
const shiftedPoint = subtract(point, segment.from)
|
|
43
|
-
|
|
44
|
-
const projectionLength =
|
|
45
|
-
dot(shiftedSegment, shiftedPoint) / magnitude(shiftedSegment)
|
|
46
|
-
|
|
47
|
-
if (projectionLength < BEFORE_SEGMENT) {
|
|
48
|
-
return segment.from
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
if (projectionLength > magnitude(shiftedSegment)) {
|
|
52
|
-
return segment.to
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const projectedPoint = setMagnitude(shiftedSegment, projectionLength)
|
|
56
|
-
return sum(segment.from, projectedPoint)
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Calculates the shortest distance from a point to a segment in 3D space.
|
|
61
|
-
*
|
|
62
|
-
* @param {Segment} segment - The segment defined by its start (`from`) and end (`to`) points.
|
|
63
|
-
* @param {Point} point - The point in 3D space represented as [x, y, z].
|
|
64
|
-
* @returns {number} The shortest distance from the point to the segment.
|
|
65
|
-
*/
|
|
66
|
-
export function distanceFromPoint(segment, point) {
|
|
67
|
-
const closest = closestPoint(segment, point)
|
|
68
|
-
return distance(point, closest)
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Determines whether a segment intersects with the perimeter of a circle.
|
|
73
|
-
*
|
|
74
|
-
* @param {Segment} segment - The segment defined by its start (`from`) and end (`to`) points.
|
|
75
|
-
* @param {Circle} circle - The circle defined by its position (center) and radius.
|
|
76
|
-
* @returns {boolean} `true` if the segment intersects the circle's perimeter, otherwise `false`.
|
|
77
|
-
*/
|
|
78
|
-
export function intersectsCircle(segment, circle) {
|
|
79
|
-
return distanceFromPoint(segment, circle.position) <= circle.radius
|
|
80
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {import("./types").Segment} Segment
|
|
3
|
+
* @typedef {import("./types").Point} Point
|
|
4
|
+
* @typedef {import("./types").Circle} Circle
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
magnitude,
|
|
9
|
+
setMagnitude,
|
|
10
|
+
} from "@inglorious/utils/math/linear-algebra/vector.js"
|
|
11
|
+
import {
|
|
12
|
+
distance,
|
|
13
|
+
dot,
|
|
14
|
+
subtract,
|
|
15
|
+
sum,
|
|
16
|
+
} from "@inglorious/utils/math/linear-algebra/vectors.js"
|
|
17
|
+
|
|
18
|
+
const BEFORE_SEGMENT = 0
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Calculates the coefficients [a, b, c] of the line equation ax + bz + c = 0
|
|
22
|
+
* for a given segment in 2D space.
|
|
23
|
+
*
|
|
24
|
+
* @param {Segment} segment - The segment defined by its start (`from`) and end (`to`) points.
|
|
25
|
+
* @returns {[number, number, number]} An array [a, b, c] representing the line equation.
|
|
26
|
+
*/
|
|
27
|
+
export function coefficients(segment) {
|
|
28
|
+
const [x1, , z1] = segment.from
|
|
29
|
+
const [x2, , z2] = segment.to
|
|
30
|
+
return [z1 - z2, x2 - x1, (x1 - x2) * z1 + x1 * (z2 - z1)]
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Finds the closest point on a segment to a given point in 3D space.
|
|
35
|
+
*
|
|
36
|
+
* @param {Segment} segment - The segment defined by its start (`from`) and end (`to`) points.
|
|
37
|
+
* @param {Point} point - The point in 3D space represented as [x, y, z].
|
|
38
|
+
* @returns {Point} The closest point on the segment to the given point.
|
|
39
|
+
*/
|
|
40
|
+
export function closestPoint(segment, point) {
|
|
41
|
+
const shiftedSegment = subtract(segment.to, segment.from)
|
|
42
|
+
const shiftedPoint = subtract(point, segment.from)
|
|
43
|
+
|
|
44
|
+
const projectionLength =
|
|
45
|
+
dot(shiftedSegment, shiftedPoint) / magnitude(shiftedSegment)
|
|
46
|
+
|
|
47
|
+
if (projectionLength < BEFORE_SEGMENT) {
|
|
48
|
+
return segment.from
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (projectionLength > magnitude(shiftedSegment)) {
|
|
52
|
+
return segment.to
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const projectedPoint = setMagnitude(shiftedSegment, projectionLength)
|
|
56
|
+
return sum(segment.from, projectedPoint)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Calculates the shortest distance from a point to a segment in 3D space.
|
|
61
|
+
*
|
|
62
|
+
* @param {Segment} segment - The segment defined by its start (`from`) and end (`to`) points.
|
|
63
|
+
* @param {Point} point - The point in 3D space represented as [x, y, z].
|
|
64
|
+
* @returns {number} The shortest distance from the point to the segment.
|
|
65
|
+
*/
|
|
66
|
+
export function distanceFromPoint(segment, point) {
|
|
67
|
+
const closest = closestPoint(segment, point)
|
|
68
|
+
return distance(point, closest)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Determines whether a segment intersects with the perimeter of a circle.
|
|
73
|
+
*
|
|
74
|
+
* @param {Segment} segment - The segment defined by its start (`from`) and end (`to`) points.
|
|
75
|
+
* @param {Circle} circle - The circle defined by its position (center) and radius.
|
|
76
|
+
* @returns {boolean} `true` if the segment intersects the circle's perimeter, otherwise `false`.
|
|
77
|
+
*/
|
|
78
|
+
export function intersectsCircle(segment, circle) {
|
|
79
|
+
return distanceFromPoint(segment, circle.position) <= circle.radius
|
|
80
|
+
}
|