@vived/core 1.0.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 +29 -0
- package/babel.config.js +12 -0
- package/dist/AppObject/AppObject.d.ts +15 -0
- package/dist/AppObject/AppObject.d.ts.map +1 -0
- package/dist/AppObject/AppObject.js +54 -0
- package/dist/AppObject/AppObject.js.map +1 -0
- package/dist/AppObject/AppObject.test.d.ts +7 -0
- package/dist/AppObject/AppObject.test.d.ts.map +1 -0
- package/dist/AppObject/AppObject.test.js +110 -0
- package/dist/AppObject/AppObject.test.js.map +1 -0
- package/dist/AppObject/AppObjectComponent.d.ts +26 -0
- package/dist/AppObject/AppObjectComponent.d.ts.map +1 -0
- package/dist/AppObject/AppObjectComponent.js +78 -0
- package/dist/AppObject/AppObjectComponent.js.map +1 -0
- package/dist/AppObject/AppObjectComponent.test.d.ts +2 -0
- package/dist/AppObject/AppObjectComponent.test.d.ts.map +1 -0
- package/dist/AppObject/AppObjectComponent.test.js +130 -0
- package/dist/AppObject/AppObjectComponent.test.js.map +1 -0
- package/dist/AppObject/AppObjectController.d.ts +5 -0
- package/dist/AppObject/AppObjectController.d.ts.map +1 -0
- package/dist/AppObject/AppObjectController.js +8 -0
- package/dist/AppObject/AppObjectController.js.map +1 -0
- package/dist/AppObject/AppObjectEntity.d.ts +16 -0
- package/dist/AppObject/AppObjectEntity.d.ts.map +1 -0
- package/dist/AppObject/AppObjectEntity.js +34 -0
- package/dist/AppObject/AppObjectEntity.js.map +1 -0
- package/dist/AppObject/AppObjectEntity.test.d.ts +2 -0
- package/dist/AppObject/AppObjectEntity.test.d.ts.map +1 -0
- package/dist/AppObject/AppObjectEntity.test.js +106 -0
- package/dist/AppObject/AppObjectEntity.test.js.map +1 -0
- package/dist/AppObject/AppObjectEntityRepo.d.ts +16 -0
- package/dist/AppObject/AppObjectEntityRepo.d.ts.map +1 -0
- package/dist/AppObject/AppObjectEntityRepo.js +52 -0
- package/dist/AppObject/AppObjectEntityRepo.js.map +1 -0
- package/dist/AppObject/AppObjectEntityRepo.test.d.ts +2 -0
- package/dist/AppObject/AppObjectEntityRepo.test.d.ts.map +1 -0
- package/dist/AppObject/AppObjectEntityRepo.test.js +147 -0
- package/dist/AppObject/AppObjectEntityRepo.test.js.map +1 -0
- package/dist/AppObject/AppObjectPM.d.ts +13 -0
- package/dist/AppObject/AppObjectPM.d.ts.map +1 -0
- package/dist/AppObject/AppObjectPM.js +36 -0
- package/dist/AppObject/AppObjectPM.js.map +1 -0
- package/dist/AppObject/AppObjectPM.test.d.ts +2 -0
- package/dist/AppObject/AppObjectPM.test.d.ts.map +1 -0
- package/dist/AppObject/AppObjectPM.test.js +101 -0
- package/dist/AppObject/AppObjectPM.test.js.map +1 -0
- package/dist/AppObject/AppObjectRepo.d.ts +26 -0
- package/dist/AppObject/AppObjectRepo.d.ts.map +1 -0
- package/dist/AppObject/AppObjectRepo.js +128 -0
- package/dist/AppObject/AppObjectRepo.js.map +1 -0
- package/dist/AppObject/AppObjectRepo.test.d.ts +2 -0
- package/dist/AppObject/AppObjectRepo.test.d.ts.map +1 -0
- package/dist/AppObject/AppObjectRepo.test.js +211 -0
- package/dist/AppObject/AppObjectRepo.test.js.map +1 -0
- package/dist/AppObject/AppObjectUC.d.ts +5 -0
- package/dist/AppObject/AppObjectUC.d.ts.map +1 -0
- package/dist/AppObject/AppObjectUC.js +8 -0
- package/dist/AppObject/AppObjectUC.js.map +1 -0
- package/dist/AppObject/AppObjectView.d.ts +5 -0
- package/dist/AppObject/AppObjectView.d.ts.map +1 -0
- package/dist/AppObject/AppObjectView.js +8 -0
- package/dist/AppObject/AppObjectView.js.map +1 -0
- package/dist/AppObject/getSingletonComponent.d.ts +4 -0
- package/dist/AppObject/getSingletonComponent.d.ts.map +1 -0
- package/dist/AppObject/getSingletonComponent.js +4 -0
- package/dist/AppObject/getSingletonComponent.js.map +1 -0
- package/dist/AppObject/getSingletonComponent.test.d.ts +2 -0
- package/dist/AppObject/getSingletonComponent.test.d.ts.map +1 -0
- package/dist/AppObject/getSingletonComponent.test.js +11 -0
- package/dist/AppObject/getSingletonComponent.test.js.map +1 -0
- package/dist/AppObject/index.d.ts +11 -0
- package/dist/AppObject/index.d.ts.map +1 -0
- package/dist/AppObject/index.js +11 -0
- package/dist/AppObject/index.js.map +1 -0
- package/dist/AppObject/printAppObjectDetails.d.ts +3 -0
- package/dist/AppObject/printAppObjectDetails.d.ts.map +1 -0
- package/dist/AppObject/printAppObjectDetails.js +15 -0
- package/dist/AppObject/printAppObjectDetails.js.map +1 -0
- package/dist/Entities/MemoizedAngle.d.ts +10 -0
- package/dist/Entities/MemoizedAngle.d.ts.map +1 -0
- package/dist/Entities/MemoizedAngle.js +19 -0
- package/dist/Entities/MemoizedAngle.js.map +1 -0
- package/dist/Entities/MemoizedAngle.test.d.ts +2 -0
- package/dist/Entities/MemoizedAngle.test.d.ts.map +1 -0
- package/dist/Entities/MemoizedAngle.test.js +28 -0
- package/dist/Entities/MemoizedAngle.test.js.map +1 -0
- package/dist/Entities/MemoizedBoolean.d.ts +9 -0
- package/dist/Entities/MemoizedBoolean.d.ts.map +1 -0
- package/dist/Entities/MemoizedBoolean.js +19 -0
- package/dist/Entities/MemoizedBoolean.js.map +1 -0
- package/dist/Entities/MemoizedBoolean.test.d.ts +2 -0
- package/dist/Entities/MemoizedBoolean.test.d.ts.map +1 -0
- package/dist/Entities/MemoizedBoolean.test.js +32 -0
- package/dist/Entities/MemoizedBoolean.test.js.map +1 -0
- package/dist/Entities/MemoizedColor.d.ts +10 -0
- package/dist/Entities/MemoizedColor.d.ts.map +1 -0
- package/dist/Entities/MemoizedColor.js +20 -0
- package/dist/Entities/MemoizedColor.js.map +1 -0
- package/dist/Entities/MemoizedColor.test.d.ts +2 -0
- package/dist/Entities/MemoizedColor.test.d.ts.map +1 -0
- package/dist/Entities/MemoizedColor.test.js +30 -0
- package/dist/Entities/MemoizedColor.test.js.map +1 -0
- package/dist/Entities/MemoizedNumber.d.ts +9 -0
- package/dist/Entities/MemoizedNumber.d.ts.map +1 -0
- package/dist/Entities/MemoizedNumber.js +19 -0
- package/dist/Entities/MemoizedNumber.js.map +1 -0
- package/dist/Entities/MemoizedNumber.test.d.ts +2 -0
- package/dist/Entities/MemoizedNumber.test.d.ts.map +1 -0
- package/dist/Entities/MemoizedNumber.test.js +27 -0
- package/dist/Entities/MemoizedNumber.test.js.map +1 -0
- package/dist/Entities/MemoizedQuaternion.d.ts +10 -0
- package/dist/Entities/MemoizedQuaternion.d.ts.map +1 -0
- package/dist/Entities/MemoizedQuaternion.js +20 -0
- package/dist/Entities/MemoizedQuaternion.js.map +1 -0
- package/dist/Entities/MemoizedQuaternion.test.d.ts +2 -0
- package/dist/Entities/MemoizedQuaternion.test.d.ts.map +1 -0
- package/dist/Entities/MemoizedQuaternion.test.js +30 -0
- package/dist/Entities/MemoizedQuaternion.test.js.map +1 -0
- package/dist/Entities/MemoizedString.d.ts +9 -0
- package/dist/Entities/MemoizedString.d.ts.map +1 -0
- package/dist/Entities/MemoizedString.js +19 -0
- package/dist/Entities/MemoizedString.js.map +1 -0
- package/dist/Entities/MemoizedString.test.d.ts +2 -0
- package/dist/Entities/MemoizedString.test.d.ts.map +1 -0
- package/dist/Entities/MemoizedString.test.js +27 -0
- package/dist/Entities/MemoizedString.test.js.map +1 -0
- package/dist/Entities/MemoizedVector2.d.ts +10 -0
- package/dist/Entities/MemoizedVector2.d.ts.map +1 -0
- package/dist/Entities/MemoizedVector2.js +20 -0
- package/dist/Entities/MemoizedVector2.js.map +1 -0
- package/dist/Entities/MemoizedVector2.test.d.ts +2 -0
- package/dist/Entities/MemoizedVector2.test.d.ts.map +1 -0
- package/dist/Entities/MemoizedVector2.test.js +30 -0
- package/dist/Entities/MemoizedVector2.test.js.map +1 -0
- package/dist/Entities/MemoizedVector3.d.ts +10 -0
- package/dist/Entities/MemoizedVector3.d.ts.map +1 -0
- package/dist/Entities/MemoizedVector3.js +20 -0
- package/dist/Entities/MemoizedVector3.js.map +1 -0
- package/dist/Entities/MemoizedVector3.test.d.ts +2 -0
- package/dist/Entities/MemoizedVector3.test.d.ts.map +1 -0
- package/dist/Entities/MemoizedVector3.test.js +30 -0
- package/dist/Entities/MemoizedVector3.test.js.map +1 -0
- package/dist/Entities/ObservableEntity.d.ts +8 -0
- package/dist/Entities/ObservableEntity.d.ts.map +1 -0
- package/dist/Entities/ObservableEntity.js +16 -0
- package/dist/Entities/ObservableEntity.js.map +1 -0
- package/dist/Entities/ObservableEntity.test.d.ts +2 -0
- package/dist/Entities/ObservableEntity.test.d.ts.map +1 -0
- package/dist/Entities/ObservableEntity.test.js +23 -0
- package/dist/Entities/ObservableEntity.test.js.map +1 -0
- package/dist/Entities/ObserverList.d.ts +8 -0
- package/dist/Entities/ObserverList.d.ts.map +1 -0
- package/dist/Entities/ObserverList.js +23 -0
- package/dist/Entities/ObserverList.js.map +1 -0
- package/dist/Entities/ObserverList.test.d.ts +2 -0
- package/dist/Entities/ObserverList.test.d.ts.map +1 -0
- package/dist/Entities/ObserverList.test.js +42 -0
- package/dist/Entities/ObserverList.test.js.map +1 -0
- package/dist/Entities/index.d.ts +11 -0
- package/dist/Entities/index.d.ts.map +1 -0
- package/dist/Entities/index.js +11 -0
- package/dist/Entities/index.js.map +1 -0
- package/dist/Types/AppBoundary.d.ts +11 -0
- package/dist/Types/AppBoundary.d.ts.map +1 -0
- package/dist/Types/AppBoundary.js +2 -0
- package/dist/Types/AppBoundary.js.map +1 -0
- package/dist/Types/EaseFn.d.ts +2 -0
- package/dist/Types/EaseFn.d.ts.map +1 -0
- package/dist/Types/EaseFn.js +2 -0
- package/dist/Types/EaseFn.js.map +1 -0
- package/dist/Types/PmAdapter.d.ts +7 -0
- package/dist/Types/PmAdapter.d.ts.map +1 -0
- package/dist/Types/PmAdapter.js +2 -0
- package/dist/Types/PmAdapter.js.map +1 -0
- package/dist/Types/SingletonPmAdapter.d.ts +7 -0
- package/dist/Types/SingletonPmAdapter.d.ts.map +1 -0
- package/dist/Types/SingletonPmAdapter.js +2 -0
- package/dist/Types/SingletonPmAdapter.js.map +1 -0
- package/dist/Types/index.d.ts +5 -0
- package/dist/Types/index.d.ts.map +1 -0
- package/dist/Types/index.js +5 -0
- package/dist/Types/index.js.map +1 -0
- package/dist/ValueObjects/Angle.d.ts +27 -0
- package/dist/ValueObjects/Angle.d.ts.map +1 -0
- package/dist/ValueObjects/Angle.js +43 -0
- package/dist/ValueObjects/Angle.js.map +1 -0
- package/dist/ValueObjects/Angle.test.d.ts +2 -0
- package/dist/ValueObjects/Angle.test.d.ts.map +1 -0
- package/dist/ValueObjects/Angle.test.js +26 -0
- package/dist/ValueObjects/Angle.test.js.map +1 -0
- package/dist/ValueObjects/Color.d.ts +83 -0
- package/dist/ValueObjects/Color.d.ts.map +1 -0
- package/dist/ValueObjects/Color.js +855 -0
- package/dist/ValueObjects/Color.js.map +1 -0
- package/dist/ValueObjects/Color.test.d.ts +2 -0
- package/dist/ValueObjects/Color.test.d.ts.map +1 -0
- package/dist/ValueObjects/Color.test.js +145 -0
- package/dist/ValueObjects/Color.test.js.map +1 -0
- package/dist/ValueObjects/LineSegment2D.d.ts +12 -0
- package/dist/ValueObjects/LineSegment2D.d.ts.map +1 -0
- package/dist/ValueObjects/LineSegment2D.js +68 -0
- package/dist/ValueObjects/LineSegment2D.js.map +1 -0
- package/dist/ValueObjects/LineSegment2D.test.d.ts +2 -0
- package/dist/ValueObjects/LineSegment2D.test.d.ts.map +1 -0
- package/dist/ValueObjects/LineSegment2D.test.js +100 -0
- package/dist/ValueObjects/LineSegment2D.test.js.map +1 -0
- package/dist/ValueObjects/Matrix.d.ts +124 -0
- package/dist/ValueObjects/Matrix.d.ts.map +1 -0
- package/dist/ValueObjects/Matrix.js +462 -0
- package/dist/ValueObjects/Matrix.js.map +1 -0
- package/dist/ValueObjects/Matrix.test.d.ts +2 -0
- package/dist/ValueObjects/Matrix.test.d.ts.map +1 -0
- package/dist/ValueObjects/Matrix.test.js +383 -0
- package/dist/ValueObjects/Matrix.test.js.map +1 -0
- package/dist/ValueObjects/ParametricLine.d.ts +31 -0
- package/dist/ValueObjects/ParametricLine.d.ts.map +1 -0
- package/dist/ValueObjects/ParametricLine.js +73 -0
- package/dist/ValueObjects/ParametricLine.js.map +1 -0
- package/dist/ValueObjects/ParametricLine.test.d.ts +2 -0
- package/dist/ValueObjects/ParametricLine.test.d.ts.map +1 -0
- package/dist/ValueObjects/ParametricLine.test.js +124 -0
- package/dist/ValueObjects/ParametricLine.test.js.map +1 -0
- package/dist/ValueObjects/ParametricPlane.d.ts +21 -0
- package/dist/ValueObjects/ParametricPlane.d.ts.map +1 -0
- package/dist/ValueObjects/ParametricPlane.js +61 -0
- package/dist/ValueObjects/ParametricPlane.js.map +1 -0
- package/dist/ValueObjects/ParametricPlane.test.d.ts +2 -0
- package/dist/ValueObjects/ParametricPlane.test.d.ts.map +1 -0
- package/dist/ValueObjects/ParametricPlane.test.js +99 -0
- package/dist/ValueObjects/ParametricPlane.test.js.map +1 -0
- package/dist/ValueObjects/Quaternion.d.ts +113 -0
- package/dist/ValueObjects/Quaternion.d.ts.map +1 -0
- package/dist/ValueObjects/Quaternion.js +286 -0
- package/dist/ValueObjects/Quaternion.js.map +1 -0
- package/dist/ValueObjects/Quaternion.test.d.ts +2 -0
- package/dist/ValueObjects/Quaternion.test.d.ts.map +1 -0
- package/dist/ValueObjects/Quaternion.test.js +238 -0
- package/dist/ValueObjects/Quaternion.test.js.map +1 -0
- package/dist/ValueObjects/Rectangle.d.ts +16 -0
- package/dist/ValueObjects/Rectangle.d.ts.map +1 -0
- package/dist/ValueObjects/Rectangle.js +20 -0
- package/dist/ValueObjects/Rectangle.js.map +1 -0
- package/dist/ValueObjects/Rectangle.test.d.ts +2 -0
- package/dist/ValueObjects/Rectangle.test.d.ts.map +1 -0
- package/dist/ValueObjects/Rectangle.test.js +30 -0
- package/dist/ValueObjects/Rectangle.test.js.map +1 -0
- package/dist/ValueObjects/Vector2.d.ts +121 -0
- package/dist/ValueObjects/Vector2.d.ts.map +1 -0
- package/dist/ValueObjects/Vector2.js +180 -0
- package/dist/ValueObjects/Vector2.js.map +1 -0
- package/dist/ValueObjects/Vector2.test.d.ts +2 -0
- package/dist/ValueObjects/Vector2.test.d.ts.map +1 -0
- package/dist/ValueObjects/Vector2.test.js +134 -0
- package/dist/ValueObjects/Vector2.test.js.map +1 -0
- package/dist/ValueObjects/Vector3.d.ts +150 -0
- package/dist/ValueObjects/Vector3.d.ts.map +1 -0
- package/dist/ValueObjects/Vector3.js +227 -0
- package/dist/ValueObjects/Vector3.js.map +1 -0
- package/dist/ValueObjects/Vector3.test.d.ts +2 -0
- package/dist/ValueObjects/Vector3.test.d.ts.map +1 -0
- package/dist/ValueObjects/Vector3.test.js +186 -0
- package/dist/ValueObjects/Vector3.test.js.map +1 -0
- package/dist/ValueObjects/index.d.ts +11 -0
- package/dist/ValueObjects/index.d.ts.map +1 -0
- package/dist/ValueObjects/index.js +11 -0
- package/dist/ValueObjects/index.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/jestconfig.json +10 -0
- package/package.json +41 -0
- package/src/AppObject/AppObject.test.ts +158 -0
- package/src/AppObject/AppObject.ts +83 -0
- package/src/AppObject/AppObjectComponent.test.ts +219 -0
- package/src/AppObject/AppObjectComponent.ts +100 -0
- package/src/AppObject/AppObjectController.ts +8 -0
- package/src/AppObject/AppObjectEntity.test.ts +151 -0
- package/src/AppObject/AppObjectEntity.ts +45 -0
- package/src/AppObject/AppObjectEntityRepo.test.ts +211 -0
- package/src/AppObject/AppObjectEntityRepo.ts +61 -0
- package/src/AppObject/AppObjectPM.test.ts +152 -0
- package/src/AppObject/AppObjectPM.ts +43 -0
- package/src/AppObject/AppObjectRepo.test.ts +317 -0
- package/src/AppObject/AppObjectRepo.ts +203 -0
- package/src/AppObject/AppObjectUC.ts +5 -0
- package/src/AppObject/AppObjectView.ts +5 -0
- package/src/AppObject/getSingletonComponent.test.ts +17 -0
- package/src/AppObject/getSingletonComponent.ts +9 -0
- package/src/AppObject/index.ts +10 -0
- package/src/AppObject/printAppObjectDetails.ts +17 -0
- package/src/Entities/MemoizedAngle.test.ts +38 -0
- package/src/Entities/MemoizedAngle.ts +25 -0
- package/src/Entities/MemoizedBoolean.test.ts +45 -0
- package/src/Entities/MemoizedBoolean.ts +23 -0
- package/src/Entities/MemoizedColor.test.ts +39 -0
- package/src/Entities/MemoizedColor.ts +27 -0
- package/src/Entities/MemoizedNumber.test.ts +37 -0
- package/src/Entities/MemoizedNumber.ts +23 -0
- package/src/Entities/MemoizedQuaternion.test.ts +39 -0
- package/src/Entities/MemoizedQuaternion.ts +27 -0
- package/src/Entities/MemoizedString.test.ts +37 -0
- package/src/Entities/MemoizedString.ts +23 -0
- package/src/Entities/MemoizedVector2.test.ts +39 -0
- package/src/Entities/MemoizedVector2.ts +27 -0
- package/src/Entities/MemoizedVector3.test.ts +39 -0
- package/src/Entities/MemoizedVector3.ts +27 -0
- package/src/Entities/ObservableEntity.test.ts +28 -0
- package/src/Entities/ObservableEntity.ts +17 -0
- package/src/Entities/ObserverList.test.ts +61 -0
- package/src/Entities/ObserverList.ts +24 -0
- package/src/Entities/index.ts +10 -0
- package/src/Types/AppBoundary.ts +13 -0
- package/src/Types/EaseFn.ts +1 -0
- package/src/Types/PmAdapter.ts +15 -0
- package/src/Types/SingletonPmAdapter.ts +7 -0
- package/src/Types/index.ts +4 -0
- package/src/ValueObjects/Angle.test.ts +30 -0
- package/src/ValueObjects/Angle.ts +47 -0
- package/src/ValueObjects/Color.test.ts +181 -0
- package/src/ValueObjects/Color.ts +891 -0
- package/src/ValueObjects/LineSegment2D.test.ts +144 -0
- package/src/ValueObjects/LineSegment2D.ts +93 -0
- package/src/ValueObjects/Matrix.test.ts +498 -0
- package/src/ValueObjects/Matrix.ts +567 -0
- package/src/ValueObjects/ParametricLine.test.ts +155 -0
- package/src/ValueObjects/ParametricLine.ts +114 -0
- package/src/ValueObjects/ParametricPlane.test.ts +122 -0
- package/src/ValueObjects/ParametricPlane.ts +82 -0
- package/src/ValueObjects/Quaternion.test.ts +356 -0
- package/src/ValueObjects/Quaternion.ts +353 -0
- package/src/ValueObjects/Rectangle.test.ts +32 -0
- package/src/ValueObjects/Rectangle.ts +33 -0
- package/src/ValueObjects/Vector2.test.ts +167 -0
- package/src/ValueObjects/Vector2.ts +209 -0
- package/src/ValueObjects/Vector3.test.ts +228 -0
- package/src/ValueObjects/Vector3.ts +269 -0
- package/src/ValueObjects/index.ts +14 -0
- package/src/index.ts +4 -0
- package/tsconfig.json +18 -0
- package/tslint.json +11 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { Vector3 } from "../ValueObjects/Vector3";
|
|
2
|
+
|
|
3
|
+
export interface LineParameters {
|
|
4
|
+
x0: number;
|
|
5
|
+
y0: number;
|
|
6
|
+
z0: number;
|
|
7
|
+
a: number;
|
|
8
|
+
b: number;
|
|
9
|
+
c: number;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export class ParametricLine {
|
|
13
|
+
// See https://planetcalc.com/8253/
|
|
14
|
+
|
|
15
|
+
public static FromTwoPoint(p1: Vector3, p2: Vector3): ParametricLine {
|
|
16
|
+
const dir = Vector3.Subtract(p2, p1).unit;
|
|
17
|
+
return this.FromPointDirection(p1, dir);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public static FromPointDirection(
|
|
21
|
+
point: Vector3,
|
|
22
|
+
direction: Vector3
|
|
23
|
+
): ParametricLine {
|
|
24
|
+
return new ParametricLine({
|
|
25
|
+
x0: point.x,
|
|
26
|
+
y0: point.y,
|
|
27
|
+
z0: point.z,
|
|
28
|
+
a: direction.x,
|
|
29
|
+
b: direction.y,
|
|
30
|
+
c: direction.z,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public static Forward(): ParametricLine {
|
|
35
|
+
const p = Vector3.Zero();
|
|
36
|
+
const d = new Vector3(0, 0, 1);
|
|
37
|
+
return this.FromPointDirection(p, d);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public static Backward(): ParametricLine {
|
|
41
|
+
const p = Vector3.Zero();
|
|
42
|
+
const d = new Vector3(0, 0, -1);
|
|
43
|
+
return this.FromPointDirection(p, d);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
public static Up(): ParametricLine {
|
|
47
|
+
const p = Vector3.Zero();
|
|
48
|
+
const d = new Vector3(0, 1, 0);
|
|
49
|
+
return this.FromPointDirection(p, d);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
public static Down(): ParametricLine {
|
|
53
|
+
const p = Vector3.Zero();
|
|
54
|
+
const d = new Vector3(0, -1, 0);
|
|
55
|
+
return this.FromPointDirection(p, d);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
public static Left(): ParametricLine {
|
|
59
|
+
const p = Vector3.Zero();
|
|
60
|
+
const d = new Vector3(-1, 0, 0);
|
|
61
|
+
return this.FromPointDirection(p, d);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
public static Right(): ParametricLine {
|
|
65
|
+
const p = Vector3.Zero();
|
|
66
|
+
const d = new Vector3(1, 0, 0);
|
|
67
|
+
return this.FromPointDirection(p, d);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
public static GetPointAtDistance(
|
|
71
|
+
line: ParametricLine,
|
|
72
|
+
distance: number
|
|
73
|
+
): Vector3 {
|
|
74
|
+
const x = line.x0 + line.a * distance;
|
|
75
|
+
const y = line.y0 + line.b * distance;
|
|
76
|
+
const z = line.z0 + line.c * distance;
|
|
77
|
+
|
|
78
|
+
return new Vector3(x, y, z);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
public static GetDistanceToPoint(
|
|
82
|
+
line: ParametricLine,
|
|
83
|
+
point: Vector3
|
|
84
|
+
): number {
|
|
85
|
+
return Vector3.Subtract(line.origin, point).magnitude;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
readonly x0: number;
|
|
89
|
+
readonly y0: number;
|
|
90
|
+
readonly z0: number;
|
|
91
|
+
readonly a: number;
|
|
92
|
+
readonly b: number;
|
|
93
|
+
readonly c: number;
|
|
94
|
+
|
|
95
|
+
get origin(): Vector3 {
|
|
96
|
+
return new Vector3(this.x0, this.y0, this.z0);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
get direction(): Vector3 {
|
|
100
|
+
return new Vector3(this.a, this.b, this.c);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
constructor(parameters: LineParameters) {
|
|
104
|
+
this.x0 = parameters.x0;
|
|
105
|
+
this.y0 = parameters.y0;
|
|
106
|
+
this.z0 = parameters.z0;
|
|
107
|
+
|
|
108
|
+
const dir = new Vector3(parameters.a, parameters.b, parameters.c).unit;
|
|
109
|
+
|
|
110
|
+
this.a = dir.x;
|
|
111
|
+
this.b = dir.y;
|
|
112
|
+
this.c = dir.z;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { ParametricLine } from "./ParametricLine";
|
|
2
|
+
import { ParametricPlane } from "./ParametricPlane";
|
|
3
|
+
import { Vector3 } from "../ValueObjects";
|
|
4
|
+
|
|
5
|
+
test("Setting from point and normal", () => {
|
|
6
|
+
const point = new Vector3(1, 2, 3);
|
|
7
|
+
const normal = new Vector3(4, 5, 6);
|
|
8
|
+
const plane = ParametricPlane.FromPointNormal(point, normal);
|
|
9
|
+
|
|
10
|
+
const parameters = plane.GetParameters();
|
|
11
|
+
|
|
12
|
+
const dot = Vector3.Dot(point, normal);
|
|
13
|
+
expect(parameters.a).toEqual(normal.x);
|
|
14
|
+
expect(parameters.b).toEqual(normal.y);
|
|
15
|
+
expect(parameters.c).toEqual(normal.z);
|
|
16
|
+
expect(parameters.d).toEqual(-dot);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
test("From three points", () => {
|
|
20
|
+
// From https://keisan.casio.com/exec/system/1223596129
|
|
21
|
+
const A = new Vector3(1, 2, -2);
|
|
22
|
+
const B = new Vector3(3, -2, 1);
|
|
23
|
+
const C = new Vector3(5, 1, -4);
|
|
24
|
+
|
|
25
|
+
const plane = ParametricPlane.FromThreePoints(A, B, C);
|
|
26
|
+
const parameters = plane.GetParameters();
|
|
27
|
+
|
|
28
|
+
expect(parameters.a).toEqual(11);
|
|
29
|
+
expect(parameters.b).toEqual(16);
|
|
30
|
+
expect(parameters.c).toEqual(14);
|
|
31
|
+
expect(parameters.d).toEqual(-15);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test("Intersection", () => {
|
|
35
|
+
const point = new Vector3(1, 1, 1);
|
|
36
|
+
const dir = new Vector3(1, 0, 0);
|
|
37
|
+
const line = ParametricLine.FromPointDirection(point, dir);
|
|
38
|
+
|
|
39
|
+
const plane1 = new Vector3(-1, 0, 0);
|
|
40
|
+
const plane2 = new Vector3(-1, 1, 0);
|
|
41
|
+
const plane3 = new Vector3(-1, 0, 1);
|
|
42
|
+
const plane = ParametricPlane.FromThreePoints(plane1, plane2, plane3);
|
|
43
|
+
|
|
44
|
+
const intersect = plane.intersectLine(line);
|
|
45
|
+
|
|
46
|
+
expect(intersect?.x).toBeCloseTo(-1);
|
|
47
|
+
expect(intersect?.y).toBeCloseTo(1);
|
|
48
|
+
expect(intersect?.z).toBeCloseTo(1);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test("Intersection", () => {
|
|
52
|
+
// From http://www.ambrsoft.com/TrigoCalc/Plan3D/PlaneLineIntersection_.htm
|
|
53
|
+
|
|
54
|
+
const line1 = new Vector3(4, 1, 1);
|
|
55
|
+
const line2 = new Vector3(8, -2, -2);
|
|
56
|
+
const line = ParametricLine.FromTwoPoint(line1, line2);
|
|
57
|
+
|
|
58
|
+
const plane1 = new Vector3(-1, 2, 4);
|
|
59
|
+
const plane2 = new Vector3(2, 1, 3);
|
|
60
|
+
const plane3 = new Vector3(1, 3, 2);
|
|
61
|
+
const plane = ParametricPlane.FromThreePoints(plane1, plane2, plane3);
|
|
62
|
+
|
|
63
|
+
const intersect = plane.intersectLine(line);
|
|
64
|
+
|
|
65
|
+
expect(intersect?.x).toBeCloseTo(2.93);
|
|
66
|
+
expect(intersect?.y).toBeCloseTo(1.8);
|
|
67
|
+
expect(intersect?.z).toBeCloseTo(1.8);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test("If parallel, intersect should come back undefined", () => {
|
|
71
|
+
const line1 = new Vector3(0, 1, 0);
|
|
72
|
+
const line2 = new Vector3(0, -1, 0);
|
|
73
|
+
const line = ParametricLine.FromTwoPoint(line1, line2); // Vertical line going through the origin
|
|
74
|
+
|
|
75
|
+
const plane1 = new Vector3(0, 0, 0);
|
|
76
|
+
const plane2 = new Vector3(0, 1, 0);
|
|
77
|
+
const plane3 = new Vector3(0, 0, 1);
|
|
78
|
+
const plane = ParametricPlane.FromThreePoints(plane1, plane2, plane3); // y-z plane
|
|
79
|
+
|
|
80
|
+
const intersect = plane.intersectLine(line);
|
|
81
|
+
|
|
82
|
+
expect(intersect).toBeUndefined();
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test("XY Plane", () => {
|
|
86
|
+
const plane = ParametricPlane.XY();
|
|
87
|
+
expect(plane.GetParameters()).toEqual({
|
|
88
|
+
a: 0,
|
|
89
|
+
b: 0,
|
|
90
|
+
c: 1,
|
|
91
|
+
d: 0,
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
test("ZX Plane", () => {
|
|
96
|
+
const plane = ParametricPlane.ZX();
|
|
97
|
+
expect(plane.GetParameters()).toEqual({
|
|
98
|
+
a: 0,
|
|
99
|
+
b: 1,
|
|
100
|
+
c: 0,
|
|
101
|
+
d: 0,
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
test("YZ Plane", () => {
|
|
106
|
+
const plane = ParametricPlane.YZ();
|
|
107
|
+
expect(plane.GetParameters()).toEqual({
|
|
108
|
+
a: 1,
|
|
109
|
+
b: 0,
|
|
110
|
+
c: 0,
|
|
111
|
+
d: 0,
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
test("Check for equality", () => {
|
|
116
|
+
const point = new Vector3(1, 2, 3);
|
|
117
|
+
const normal = new Vector3(4, 5, 6);
|
|
118
|
+
const plane1 = ParametricPlane.FromPointNormal(point, normal);
|
|
119
|
+
const plane2 = ParametricPlane.FromPointNormal(point, normal);
|
|
120
|
+
|
|
121
|
+
expect(plane1).toEqual(plane2);
|
|
122
|
+
});
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { ParametricLine } from "./ParametricLine";
|
|
2
|
+
import { Vector3 } from "../ValueObjects/Vector3";
|
|
3
|
+
|
|
4
|
+
// Plane equation: a*x + b*y + c*x + d = 0;
|
|
5
|
+
|
|
6
|
+
export interface PlaneParameters {
|
|
7
|
+
a: number;
|
|
8
|
+
b: number;
|
|
9
|
+
c: number;
|
|
10
|
+
d: number;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export class ParametricPlane {
|
|
14
|
+
static FromPointNormal(point: Vector3, normal: Vector3): ParametricPlane {
|
|
15
|
+
return new ParametricPlane(point, normal);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
static FromThreePoints(A: Vector3, B: Vector3, C: Vector3): ParametricPlane {
|
|
19
|
+
const point = A;
|
|
20
|
+
const AB = Vector3.Subtract(B, A);
|
|
21
|
+
const AC = Vector3.Subtract(C, A);
|
|
22
|
+
const normal = Vector3.Cross(AB, AC);
|
|
23
|
+
|
|
24
|
+
return new ParametricPlane(point, normal);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
static XY(): ParametricPlane {
|
|
28
|
+
const p = Vector3.Zero();
|
|
29
|
+
const n = new Vector3(0, 0, 1);
|
|
30
|
+
return new ParametricPlane(p, n);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
static ZX(): ParametricPlane {
|
|
34
|
+
const p = Vector3.Zero();
|
|
35
|
+
const n = new Vector3(0, 1, 0);
|
|
36
|
+
return new ParametricPlane(p, n);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
static YZ(): ParametricPlane {
|
|
40
|
+
const p = Vector3.Zero();
|
|
41
|
+
const n = new Vector3(1, 0, 0);
|
|
42
|
+
return new ParametricPlane(p, n);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
GetParameters(): PlaneParameters {
|
|
46
|
+
const a = this.normal.x;
|
|
47
|
+
const b = this.normal.y;
|
|
48
|
+
const c = this.normal.z;
|
|
49
|
+
let d = Vector3.Dot(this.point, this.normal);
|
|
50
|
+
|
|
51
|
+
if (d !== 0) {
|
|
52
|
+
d *= -1;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return {
|
|
56
|
+
a,
|
|
57
|
+
b,
|
|
58
|
+
c,
|
|
59
|
+
d,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
public intersectLine(line: ParametricLine): Vector3 | undefined {
|
|
64
|
+
const { x0, y0, z0, a, b, c } = line;
|
|
65
|
+
const { a: A, b: B, c: C, d: D } = this.GetParameters();
|
|
66
|
+
|
|
67
|
+
const tNumerator = -(A * x0 + B * y0 + C * z0 + D);
|
|
68
|
+
const tDenominator = A * a + B * b + C * c;
|
|
69
|
+
|
|
70
|
+
if (tDenominator === 0) {
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const t = tNumerator / tDenominator;
|
|
75
|
+
|
|
76
|
+
const intersect = ParametricLine.GetPointAtDistance(line, t);
|
|
77
|
+
|
|
78
|
+
return intersect;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
constructor(private point: Vector3, private normal: Vector3) {}
|
|
82
|
+
}
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
import { Angle } from "./Angle";
|
|
2
|
+
import { Matrix } from "./Matrix";
|
|
3
|
+
import { Quaternion } from "./Quaternion";
|
|
4
|
+
import { Vector3 } from "./Vector3";
|
|
5
|
+
describe("Quaterion Value Object", () => {
|
|
6
|
+
it("Checks for equality", () => {
|
|
7
|
+
const quat1 = new Quaternion(1, 2, 3, 4);
|
|
8
|
+
const quat2 = new Quaternion(1, 2, 3, 4);
|
|
9
|
+
const quat3 = new Quaternion(10, 20, 30, 40);
|
|
10
|
+
|
|
11
|
+
expect(Quaternion.Equal(quat1, quat2)).toEqual(true);
|
|
12
|
+
expect(Quaternion.Equal(quat1, quat3)).toEqual(false);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it("Constructs a new quaternion from an array", () => {
|
|
16
|
+
const quat = Quaternion.FromArray([1, 2, 3, 4]);
|
|
17
|
+
expect(quat.x).toEqual(1);
|
|
18
|
+
expect(quat.y).toEqual(2);
|
|
19
|
+
expect(quat.z).toEqual(3);
|
|
20
|
+
expect(quat.w).toEqual(4);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("Constructs an identity quaternion", () => {
|
|
24
|
+
const quat = Quaternion.Identity();
|
|
25
|
+
expect(quat.x).toEqual(0);
|
|
26
|
+
expect(quat.y).toEqual(0);
|
|
27
|
+
expect(quat.z).toEqual(0);
|
|
28
|
+
expect(quat.w).toEqual(1);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("Equates two quaternions for testing", () => {
|
|
32
|
+
const quat1 = new Quaternion(1, 2, 3, 4);
|
|
33
|
+
const quat2 = new Quaternion(1, 2, 3, 4);
|
|
34
|
+
|
|
35
|
+
expect(quat1).toEqual(quat2);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it("Returns an array", () => {
|
|
39
|
+
const quat1 = new Quaternion(1, 2, 3, 4);
|
|
40
|
+
expect(quat1.toArray()).toEqual([1, 2, 3, 4]);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it("Multiplies two quaternions", () => {
|
|
44
|
+
// See https://www.omnicalculator.com/math/quaternion
|
|
45
|
+
const quat1 = new Quaternion(1, 2, 3, 4);
|
|
46
|
+
const quat2 = new Quaternion(5, 6, 7, 8);
|
|
47
|
+
const product = Quaternion.Multiply(quat1, quat2);
|
|
48
|
+
const expected = new Quaternion(24, 48, 48, -6);
|
|
49
|
+
expect(product).toEqual(expected);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("Inverts a quaternion", () => {
|
|
53
|
+
const quat1 = new Quaternion(1, 2, 3, 4);
|
|
54
|
+
const inverted = Quaternion.Inverse(quat1);
|
|
55
|
+
const expected = new Quaternion(-1, -2, -3, 4);
|
|
56
|
+
expect(inverted).toEqual(expected);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it("Creates an Quaterion from an Axis and Angle", () => {
|
|
60
|
+
// See https://www.andre-gaschler.com/rotationconverter
|
|
61
|
+
const axis = new Vector3(1, 2, 3);
|
|
62
|
+
const angle = Angle.FromRadians(4);
|
|
63
|
+
const quat = Quaternion.FromAngleAxis(axis, angle);
|
|
64
|
+
|
|
65
|
+
expect(quat.x).toBeCloseTo(0.24302);
|
|
66
|
+
expect(quat.y).toBeCloseTo(0.4860399);
|
|
67
|
+
expect(quat.z).toBeCloseTo(0.7290599);
|
|
68
|
+
expect(quat.w).toBeCloseTo(-0.4161468);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it("Creates an Quaterion from a Yaw Pitch Roll", () => {
|
|
72
|
+
// Numbers are from the babylon playground
|
|
73
|
+
|
|
74
|
+
const yaw = Angle.FromRadians(1);
|
|
75
|
+
const pitch = Angle.FromRadians(2);
|
|
76
|
+
const roll = Angle.FromRadians(3);
|
|
77
|
+
const quat = Quaternion.FromYawPitchRoll(yaw, pitch, roll);
|
|
78
|
+
|
|
79
|
+
expect(quat.x).toBeCloseTo(0.310622);
|
|
80
|
+
expect(quat.y).toBeCloseTo(-0.71828);
|
|
81
|
+
expect(quat.z).toBeCloseTo(0.444435);
|
|
82
|
+
expect(quat.w).toBeCloseTo(0.4359528);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it("Creates an Quaterion from Euler angles", () => {
|
|
86
|
+
// Numbers are from the babylon playground
|
|
87
|
+
|
|
88
|
+
const x = Angle.FromRadians(1);
|
|
89
|
+
const y = Angle.FromRadians(2);
|
|
90
|
+
const z = Angle.FromRadians(3);
|
|
91
|
+
const quat = Quaternion.FromEuler(x, y, z);
|
|
92
|
+
|
|
93
|
+
expect(quat.x).toBeCloseTo(0.754933);
|
|
94
|
+
expect(quat.y).toBeCloseTo(-0.206149);
|
|
95
|
+
expect(quat.z).toBeCloseTo(0.444435);
|
|
96
|
+
expect(quat.w).toBeCloseTo(0.4359528);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it("Slerps", () => {
|
|
100
|
+
// See https://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/index.htm
|
|
101
|
+
const q1 = new Quaternion(0.1, 0.2, 0.3, 0.9);
|
|
102
|
+
const q2 = new Quaternion(0.5, 0.8, 0.1, 0.4);
|
|
103
|
+
|
|
104
|
+
const initial = Quaternion.Slerp(q1, q2, 0);
|
|
105
|
+
expect(initial.x).toBeCloseTo(q1.x);
|
|
106
|
+
expect(initial.y).toBeCloseTo(q1.y);
|
|
107
|
+
expect(initial.z).toBeCloseTo(q1.z);
|
|
108
|
+
expect(initial.w).toBeCloseTo(q1.w);
|
|
109
|
+
|
|
110
|
+
const final = Quaternion.Slerp(q1, q2, 1);
|
|
111
|
+
expect(final.x).toBeCloseTo(q2.x);
|
|
112
|
+
expect(final.y).toBeCloseTo(q2.y);
|
|
113
|
+
expect(final.z).toBeCloseTo(q2.z);
|
|
114
|
+
expect(final.w).toBeCloseTo(q2.w);
|
|
115
|
+
|
|
116
|
+
const middle = Quaternion.Slerp(q1, q2, 0.35);
|
|
117
|
+
expect(middle.x).toBeCloseTo(0.27016);
|
|
118
|
+
expect(middle.y).toBeCloseTo(0.46061);
|
|
119
|
+
expect(middle.z).toBeCloseTo(0.25244);
|
|
120
|
+
expect(middle.w).toBeCloseTo(0.7972);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it("Makes a quaterion from a rotation matrix", () => {
|
|
124
|
+
const x = Angle.FromRadians(1);
|
|
125
|
+
const y = Angle.FromRadians(2);
|
|
126
|
+
const z = Angle.FromRadians(3);
|
|
127
|
+
const originalQ = Quaternion.FromEuler(x, y, z);
|
|
128
|
+
|
|
129
|
+
const matrix = Matrix.Compose(Vector3.One(), originalQ, Vector3.Zero());
|
|
130
|
+
|
|
131
|
+
const result = Quaternion.FromRotationMatrix(matrix);
|
|
132
|
+
expect(result.x).toBeCloseTo(originalQ.x);
|
|
133
|
+
expect(result.y).toBeCloseTo(originalQ.y);
|
|
134
|
+
expect(result.z).toBeCloseTo(originalQ.z);
|
|
135
|
+
expect(result.w).toBeCloseTo(originalQ.w);
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
it("Checks if two quaternions are close", () => {
|
|
139
|
+
const a = new Quaternion(1, 2, 3, 4);
|
|
140
|
+
const bigger = new Quaternion(1.01, 2.01, 3.01, 4.01);
|
|
141
|
+
const smaller = new Quaternion(0.99, 1.99, 2.99, 3.99);
|
|
142
|
+
|
|
143
|
+
expect(Quaternion.Close(a, bigger, 0.0101)).toEqual(true);
|
|
144
|
+
expect(Quaternion.Close(a, bigger, 0.0099)).toEqual(false);
|
|
145
|
+
|
|
146
|
+
expect(Quaternion.Close(a, smaller, 0.0101)).toEqual(true);
|
|
147
|
+
expect(Quaternion.Close(a, smaller, 0.0099)).toEqual(false);
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it("Retuns the angle", () => {
|
|
151
|
+
const angle = Angle.FromDegrees(25);
|
|
152
|
+
const axis = new Vector3(1, 2, 3);
|
|
153
|
+
const q = Quaternion.FromAngleAxis(axis, angle);
|
|
154
|
+
|
|
155
|
+
expect(Angle.Close(q.angle, angle)).toEqual(true);
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
it("Retuns the axis", () => {
|
|
159
|
+
const angle = Angle.FromDegrees(25);
|
|
160
|
+
const axis = new Vector3(1, 2, 3);
|
|
161
|
+
const q = Quaternion.FromAngleAxis(axis, angle);
|
|
162
|
+
|
|
163
|
+
expect(Vector3.Close(q.axis, axis.unit)).toEqual(true);
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
it("Makes a quaternion into a rotation matrix", () => {
|
|
167
|
+
const x = Angle.FromRadians(1);
|
|
168
|
+
const y = Angle.FromRadians(2);
|
|
169
|
+
const z = Angle.FromRadians(3);
|
|
170
|
+
const originalQ = Quaternion.FromEuler(x, y, z);
|
|
171
|
+
|
|
172
|
+
const mat = Quaternion.ToRotationMatrix(originalQ);
|
|
173
|
+
|
|
174
|
+
expect(Quaternion.Close(mat.rotation, originalQ)).toEqual(true);
|
|
175
|
+
expect(Vector3.Close(mat.scale, Vector3.One())).toEqual(true);
|
|
176
|
+
expect(Vector3.Close(mat.translation, Vector3.Zero())).toEqual(true);
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
it("Gets the Data Transfer Object", () => {
|
|
180
|
+
const quat = new Quaternion(1, 2, 3, 4);
|
|
181
|
+
|
|
182
|
+
expect(quat.dto).toEqual({
|
|
183
|
+
x: 1,
|
|
184
|
+
y: 2,
|
|
185
|
+
z: 3,
|
|
186
|
+
w: 4,
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
it("Makes a Quaterion from a DTO", () => {
|
|
191
|
+
const quat = Quaternion.FromDTO({
|
|
192
|
+
x: 1,
|
|
193
|
+
y: 2,
|
|
194
|
+
z: 3,
|
|
195
|
+
w: 4,
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
expect(quat.x).toEqual(1);
|
|
199
|
+
expect(quat.y).toEqual(2);
|
|
200
|
+
expect(quat.z).toEqual(3);
|
|
201
|
+
expect(quat.w).toEqual(4);
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
it("Forms a quaternion from a forward direction", () => {
|
|
205
|
+
const dir = new Vector3(0, 0, 1);
|
|
206
|
+
const q = Quaternion.FromDirectionVector(dir);
|
|
207
|
+
|
|
208
|
+
const expectedQ = Quaternion.Identity();
|
|
209
|
+
|
|
210
|
+
expect(q).toEqual(expectedQ);
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
it("Forms a quaternion from a right direction", () => {
|
|
214
|
+
const dir = new Vector3(1, 0, 0);
|
|
215
|
+
const q = Quaternion.FromDirectionVector(dir);
|
|
216
|
+
|
|
217
|
+
const expectedQ = Quaternion.FromYawPitchRoll(
|
|
218
|
+
Angle.FromDegrees(90),
|
|
219
|
+
Angle.FromRadians(0),
|
|
220
|
+
Angle.FromDegrees(0)
|
|
221
|
+
);
|
|
222
|
+
|
|
223
|
+
expect(Quaternion.Close(q, expectedQ)).toEqual(true);
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
it("Forms a quaternion from a left direction", () => {
|
|
227
|
+
const dir = new Vector3(-1, 0, 0);
|
|
228
|
+
const q = Quaternion.FromDirectionVector(dir);
|
|
229
|
+
|
|
230
|
+
const expectedQ = Quaternion.FromYawPitchRoll(
|
|
231
|
+
Angle.FromDegrees(-90),
|
|
232
|
+
Angle.FromRadians(0),
|
|
233
|
+
Angle.FromDegrees(0)
|
|
234
|
+
);
|
|
235
|
+
|
|
236
|
+
expect(Quaternion.Close(q, expectedQ)).toEqual(true);
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
it("Forms a quaternion from a behind direction", () => {
|
|
240
|
+
const dir = new Vector3(0, 0, -1);
|
|
241
|
+
const q = Quaternion.FromDirectionVector(dir);
|
|
242
|
+
|
|
243
|
+
const expectedQ = Quaternion.FromYawPitchRoll(
|
|
244
|
+
Angle.FromDegrees(180),
|
|
245
|
+
Angle.FromRadians(0),
|
|
246
|
+
Angle.FromDegrees(0)
|
|
247
|
+
);
|
|
248
|
+
|
|
249
|
+
expect(Quaternion.Close(q, expectedQ)).toEqual(true);
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
it("Forms a quaternion from a 45 degree up direction", () => {
|
|
253
|
+
const dir = new Vector3(0, 1, 1);
|
|
254
|
+
const q = Quaternion.FromDirectionVector(dir);
|
|
255
|
+
|
|
256
|
+
const expectedQ = Quaternion.FromYawPitchRoll(
|
|
257
|
+
Angle.FromDegrees(0),
|
|
258
|
+
Angle.FromDegrees(-45),
|
|
259
|
+
Angle.FromDegrees(0)
|
|
260
|
+
);
|
|
261
|
+
|
|
262
|
+
expect(Quaternion.Close(q, expectedQ)).toEqual(true);
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
it("Forms a quaternion from a 45 degree up direction", () => {
|
|
266
|
+
const dir = new Vector3(1, 1, 0);
|
|
267
|
+
const q = Quaternion.FromDirectionVector(dir);
|
|
268
|
+
|
|
269
|
+
const expectedQ = Quaternion.FromYawPitchRoll(
|
|
270
|
+
Angle.FromDegrees(90),
|
|
271
|
+
Angle.FromDegrees(-45),
|
|
272
|
+
Angle.FromDegrees(0)
|
|
273
|
+
);
|
|
274
|
+
|
|
275
|
+
expect(Quaternion.Close(q, expectedQ)).toEqual(true);
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
it("Returns an identity if the direction is zero", () => {
|
|
279
|
+
const dir = new Vector3(0, 0, 0);
|
|
280
|
+
const q = Quaternion.FromDirectionVector(dir);
|
|
281
|
+
|
|
282
|
+
const expectedQ = Quaternion.Identity();
|
|
283
|
+
|
|
284
|
+
expect(Quaternion.Close(q, expectedQ)).toEqual(true);
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
it("Works with an up vector", () => {
|
|
288
|
+
const dir = new Vector3(0, 1, 0);
|
|
289
|
+
const q = Quaternion.FromDirectionVector(dir);
|
|
290
|
+
|
|
291
|
+
const expectedQ = Quaternion.FromYawPitchRoll(
|
|
292
|
+
Angle.FromDegrees(0),
|
|
293
|
+
Angle.FromDegrees(-90),
|
|
294
|
+
Angle.FromDegrees(0)
|
|
295
|
+
);
|
|
296
|
+
|
|
297
|
+
expect(Quaternion.Close(q, expectedQ)).toEqual(true);
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
it("Works with an down vector", () => {
|
|
301
|
+
const dir = new Vector3(0, -1, 0);
|
|
302
|
+
const q = Quaternion.FromDirectionVector(dir);
|
|
303
|
+
|
|
304
|
+
const expectedQ = Quaternion.FromYawPitchRoll(
|
|
305
|
+
Angle.FromDegrees(0),
|
|
306
|
+
Angle.FromDegrees(90),
|
|
307
|
+
Angle.FromDegrees(0)
|
|
308
|
+
);
|
|
309
|
+
|
|
310
|
+
expect(Quaternion.Close(q, expectedQ)).toEqual(true);
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
it("Gets the angle between two quaternions", () => {
|
|
314
|
+
const q1 = Quaternion.FromYawPitchRoll(
|
|
315
|
+
Angle.FromDegrees(0),
|
|
316
|
+
Angle.FromDegrees(90),
|
|
317
|
+
Angle.FromDegrees(0)
|
|
318
|
+
);
|
|
319
|
+
|
|
320
|
+
const q2 = Quaternion.FromYawPitchRoll(
|
|
321
|
+
Angle.FromDegrees(0),
|
|
322
|
+
Angle.FromDegrees(80),
|
|
323
|
+
Angle.FromDegrees(0)
|
|
324
|
+
);
|
|
325
|
+
|
|
326
|
+
const ang = Quaternion.AngleBetween(q1, q2);
|
|
327
|
+
expect(ang.degrees).toBeCloseTo(10);
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
it("Keeps the angle between two quaternions less than 180", () => {
|
|
331
|
+
const q1 = Quaternion.FromYawPitchRoll(
|
|
332
|
+
Angle.FromDegrees(0),
|
|
333
|
+
Angle.FromDegrees(0),
|
|
334
|
+
Angle.FromDegrees(0)
|
|
335
|
+
);
|
|
336
|
+
|
|
337
|
+
const q2 = Quaternion.FromYawPitchRoll(
|
|
338
|
+
Angle.FromDegrees(0),
|
|
339
|
+
Angle.FromDegrees(200),
|
|
340
|
+
Angle.FromDegrees(0)
|
|
341
|
+
);
|
|
342
|
+
|
|
343
|
+
const ang = Quaternion.AngleBetween(q1, q2);
|
|
344
|
+
expect(ang.degrees).toBeCloseTo(160);
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
it("Returns 0 if the quaterions are the same", () => {
|
|
348
|
+
const q1 = Quaternion.FromYawPitchRoll(
|
|
349
|
+
Angle.FromDegrees(0),
|
|
350
|
+
Angle.FromDegrees(0),
|
|
351
|
+
Angle.FromDegrees(0)
|
|
352
|
+
);
|
|
353
|
+
const ang = Quaternion.AngleBetween(q1, q1);
|
|
354
|
+
expect(ang.degrees).toEqual(0);
|
|
355
|
+
});
|
|
356
|
+
});
|