@itwin/core-geometry 3.5.0-dev.35 → 3.5.0-dev.41
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/lib/cjs/Geometry.d.ts +13 -0
- package/lib/cjs/Geometry.d.ts.map +1 -1
- package/lib/cjs/Geometry.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurve.d.ts +1 -1
- package/lib/cjs/bspline/BSplineCurve.js +1 -1
- package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
- package/lib/cjs/bspline/KnotVector.d.ts.map +1 -1
- package/lib/cjs/bspline/KnotVector.js +3 -0
- package/lib/cjs/bspline/KnotVector.js.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts +7 -5
- package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js +37 -29
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/cjs/curve/CurveCollection.d.ts +4 -2
- package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
- package/lib/cjs/curve/CurveCollection.js +14 -2
- package/lib/cjs/curve/CurveCollection.js.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.d.ts +13 -17
- package/lib/cjs/curve/CurvePrimitive.d.ts.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.js +51 -340
- package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
- package/lib/cjs/curve/LineString3d.d.ts +11 -1
- package/lib/cjs/curve/LineString3d.d.ts.map +1 -1
- package/lib/cjs/curve/LineString3d.js +30 -23
- package/lib/cjs/curve/LineString3d.js.map +1 -1
- package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.d.ts +55 -0
- package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.d.ts.map +1 -0
- package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js +143 -0
- package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -0
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.d.ts +43 -0
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.d.ts.map +1 -0
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js +146 -0
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -0
- package/lib/cjs/curve/internalContexts/CurveLengthContext.d.ts +33 -0
- package/lib/cjs/curve/internalContexts/CurveLengthContext.d.ts.map +1 -0
- package/lib/cjs/curve/internalContexts/CurveLengthContext.js +91 -0
- package/lib/cjs/curve/internalContexts/CurveLengthContext.js.map +1 -0
- package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.d.ts +21 -0
- package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.d.ts.map +1 -0
- package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js +34 -0
- package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -0
- package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts +2 -2
- package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/DirectSpiral3d.js +15 -8
- package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/cjs/geometry3d/Angle.d.ts +20 -10
- package/lib/cjs/geometry3d/Angle.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Angle.js +30 -15
- package/lib/cjs/geometry3d/Angle.js.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.d.ts +25 -8
- package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.js +67 -15
- package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
- package/lib/cjs/geometry3d/Point2dVector2d.d.ts +23 -8
- package/lib/cjs/geometry3d/Point2dVector2d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Point2dVector2d.js +40 -13
- package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.d.ts +90 -55
- package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.js +254 -123
- package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/cjs/geometry3d/Range.d.ts +0 -1
- package/lib/cjs/geometry3d/Range.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Range.js +0 -1
- package/lib/cjs/geometry3d/Range.js.map +1 -1
- package/lib/cjs/geometry3d/Transform.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Transform.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/cjs/serialization/IModelJsonSchema.d.ts +1 -1
- package/lib/cjs/serialization/IModelJsonSchema.d.ts.map +1 -1
- package/lib/cjs/serialization/IModelJsonSchema.js +4 -3
- package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
- package/lib/cjs/solid/Sphere.d.ts +1 -1
- package/lib/cjs/solid/Sphere.js +3 -3
- package/lib/cjs/solid/Sphere.js.map +1 -1
- package/lib/cjs/solid/TorusPipe.d.ts +17 -13
- package/lib/cjs/solid/TorusPipe.d.ts.map +1 -1
- package/lib/cjs/solid/TorusPipe.js +67 -38
- package/lib/cjs/solid/TorusPipe.js.map +1 -1
- package/lib/cjs/topology/Graph.d.ts +1 -1
- package/lib/cjs/topology/Graph.js +1 -1
- package/lib/cjs/topology/Graph.js.map +1 -1
- package/lib/cjs/topology/Triangulation.d.ts +1 -1
- package/lib/cjs/topology/Triangulation.js +1 -1
- package/lib/cjs/topology/Triangulation.js.map +1 -1
- package/lib/esm/Geometry.d.ts +13 -0
- package/lib/esm/Geometry.d.ts.map +1 -1
- package/lib/esm/Geometry.js.map +1 -1
- package/lib/esm/bspline/BSplineCurve.d.ts +1 -1
- package/lib/esm/bspline/BSplineCurve.js +1 -1
- package/lib/esm/bspline/BSplineCurve.js.map +1 -1
- package/lib/esm/bspline/KnotVector.d.ts.map +1 -1
- package/lib/esm/bspline/KnotVector.js +3 -0
- package/lib/esm/bspline/KnotVector.js.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts +7 -5
- package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.js +37 -29
- package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/esm/curve/CurveCollection.d.ts +4 -2
- package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
- package/lib/esm/curve/CurveCollection.js +14 -2
- package/lib/esm/curve/CurveCollection.js.map +1 -1
- package/lib/esm/curve/CurvePrimitive.d.ts +13 -17
- package/lib/esm/curve/CurvePrimitive.d.ts.map +1 -1
- package/lib/esm/curve/CurvePrimitive.js +46 -335
- package/lib/esm/curve/CurvePrimitive.js.map +1 -1
- package/lib/esm/curve/LineString3d.d.ts +11 -1
- package/lib/esm/curve/LineString3d.d.ts.map +1 -1
- package/lib/esm/curve/LineString3d.js +30 -23
- package/lib/esm/curve/LineString3d.js.map +1 -1
- package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.d.ts +55 -0
- package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.d.ts.map +1 -0
- package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js +139 -0
- package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -0
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.d.ts +43 -0
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.d.ts.map +1 -0
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js +142 -0
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -0
- package/lib/esm/curve/internalContexts/CurveLengthContext.d.ts +33 -0
- package/lib/esm/curve/internalContexts/CurveLengthContext.d.ts.map +1 -0
- package/lib/esm/curve/internalContexts/CurveLengthContext.js +87 -0
- package/lib/esm/curve/internalContexts/CurveLengthContext.js.map +1 -0
- package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.d.ts +21 -0
- package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.d.ts.map +1 -0
- package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js +30 -0
- package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -0
- package/lib/esm/curve/spiral/DirectSpiral3d.d.ts +2 -2
- package/lib/esm/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
- package/lib/esm/curve/spiral/DirectSpiral3d.js +15 -8
- package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/esm/geometry3d/Angle.d.ts +20 -10
- package/lib/esm/geometry3d/Angle.d.ts.map +1 -1
- package/lib/esm/geometry3d/Angle.js +30 -15
- package/lib/esm/geometry3d/Angle.js.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.d.ts +25 -8
- package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.js +67 -15
- package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
- package/lib/esm/geometry3d/Point2dVector2d.d.ts +23 -8
- package/lib/esm/geometry3d/Point2dVector2d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Point2dVector2d.js +40 -13
- package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.d.ts +90 -55
- package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.js +254 -123
- package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/esm/geometry3d/Range.d.ts +0 -1
- package/lib/esm/geometry3d/Range.d.ts.map +1 -1
- package/lib/esm/geometry3d/Range.js +0 -1
- package/lib/esm/geometry3d/Range.js.map +1 -1
- package/lib/esm/geometry3d/Transform.d.ts.map +1 -1
- package/lib/esm/geometry3d/Transform.js.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/esm/serialization/IModelJsonSchema.d.ts +1 -1
- package/lib/esm/serialization/IModelJsonSchema.d.ts.map +1 -1
- package/lib/esm/serialization/IModelJsonSchema.js +4 -3
- package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
- package/lib/esm/solid/Sphere.d.ts +1 -1
- package/lib/esm/solid/Sphere.js +3 -3
- package/lib/esm/solid/Sphere.js.map +1 -1
- package/lib/esm/solid/TorusPipe.d.ts +17 -13
- package/lib/esm/solid/TorusPipe.d.ts.map +1 -1
- package/lib/esm/solid/TorusPipe.js +67 -38
- package/lib/esm/solid/TorusPipe.js.map +1 -1
- package/lib/esm/topology/Graph.d.ts +1 -1
- package/lib/esm/topology/Graph.js +1 -1
- package/lib/esm/topology/Graph.js.map +1 -1
- package/lib/esm/topology/Triangulation.d.ts +1 -1
- package/lib/esm/topology/Triangulation.js +1 -1
- package/lib/esm/topology/Triangulation.js.map +1 -1
- package/package.json +4 -4
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/** @packageDocumentation
|
|
2
2
|
* @module CartesianGeometry
|
|
3
3
|
*/
|
|
4
|
-
import { BeJSONFunctions } from "../Geometry";
|
|
4
|
+
import { BeJSONFunctions, PerpParallelOptions } from "../Geometry";
|
|
5
5
|
import { Angle } from "./Angle";
|
|
6
6
|
import { XAndY, XYProps } from "./XYZProps";
|
|
7
7
|
/** Minimal object containing x,y and operations that are meaningful without change in both point and vector.
|
|
@@ -192,18 +192,33 @@ export declare class Vector2d extends XY implements BeJSONFunctions {
|
|
|
192
192
|
dotProductStartEnd(pointA: XAndY, pointB: XAndY): number;
|
|
193
193
|
/** vector cross product {this CROSS vectorB} */
|
|
194
194
|
crossProduct(vectorB: XAndY): number;
|
|
195
|
-
/**
|
|
195
|
+
/**
|
|
196
|
+
* return the (radians as a simple number, not strongly typed Angle) signed angle from this to vectorB.
|
|
197
|
+
* This is positive if the shortest turn is counterclockwise, negative if clockwise.
|
|
198
|
+
*/
|
|
199
|
+
radiansTo(vectorB: XAndY): number;
|
|
200
|
+
/**
|
|
201
|
+
* return the (strongly typed) signed angle from this to vectorB.
|
|
202
|
+
* This is positive if the shortest turn is counterclockwise, negative if clockwise.
|
|
203
|
+
*/
|
|
196
204
|
angleTo(vectorB: XAndY): Angle;
|
|
197
205
|
/**
|
|
198
|
-
* Test if
|
|
206
|
+
* Test if this vector is parallel to other.
|
|
207
|
+
* * The input tolerances in `options`, if given, are considered to be squared for efficiency's sake,
|
|
208
|
+
* so if you have a distance or angle tolerance t, you should pass in t * t.
|
|
199
209
|
* @param other second vector for comparison.
|
|
200
|
-
* @param oppositeIsParallel
|
|
210
|
+
* @param oppositeIsParallel whether to consider diametrically opposed vectors as parallel.
|
|
211
|
+
* @param options optional radian and distance tolerances.
|
|
201
212
|
*/
|
|
202
|
-
isParallelTo(other: Vector2d, oppositeIsParallel?: boolean): boolean;
|
|
213
|
+
isParallelTo(other: Vector2d, oppositeIsParallel?: boolean, returnValueIfAnInputIsZeroLength?: boolean, options?: PerpParallelOptions): boolean;
|
|
203
214
|
/**
|
|
204
|
-
*
|
|
205
|
-
*
|
|
215
|
+
* Test if this vector is perpendicular to other.
|
|
216
|
+
* * The input tolerances in `options`, if given, are considered to be squared for efficiency's sake,
|
|
217
|
+
* so if you have a distance or angle tolerance t, you should pass in t * t.
|
|
218
|
+
* @param other second vector in comparison.
|
|
219
|
+
* @param returnValueIfAnInputIsZeroLength if either vector is near zero length, return this value.
|
|
220
|
+
* @param options optional radian and distance tolerances.
|
|
206
221
|
*/
|
|
207
|
-
isPerpendicularTo(other: Vector2d): boolean;
|
|
222
|
+
isPerpendicularTo(other: Vector2d, returnValueIfAnInputIsZeroLength?: boolean, options?: PerpParallelOptions): boolean;
|
|
208
223
|
}
|
|
209
224
|
//# sourceMappingURL=Point2dVector2d.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Point2dVector2d.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/Point2dVector2d.ts"],"names":[],"mappings":"AAKA;;GAEG;AAIH,OAAO,EAAE,eAAe,EAAY,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"Point2dVector2d.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/Point2dVector2d.ts"],"names":[],"mappings":"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"}
|
|
@@ -419,9 +419,19 @@ export class Vector2d extends XY {
|
|
|
419
419
|
}
|
|
420
420
|
/** vector cross product {this CROSS vectorB} */
|
|
421
421
|
crossProduct(vectorB) { return this.x * vectorB.y - this.y * vectorB.x; }
|
|
422
|
-
/**
|
|
422
|
+
/**
|
|
423
|
+
* return the (radians as a simple number, not strongly typed Angle) signed angle from this to vectorB.
|
|
424
|
+
* This is positive if the shortest turn is counterclockwise, negative if clockwise.
|
|
425
|
+
*/
|
|
426
|
+
radiansTo(vectorB) {
|
|
427
|
+
return Math.atan2(this.crossProduct(vectorB), this.dotProduct(vectorB));
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* return the (strongly typed) signed angle from this to vectorB.
|
|
431
|
+
* This is positive if the shortest turn is counterclockwise, negative if clockwise.
|
|
432
|
+
*/
|
|
423
433
|
angleTo(vectorB) {
|
|
424
|
-
return Angle.
|
|
434
|
+
return Angle.createRadians(this.radiansTo(vectorB));
|
|
425
435
|
}
|
|
426
436
|
/* smallerUnorientedAngleTo(vectorB: Vector2d): Angle { }
|
|
427
437
|
signedAngleTo(vectorB: Vector2d, upVector: Vector2d): Angle { }
|
|
@@ -431,16 +441,21 @@ export class Vector2d extends XY {
|
|
|
431
441
|
isInCCWSector(vectorA: Vector2d, vectorB: Vector2d, upVector: Vector2d): boolean { }
|
|
432
442
|
*/
|
|
433
443
|
/**
|
|
434
|
-
* Test if
|
|
444
|
+
* Test if this vector is parallel to other.
|
|
445
|
+
* * The input tolerances in `options`, if given, are considered to be squared for efficiency's sake,
|
|
446
|
+
* so if you have a distance or angle tolerance t, you should pass in t * t.
|
|
435
447
|
* @param other second vector for comparison.
|
|
436
|
-
* @param oppositeIsParallel
|
|
448
|
+
* @param oppositeIsParallel whether to consider diametrically opposed vectors as parallel.
|
|
449
|
+
* @param options optional radian and distance tolerances.
|
|
437
450
|
*/
|
|
438
|
-
isParallelTo(other, oppositeIsParallel = false) {
|
|
451
|
+
isParallelTo(other, oppositeIsParallel = false, returnValueIfAnInputIsZeroLength = false, options) {
|
|
452
|
+
var _a, _b;
|
|
453
|
+
const radianSquaredTol = (_a = options === null || options === void 0 ? void 0 : options.radianSquaredTol) !== null && _a !== void 0 ? _a : Geometry.smallAngleRadiansSquared;
|
|
454
|
+
const distanceSquaredTol = (_b = options === null || options === void 0 ? void 0 : options.distanceSquaredTol) !== null && _b !== void 0 ? _b : Geometry.smallMetricDistanceSquared;
|
|
439
455
|
const a2 = this.magnitudeSquared();
|
|
440
456
|
const b2 = other.magnitudeSquared();
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
return false;
|
|
457
|
+
if (a2 < distanceSquaredTol || b2 < distanceSquaredTol)
|
|
458
|
+
return returnValueIfAnInputIsZeroLength;
|
|
444
459
|
const dot = this.dotProduct(other);
|
|
445
460
|
if (dot < 0.0 && !oppositeIsParallel)
|
|
446
461
|
return false;
|
|
@@ -448,14 +463,26 @@ export class Vector2d extends XY {
|
|
|
448
463
|
/* a2,b2,cross2 are squared lengths of respective vectors */
|
|
449
464
|
/* cross2 = sin^2(theta) * a2 * b2 */
|
|
450
465
|
/* For small theta, sin^2(theta)~~theta^2 */
|
|
451
|
-
return cross * cross <=
|
|
466
|
+
return cross * cross <= radianSquaredTol * a2 * b2;
|
|
452
467
|
}
|
|
453
468
|
/**
|
|
454
|
-
*
|
|
455
|
-
*
|
|
469
|
+
* Test if this vector is perpendicular to other.
|
|
470
|
+
* * The input tolerances in `options`, if given, are considered to be squared for efficiency's sake,
|
|
471
|
+
* so if you have a distance or angle tolerance t, you should pass in t * t.
|
|
472
|
+
* @param other second vector in comparison.
|
|
473
|
+
* @param returnValueIfAnInputIsZeroLength if either vector is near zero length, return this value.
|
|
474
|
+
* @param options optional radian and distance tolerances.
|
|
456
475
|
*/
|
|
457
|
-
isPerpendicularTo(other) {
|
|
458
|
-
|
|
476
|
+
isPerpendicularTo(other, returnValueIfAnInputIsZeroLength = false, options) {
|
|
477
|
+
var _a, _b;
|
|
478
|
+
const radianSquaredTol = (_a = options === null || options === void 0 ? void 0 : options.radianSquaredTol) !== null && _a !== void 0 ? _a : Geometry.smallAngleRadiansSquared;
|
|
479
|
+
const distanceSquaredTol = (_b = options === null || options === void 0 ? void 0 : options.distanceSquaredTol) !== null && _b !== void 0 ? _b : Geometry.smallMetricDistanceSquared;
|
|
480
|
+
const aa = this.magnitudeSquared();
|
|
481
|
+
const bb = other.magnitudeSquared();
|
|
482
|
+
if (aa < distanceSquaredTol || bb < distanceSquaredTol)
|
|
483
|
+
return returnValueIfAnInputIsZeroLength;
|
|
484
|
+
const ab = this.dotProduct(other);
|
|
485
|
+
return ab * ab <= radianSquaredTol * aa * bb;
|
|
459
486
|
}
|
|
460
487
|
}
|
|
461
488
|
//# sourceMappingURL=Point2dVector2d.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Point2dVector2d.js","sourceRoot":"","sources":["../../../src/geometry3d/Point2dVector2d.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module CartesianGeometry\r\n */\r\n// cspell:word JSONXY\r\n// cspell:word CWXY\r\n\r\nimport { BeJSONFunctions, Geometry } from \"../Geometry\";\r\nimport { Angle } from \"./Angle\";\r\nimport { XAndY, XYProps } from \"./XYZProps\";\r\n\r\n/** Minimal object containing x,y and operations that are meaningful without change in both point and vector.\r\n * * `XY` is not instantiable.\r\n * * The derived (instantiable) classes are\r\n * * `Point2d`\r\n * * `Vector2d`\r\n * @public\r\n */\r\nexport class XY implements XAndY {\r\n /** x component */\r\n public x: number;\r\n /** y component */\r\n public y: number;\r\n /** Set both x and y. */\r\n public set(x: number = 0, y: number = 0) { this.x = x; this.y = y; }\r\n /** Set both x and y to zero */\r\n public setZero() { this.x = 0; this.y = 0; }\r\n protected constructor(x: number = 0, y: number = 0) { this.x = x; this.y = y; }\r\n /** Set both x and y from other. */\r\n public setFrom(other?: XAndY) {\r\n if (other) {\r\n this.x = other.x; this.y = other.y;\r\n } else {\r\n this.x = 0; this.y = 0;\r\n }\r\n }\r\n /** Freeze this instance so it is read-only */\r\n public freeze(): Readonly<this> { return Object.freeze(this); }\r\n\r\n /** Returns true if this and other have equal x,y parts within Geometry.smallMetricDistance. */\r\n public isAlmostEqual(other: XAndY, tol?: number): boolean { return Geometry.isSameCoordinate(this.x, other.x, tol) && Geometry.isSameCoordinate(this.y, other.y, tol); }\r\n\r\n /** Returns true if this and other have equal x,y parts within Geometry.smallMetricDistance. */\r\n public isAlmostEqualXY(x: number, y: number, tol?: number): boolean { return Geometry.isSameCoordinate(this.x, x, tol) && Geometry.isSameCoordinate(this.y, y, tol); }\r\n\r\n /** return a json array `[x,y]` */\r\n public toJSON(): XYProps { return [this.x, this.y]; }\r\n /** return a json object `{x: 1, y:2}` */\r\n public toJSONXY(): XYProps { return { x: this.x, y: this.y }; }\r\n /** Set x and y from a JSON source such as `[1,2]` or `{x:1, y:2}` */\r\n public setFromJSON(json?: XYProps): void {\r\n if (Array.isArray(json)) {\r\n this.set(json[0] || 0, json[1] || 0);\r\n return;\r\n }\r\n if (json) {\r\n this.set(json.x || 0, json.y || 0);\r\n return;\r\n }\r\n this.set(0, 0);\r\n }\r\n\r\n /** Return the distance from this point to other */\r\n public distance(other: XAndY): number {\r\n const xDist = other.x - this.x;\r\n const yDist = other.y - this.y;\r\n return (Math.sqrt(xDist * xDist + yDist * yDist));\r\n }\r\n\r\n /** Return squared distance from this point to other */\r\n public distanceSquared(other: XAndY): number {\r\n const xDist = other.x - this.x;\r\n const yDist = other.y - this.y;\r\n return (xDist * xDist + yDist * yDist);\r\n }\r\n\r\n /** Return the largest absolute distance between corresponding components */\r\n public maxDiff(other: XAndY): number {\r\n return Math.max(Math.abs(this.x - other.x), Math.abs(this.y - other.y));\r\n }\r\n /** returns true if the x,y components are both small by metric metric tolerance */\r\n public get isAlmostZero(): boolean {\r\n return Geometry.isSmallMetricDistance(this.x) && Geometry.isSmallMetricDistance(this.y);\r\n }\r\n\r\n /** Return the largest absolute value of any component */\r\n public maxAbs(): number { return Math.max(Math.abs(this.x), Math.abs(this.y)); }\r\n /** Return the magnitude of the vector */\r\n public magnitude(): number { return Math.sqrt(this.x * this.x + this.y * this.y); }\r\n /** Return the squared magnitude of the vector. */\r\n public magnitudeSquared(): number { return this.x * this.x + this.y * this.y; }\r\n\r\n /** returns true if the x,y components are exactly equal. */\r\n public isExactEqual(other: XAndY): boolean { return this.x === other.x && this.y === other.y; }\r\n /** returns true if x,y match `other` within metric tolerance */\r\n public isAlmostEqualMetric(other: XAndY): boolean { return this.maxDiff(other) <= Geometry.smallMetricDistance; }\r\n\r\n /** Return a (full length) vector from this point to other */\r\n public vectorTo(other: XAndY, result?: Vector2d): Vector2d {\r\n return Vector2d.create(\r\n other.x - this.x,\r\n other.y - this.y,\r\n result);\r\n }\r\n /** Return a unit vector from this point to other */\r\n public unitVectorTo(target: XAndY, result?: Vector2d): Vector2d | undefined {\r\n return this.vectorTo(target, result).normalize(result);\r\n }\r\n /** cross product of vectors from origin to targets */\r\n public static crossProductToPoints(origin: XAndY, targetA: XAndY, targetB: XAndY): number {\r\n return Geometry.crossProductXYXY(\r\n targetA.x - origin.x, targetA.y - origin.y, targetB.x - origin.x, targetB.y - origin.y);\r\n }\r\n}\r\n/** 2D point with `x`,`y` as properties\r\n * @public\r\n */\r\nexport class Point2d extends XY implements BeJSONFunctions {\r\n /** Constructor for Point2d */\r\n constructor(x: number = 0, y: number = 0) { super(x, y); }\r\n /** return a new Point2d with x,y coordinates from this. */\r\n public clone(result?: Point2d): Point2d { return Point2d.create(this.x, this.y, result); }\r\n\r\n /**\r\n * Return a point (newly created unless result provided) with given x,y coordinates\r\n * @param x x coordinate\r\n * @param y y coordinate\r\n * @param result optional result\r\n */\r\n public static create(x: number = 0, y: number = 0, result?: Point2d): Point2d {\r\n if (result) {\r\n result.x = x;\r\n result.y = y;\r\n return result;\r\n }\r\n return new Point2d(x, y);\r\n }\r\n /** Convert JSON `[1,2]` or `{x:1, y:2}` to a Point2d instance */\r\n public static fromJSON(json?: XYProps): Point2d { const val = new Point2d(); val.setFromJSON(json); return val; }\r\n /** Create (or optionally reuse) a Point2d from another object with fields x and y */\r\n public static createFrom(xy: XAndY | undefined, result?: Point2d): Point2d {\r\n if (xy)\r\n return Point2d.create(xy.x, xy.y, result);\r\n return Point2d.create(0, 0, result);\r\n }\r\n /** Create a Point2d with both coordinates zero. */\r\n public static createZero(result?: Point2d): Point2d { return Point2d.create(0, 0, result); }\r\n /** Starting at this point, move along vector by tangentFraction of the vector length, and to the left by leftFraction of\r\n * the perpendicular vector length.\r\n * @param tangentFraction distance to move along the vector, as a fraction of vector\r\n * @param leftFraction distance to move perpendicular to the vector, as a fraction of the rotated vector\r\n */\r\n public addForwardLeft(tangentFraction: number, leftFraction: number, vector: Vector2d): Point2d {\r\n const dx = vector.x;\r\n const dy = vector.y;\r\n return Point2d.create(this.x + tangentFraction * dx - leftFraction * dy,\r\n this.y + tangentFraction * dy + leftFraction * dx);\r\n }\r\n /** Interpolate at tangentFraction between this instance and point. Move by leftFraction along the xy perpendicular\r\n * of the vector between the points.\r\n */\r\n public forwardLeftInterpolate(tangentFraction: number, leftFraction: number, point: XAndY): Point2d {\r\n const dx = point.x - this.x;\r\n const dy = point.y - this.y;\r\n return Point2d.create(\r\n this.x + tangentFraction * dx - leftFraction * dy,\r\n this.y + tangentFraction * dy + leftFraction * dx);\r\n }\r\n\r\n /** Return a point interpolated between this point and the right param. */\r\n public interpolate(fraction: number, other: XAndY, result?: Point2d): Point2d {\r\n if (fraction <= 0.5)\r\n return Point2d.create(\r\n this.x + fraction * (other.x - this.x),\r\n this.y + fraction * (other.y - this.y),\r\n result);\r\n const t: number = fraction - 1.0;\r\n return Point2d.create(\r\n other.x + t * (other.x - this.x),\r\n other.y + t * (other.y - this.y),\r\n result);\r\n }\r\n\r\n /** Return a point with independent x,y fractional interpolation. */\r\n public interpolateXY(fractionX: number, fractionY: number, other: XAndY, result?: Point2d): Point2d {\r\n return Point2d.create(\r\n Geometry.interpolate(this.x, fractionX, other.x),\r\n Geometry.interpolate(this.y, fractionY, other.y),\r\n result);\r\n }\r\n\r\n /** Return this point minus vector */\r\n public minus(vector: XAndY, result?: Point2d): Point2d {\r\n return Point2d.create(\r\n this.x - vector.x,\r\n this.y - vector.y,\r\n result);\r\n }\r\n\r\n /** Return point plus vector */\r\n public plus(vector: XAndY, result?: Point2d): Point2d {\r\n return Point2d.create(\r\n this.x + vector.x,\r\n this.y + vector.y,\r\n result);\r\n }\r\n /** Return point plus vector */\r\n public plusXY(dx: number = 0, dy: number = 0, result?: Point2d): Point2d {\r\n return Point2d.create(\r\n this.x + dx,\r\n this.y + dy, result);\r\n }\r\n\r\n /** Return point + vector * scalar */\r\n public plusScaled(vector: XAndY, scaleFactor: number, result?: Point2d): Point2d {\r\n return Point2d.create(\r\n this.x + vector.x * scaleFactor,\r\n this.y + vector.y * scaleFactor,\r\n result);\r\n }\r\n\r\n /** Return point + vectorA * scalarA + vectorB * scalarB */\r\n public plus2Scaled(vectorA: XAndY, scalarA: number, vectorB: XAndY, scalarB: number, result?: Point2d): Point2d {\r\n return Point2d.create(\r\n this.x + vectorA.x * scalarA + vectorB.x * scalarB,\r\n this.y + vectorA.y * scalarA + vectorB.y * scalarB,\r\n result);\r\n }\r\n\r\n /** Return point + vectorA * scalarA + vectorB * scalarB + vectorC * scalarC */\r\n public plus3Scaled(vectorA: XAndY, scalarA: number, vectorB: XAndY, scalarB: number, vectorC: XAndY, scalarC: number, result?: Point2d): Point2d {\r\n return Point2d.create(\r\n this.x + vectorA.x * scalarA + vectorB.x * scalarB + vectorC.x * scalarC,\r\n this.y + vectorA.y * scalarA + vectorB.y * scalarB + vectorC.y * scalarC,\r\n result);\r\n }\r\n /**\r\n * Return the dot product of vector from this to targetA and vector from this to targetB\r\n * @param targetA target of first vector\r\n * @param targetB target of second vector\r\n */\r\n public dotVectorsToTargets(targetA: XAndY, targetB: XAndY): number {\r\n return (targetA.x - this.x) * (targetB.x - this.x) +\r\n (targetA.y - this.y) * (targetB.y - this.y);\r\n }\r\n\r\n /** Returns the (scalar) cross product of two points/vectors, computed from origin to target1 and target2 */\r\n public crossProductToPoints(target1: XAndY, target2: XAndY): number {\r\n const x1 = target1.x - this.x;\r\n const y1 = target1.y - this.y;\r\n const x2 = target2.x - this.x;\r\n const y2 = target2.y - this.y;\r\n return x1 * y2 - y1 * x2;\r\n }\r\n /** Return the fractional coordinate of the projection of this instance x,y onto the line from startPoint to endPoint.\r\n * @param startPoint start point of line\r\n * @param endPoint end point of line\r\n * @param defaultFraction fraction to return if startPoint and endPoint are equal.\r\n */\r\n public fractionOfProjectionToLine(startPoint: Point2d, endPoint: Point2d, defaultFraction?: number): number {\r\n const denominator = startPoint.distanceSquared(endPoint);\r\n if (denominator < Geometry.smallMetricDistanceSquared)\r\n return defaultFraction ? defaultFraction : 0;\r\n return startPoint.dotVectorsToTargets(endPoint, this) / denominator;\r\n }\r\n}\r\n/** 2D vector with `x`,`y` as properties\r\n * @public\r\n */\r\nexport class Vector2d extends XY implements BeJSONFunctions {\r\n constructor(x: number = 0, y: number = 0) { super(x, y); }\r\n /** Return a new Vector2d with the same x,y */\r\n public clone(result?: Vector2d): Vector2d { return Vector2d.create(this.x, this.y, result); }\r\n /** Return a new Vector2d with given x and y */\r\n public static create(x: number = 0, y: number = 0, result?: Vector2d): Vector2d {\r\n if (result) {\r\n result.x = x;\r\n result.y = y;\r\n return result;\r\n }\r\n return new Vector2d(x, y);\r\n }\r\n\r\n /** Return a (new) Vector2d with components 1,0 */\r\n public static unitX(scale: number = 1): Vector2d { return new Vector2d(scale, 0); }\r\n\r\n /** Return a (new) Vector2d with components 0,1 */\r\n public static unitY(scale: number = 1): Vector2d { return new Vector2d(0, scale); }\r\n\r\n /** Return a Vector2d with components 0,0 */\r\n public static createZero(result?: Vector2d): Vector2d { return Vector2d.create(0, 0, result); }\r\n\r\n /** copy contents from another Point3d, Point2d, Vector2d, or Vector3d, or leading entries of Float64Array */\r\n public static createFrom(data: XAndY | Float64Array, result?: Vector2d): Vector2d {\r\n if (data instanceof Float64Array) {\r\n if (data.length >= 2)\r\n return Vector2d.create(data[0], data[1]);\r\n if (data.length >= 1)\r\n return Vector2d.create(data[0], 0);\r\n return Vector2d.create(0, 0);\r\n }\r\n return Vector2d.create(data.x, data.y, result);\r\n }\r\n /** Return a new Vector2d from json structured as `[1,2]` or `{x:1,y:2}` */\r\n public static fromJSON(json?: XYProps): Vector2d { const val = new Vector2d(); val.setFromJSON(json); return val; }\r\n /** Return a new Vector2d from polar coordinates for radius and Angle from x axis */\r\n public static createPolar(r: number, theta: Angle): Vector2d {\r\n return Vector2d.create(r * theta.cos(), r * theta.sin());\r\n }\r\n /** Return a new Vector2d extending from point0 to point1 */\r\n public static createStartEnd(point0: XAndY, point1: XAndY, result?: Vector2d): Vector2d {\r\n return Vector2d.create(point1.x - point0.x, point1.y - point0.y, result);\r\n }\r\n /**\r\n * Return a vector that bisects the angle between two normals and extends to the intersection of two offset lines\r\n * @param unitPerpA unit perpendicular to incoming direction\r\n * @param unitPerpB unit perpendicular to outgoing direction\r\n * @param offset offset distance\r\n */\r\n public static createOffsetBisector(unitPerpA: Vector2d, unitPerpB: Vector2d, offset: number): Vector2d | undefined {\r\n let bisector: Vector2d | undefined = unitPerpA.plus(unitPerpB);\r\n bisector = bisector.normalize();\r\n if (bisector) {\r\n const c = offset * bisector.dotProduct(unitPerpA);\r\n return bisector.safeDivideOrNull(c);\r\n }\r\n return undefined;\r\n }\r\n\r\n /** Return a (new or optionally reused) vector which is `this` divided by denominator\r\n * * return undefined if denominator is zero.\r\n */\r\n public safeDivideOrNull(denominator: number, result?: Vector2d): Vector2d | undefined {\r\n if (denominator !== 0.0) {\r\n return this.scale(1.0 / denominator, result);\r\n }\r\n return undefined;\r\n }\r\n /** Return a unit vector in direction of this instance (undefined if this instance has near zero length) */\r\n public normalize(result?: Vector2d): Vector2d | undefined {\r\n const mag = Geometry.correctSmallMetricDistance(this.magnitude());\r\n result = result ? result : new Vector2d();\r\n return this.safeDivideOrNull(mag, result);\r\n }\r\n\r\n /** return the fractional projection of spaceVector onto this */\r\n public fractionOfProjectionToVector(target: Vector2d, defaultFraction?: number): number {\r\n const numerator = this.dotProduct(target);\r\n const denominator = target.magnitudeSquared();\r\n if (denominator < Geometry.smallMetricDistanceSquared)\r\n return defaultFraction ? defaultFraction : 0;\r\n return numerator / denominator;\r\n }\r\n\r\n /** Return a new vector with components negated from this instance. */\r\n public negate(result?: Vector2d): Vector2d {\r\n result = result ? result : new Vector2d();\r\n result.x = -this.x;\r\n result.y = -this.y;\r\n return result;\r\n }\r\n\r\n /** Return a vector same length as this but rotated 90 degrees counter clockwise */\r\n public rotate90CCWXY(result?: Vector2d): Vector2d {\r\n result = result ? result : new Vector2d();\r\n // save x,y to allow aliasing ..\r\n const xx: number = this.x;\r\n const yy: number = this.y;\r\n result.x = -yy;\r\n result.y = xx;\r\n return result;\r\n }\r\n\r\n /** Return a vector same length as this but rotated 90 degrees clockwise */\r\n public rotate90CWXY(result?: Vector2d): Vector2d {\r\n result = result ? result : new Vector2d();\r\n // save x,y to allow aliasing ..\r\n const xx: number = this.x;\r\n const yy: number = this.y;\r\n result.x = yy;\r\n result.y = -xx;\r\n return result;\r\n }\r\n /** Return a unit vector perpendicular to this instance. */\r\n public unitPerpendicularXY(result?: Vector2d): Vector2d {\r\n result = result ? result : new Vector2d();\r\n const xx: number = this.x;\r\n const yy: number = this.y;\r\n result.x = -yy;\r\n result.y = xx;\r\n const d2: number = xx * xx + yy * yy;\r\n if (d2 !== 0.0) {\r\n const a = 1.0 / Math.sqrt(d2);\r\n result.x *= a;\r\n result.y *= a;\r\n }\r\n return result;\r\n }\r\n /** return a new Vector2d rotated CCW by given angle */\r\n public rotateXY(angle: Angle, result?: Vector2d): Vector2d {\r\n const s = angle.sin();\r\n const c = angle.cos();\r\n const xx: number = this.x;\r\n const yy: number = this.y;\r\n result = result ? result : new Vector2d();\r\n result.x = xx * c - yy * s;\r\n result.y = xx * s + yy * c;\r\n return result;\r\n }\r\n\r\n /** return the interpolation {this + fraction * (right - this)} */\r\n public interpolate(fraction: number, right: Vector2d, result?: Vector2d): Vector2d {\r\n result = result ? result : new Vector2d();\r\n /* For best last-bit behavior, if fraction is below 0.5, use this as base point. If above 0.5, use right as base point. */\r\n if (fraction <= 0.5) {\r\n result.x = this.x + fraction * (right.x - this.x);\r\n result.y = this.y + fraction * (right.y - this.y);\r\n } else {\r\n const t: number = fraction - 1.0;\r\n result.x = right.x + t * (right.x - this.x);\r\n result.y = right.y + t * (right.y - this.y);\r\n }\r\n return result;\r\n }\r\n\r\n /** return {this + vector}. */\r\n public plus(vector: XAndY, result?: Vector2d): Vector2d {\r\n result = result ? result : new Vector2d();\r\n result.x = this.x + vector.x;\r\n result.y = this.y + vector.y;\r\n return result;\r\n }\r\n /** return {this - vector}. */\r\n public minus(vector: XAndY, result?: Vector2d): Vector2d {\r\n result = result ? result : new Vector2d();\r\n result.x = this.x - vector.x;\r\n result.y = this.y - vector.y;\r\n return result;\r\n }\r\n\r\n /** Return {point + vector \\* scalar} */\r\n public plusScaled(vector: XAndY, scaleFactor: number, result?: Vector2d): Vector2d {\r\n result = result ? result : new Vector2d();\r\n result.x = this.x + vector.x * scaleFactor;\r\n result.y = this.y + vector.y * scaleFactor;\r\n return result;\r\n }\r\n\r\n /** Return {point + vectorA \\* scalarA + vectorB \\* scalarB} */\r\n public plus2Scaled(vectorA: XAndY, scalarA: number, vectorB: XAndY, scalarB: number, result?: Vector2d): Vector2d {\r\n result = result ? result : new Vector2d();\r\n result.x = this.x + vectorA.x * scalarA + vectorB.x * scalarB;\r\n result.y = this.y + vectorA.y * scalarA + vectorB.y * scalarB;\r\n return result;\r\n }\r\n\r\n /** Return {this + vectorA \\* scalarA + vectorB \\* scalarB + vectorC \\* scalarC} */\r\n public plus3Scaled(vectorA: XAndY, scalarA: number, vectorB: XAndY, scalarB: number, vectorC: XAndY, scalarC: number, result?: Vector2d): Vector2d {\r\n result = result ? result : new Vector2d();\r\n result.x = this.x + vectorA.x * scalarA + vectorB.x * scalarB + vectorC.x * scalarC;\r\n result.y = this.y + vectorA.y * scalarA + vectorB.y * scalarB + vectorC.y * scalarC;\r\n return result;\r\n }\r\n /** Return {this * scale} */\r\n public scale(scale: number, result?: Vector2d): Vector2d {\r\n result = result ? result : new Vector2d();\r\n result.x = this.x * scale;\r\n result.y = this.y * scale;\r\n return result;\r\n }\r\n /** return a vector parallel to this but with specified length */\r\n public scaleToLength(length: number, result?: Vector2d): Vector2d | undefined {\r\n const mag = Geometry.correctSmallMetricDistance(this.magnitude());\r\n if (mag === 0)\r\n return undefined;\r\n return this.scale(length / mag, result);\r\n }\r\n /** return the dot product of this with vectorB */\r\n public dotProduct(vectorB: XAndY): number { return this.x * vectorB.x + this.y * vectorB.y; }\r\n\r\n /** dot product with vector from pointA to pointB */\r\n public dotProductStartEnd(pointA: XAndY, pointB: XAndY): number {\r\n return this.x * (pointB.x - pointA.x)\r\n + this.y * (pointB.y - pointA.y);\r\n }\r\n\r\n /** vector cross product {this CROSS vectorB} */\r\n public crossProduct(vectorB: XAndY): number { return this.x * vectorB.y - this.y * vectorB.x; }\r\n /** return the (signed) angle from this to vectorB. This is positive if the shortest turn is counterclockwise, negative if clockwise. */\r\n public angleTo(vectorB: XAndY): Angle {\r\n return Angle.createAtan2(this.crossProduct(vectorB), this.dotProduct(vectorB));\r\n }\r\n\r\n /* smallerUnorientedAngleTo(vectorB: Vector2d): Angle { }\r\n signedAngleTo(vectorB: Vector2d, upVector: Vector2d): Angle { }\r\n planarAngleTo(vectorB: Vector2d, planeNormal: Vector2d): Angle { }\r\n // sectors\r\n isInSmallerSector(vectorA: Vector2d, vectorB: Vector2d): boolean { }\r\n isInCCWSector(vectorA: Vector2d, vectorB: Vector2d, upVector: Vector2d): boolean { }\r\n */\r\n /**\r\n * Test if `this` and `other` area parallel, with angle tolerance `Geometry.smallAngleRadiansSquared`.\r\n * @param other second vector for comparison.\r\n * @param oppositeIsParallel if true, treat vectors 180 opposite as parallel. If false, treat those as non-parallel.\r\n */\r\n public isParallelTo(other: Vector2d, oppositeIsParallel: boolean = false): boolean {\r\n const a2 = this.magnitudeSquared();\r\n const b2 = other.magnitudeSquared();\r\n // we know both are 0 or positive -- no need for\r\n if (a2 < Geometry.smallMetricDistanceSquared || b2 < Geometry.smallMetricDistanceSquared)\r\n return false;\r\n\r\n const dot = this.dotProduct(other);\r\n if (dot < 0.0 && !oppositeIsParallel)\r\n return false;\r\n\r\n const cross = this.crossProduct(other);\r\n\r\n /* a2,b2,cross2 are squared lengths of respective vectors */\r\n /* cross2 = sin^2(theta) * a2 * b2 */\r\n /* For small theta, sin^2(theta)~~theta^2 */\r\n return cross * cross <= Geometry.smallAngleRadiansSquared * a2 * b2;\r\n }\r\n /**\r\n * Returns `true` if `this` vector is perpendicular to `other`.\r\n * @param other second vector.\r\n */\r\n public isPerpendicularTo(other: Vector2d): boolean {\r\n return Angle.isPerpendicularDotSet(this.magnitudeSquared(), other.magnitudeSquared(), this.dotProduct(other));\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"Point2dVector2d.js","sourceRoot":"","sources":["../../../src/geometry3d/Point2dVector2d.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module CartesianGeometry\r\n */\r\n// cspell:word JSONXY\r\n// cspell:word CWXY\r\n\r\nimport { BeJSONFunctions, Geometry, PerpParallelOptions } from \"../Geometry\";\r\nimport { Angle } from \"./Angle\";\r\nimport { XAndY, XYProps } from \"./XYZProps\";\r\n\r\n/** Minimal object containing x,y and operations that are meaningful without change in both point and vector.\r\n * * `XY` is not instantiable.\r\n * * The derived (instantiable) classes are\r\n * * `Point2d`\r\n * * `Vector2d`\r\n * @public\r\n */\r\nexport class XY implements XAndY {\r\n /** x component */\r\n public x: number;\r\n /** y component */\r\n public y: number;\r\n /** Set both x and y. */\r\n public set(x: number = 0, y: number = 0) { this.x = x; this.y = y; }\r\n /** Set both x and y to zero */\r\n public setZero() { this.x = 0; this.y = 0; }\r\n protected constructor(x: number = 0, y: number = 0) { this.x = x; this.y = y; }\r\n /** Set both x and y from other. */\r\n public setFrom(other?: XAndY) {\r\n if (other) {\r\n this.x = other.x; this.y = other.y;\r\n } else {\r\n this.x = 0; this.y = 0;\r\n }\r\n }\r\n /** Freeze this instance so it is read-only */\r\n public freeze(): Readonly<this> { return Object.freeze(this); }\r\n\r\n /** Returns true if this and other have equal x,y parts within Geometry.smallMetricDistance. */\r\n public isAlmostEqual(other: XAndY, tol?: number): boolean { return Geometry.isSameCoordinate(this.x, other.x, tol) && Geometry.isSameCoordinate(this.y, other.y, tol); }\r\n\r\n /** Returns true if this and other have equal x,y parts within Geometry.smallMetricDistance. */\r\n public isAlmostEqualXY(x: number, y: number, tol?: number): boolean { return Geometry.isSameCoordinate(this.x, x, tol) && Geometry.isSameCoordinate(this.y, y, tol); }\r\n\r\n /** return a json array `[x,y]` */\r\n public toJSON(): XYProps { return [this.x, this.y]; }\r\n /** return a json object `{x: 1, y:2}` */\r\n public toJSONXY(): XYProps { return { x: this.x, y: this.y }; }\r\n /** Set x and y from a JSON source such as `[1,2]` or `{x:1, y:2}` */\r\n public setFromJSON(json?: XYProps): void {\r\n if (Array.isArray(json)) {\r\n this.set(json[0] || 0, json[1] || 0);\r\n return;\r\n }\r\n if (json) {\r\n this.set(json.x || 0, json.y || 0);\r\n return;\r\n }\r\n this.set(0, 0);\r\n }\r\n\r\n /** Return the distance from this point to other */\r\n public distance(other: XAndY): number {\r\n const xDist = other.x - this.x;\r\n const yDist = other.y - this.y;\r\n return (Math.sqrt(xDist * xDist + yDist * yDist));\r\n }\r\n\r\n /** Return squared distance from this point to other */\r\n public distanceSquared(other: XAndY): number {\r\n const xDist = other.x - this.x;\r\n const yDist = other.y - this.y;\r\n return (xDist * xDist + yDist * yDist);\r\n }\r\n\r\n /** Return the largest absolute distance between corresponding components */\r\n public maxDiff(other: XAndY): number {\r\n return Math.max(Math.abs(this.x - other.x), Math.abs(this.y - other.y));\r\n }\r\n /** returns true if the x,y components are both small by metric metric tolerance */\r\n public get isAlmostZero(): boolean {\r\n return Geometry.isSmallMetricDistance(this.x) && Geometry.isSmallMetricDistance(this.y);\r\n }\r\n\r\n /** Return the largest absolute value of any component */\r\n public maxAbs(): number { return Math.max(Math.abs(this.x), Math.abs(this.y)); }\r\n /** Return the magnitude of the vector */\r\n public magnitude(): number { return Math.sqrt(this.x * this.x + this.y * this.y); }\r\n /** Return the squared magnitude of the vector. */\r\n public magnitudeSquared(): number { return this.x * this.x + this.y * this.y; }\r\n\r\n /** returns true if the x,y components are exactly equal. */\r\n public isExactEqual(other: XAndY): boolean { return this.x === other.x && this.y === other.y; }\r\n /** returns true if x,y match `other` within metric tolerance */\r\n public isAlmostEqualMetric(other: XAndY): boolean { return this.maxDiff(other) <= Geometry.smallMetricDistance; }\r\n\r\n /** Return a (full length) vector from this point to other */\r\n public vectorTo(other: XAndY, result?: Vector2d): Vector2d {\r\n return Vector2d.create(\r\n other.x - this.x,\r\n other.y - this.y,\r\n result);\r\n }\r\n /** Return a unit vector from this point to other */\r\n public unitVectorTo(target: XAndY, result?: Vector2d): Vector2d | undefined {\r\n return this.vectorTo(target, result).normalize(result);\r\n }\r\n /** cross product of vectors from origin to targets */\r\n public static crossProductToPoints(origin: XAndY, targetA: XAndY, targetB: XAndY): number {\r\n return Geometry.crossProductXYXY(\r\n targetA.x - origin.x, targetA.y - origin.y, targetB.x - origin.x, targetB.y - origin.y);\r\n }\r\n}\r\n/** 2D point with `x`,`y` as properties\r\n * @public\r\n */\r\nexport class Point2d extends XY implements BeJSONFunctions {\r\n /** Constructor for Point2d */\r\n constructor(x: number = 0, y: number = 0) { super(x, y); }\r\n /** return a new Point2d with x,y coordinates from this. */\r\n public clone(result?: Point2d): Point2d { return Point2d.create(this.x, this.y, result); }\r\n\r\n /**\r\n * Return a point (newly created unless result provided) with given x,y coordinates\r\n * @param x x coordinate\r\n * @param y y coordinate\r\n * @param result optional result\r\n */\r\n public static create(x: number = 0, y: number = 0, result?: Point2d): Point2d {\r\n if (result) {\r\n result.x = x;\r\n result.y = y;\r\n return result;\r\n }\r\n return new Point2d(x, y);\r\n }\r\n /** Convert JSON `[1,2]` or `{x:1, y:2}` to a Point2d instance */\r\n public static fromJSON(json?: XYProps): Point2d { const val = new Point2d(); val.setFromJSON(json); return val; }\r\n /** Create (or optionally reuse) a Point2d from another object with fields x and y */\r\n public static createFrom(xy: XAndY | undefined, result?: Point2d): Point2d {\r\n if (xy)\r\n return Point2d.create(xy.x, xy.y, result);\r\n return Point2d.create(0, 0, result);\r\n }\r\n /** Create a Point2d with both coordinates zero. */\r\n public static createZero(result?: Point2d): Point2d { return Point2d.create(0, 0, result); }\r\n /** Starting at this point, move along vector by tangentFraction of the vector length, and to the left by leftFraction of\r\n * the perpendicular vector length.\r\n * @param tangentFraction distance to move along the vector, as a fraction of vector\r\n * @param leftFraction distance to move perpendicular to the vector, as a fraction of the rotated vector\r\n */\r\n public addForwardLeft(tangentFraction: number, leftFraction: number, vector: Vector2d): Point2d {\r\n const dx = vector.x;\r\n const dy = vector.y;\r\n return Point2d.create(this.x + tangentFraction * dx - leftFraction * dy,\r\n this.y + tangentFraction * dy + leftFraction * dx);\r\n }\r\n /** Interpolate at tangentFraction between this instance and point. Move by leftFraction along the xy perpendicular\r\n * of the vector between the points.\r\n */\r\n public forwardLeftInterpolate(tangentFraction: number, leftFraction: number, point: XAndY): Point2d {\r\n const dx = point.x - this.x;\r\n const dy = point.y - this.y;\r\n return Point2d.create(\r\n this.x + tangentFraction * dx - leftFraction * dy,\r\n this.y + tangentFraction * dy + leftFraction * dx);\r\n }\r\n\r\n /** Return a point interpolated between this point and the right param. */\r\n public interpolate(fraction: number, other: XAndY, result?: Point2d): Point2d {\r\n if (fraction <= 0.5)\r\n return Point2d.create(\r\n this.x + fraction * (other.x - this.x),\r\n this.y + fraction * (other.y - this.y),\r\n result);\r\n const t: number = fraction - 1.0;\r\n return Point2d.create(\r\n other.x + t * (other.x - this.x),\r\n other.y + t * (other.y - this.y),\r\n result);\r\n }\r\n\r\n /** Return a point with independent x,y fractional interpolation. */\r\n public interpolateXY(fractionX: number, fractionY: number, other: XAndY, result?: Point2d): Point2d {\r\n return Point2d.create(\r\n Geometry.interpolate(this.x, fractionX, other.x),\r\n Geometry.interpolate(this.y, fractionY, other.y),\r\n result);\r\n }\r\n\r\n /** Return this point minus vector */\r\n public minus(vector: XAndY, result?: Point2d): Point2d {\r\n return Point2d.create(\r\n this.x - vector.x,\r\n this.y - vector.y,\r\n result);\r\n }\r\n\r\n /** Return point plus vector */\r\n public plus(vector: XAndY, result?: Point2d): Point2d {\r\n return Point2d.create(\r\n this.x + vector.x,\r\n this.y + vector.y,\r\n result);\r\n }\r\n /** Return point plus vector */\r\n public plusXY(dx: number = 0, dy: number = 0, result?: Point2d): Point2d {\r\n return Point2d.create(\r\n this.x + dx,\r\n this.y + dy, result);\r\n }\r\n\r\n /** Return point + vector * scalar */\r\n public plusScaled(vector: XAndY, scaleFactor: number, result?: Point2d): Point2d {\r\n return Point2d.create(\r\n this.x + vector.x * scaleFactor,\r\n this.y + vector.y * scaleFactor,\r\n result);\r\n }\r\n\r\n /** Return point + vectorA * scalarA + vectorB * scalarB */\r\n public plus2Scaled(vectorA: XAndY, scalarA: number, vectorB: XAndY, scalarB: number, result?: Point2d): Point2d {\r\n return Point2d.create(\r\n this.x + vectorA.x * scalarA + vectorB.x * scalarB,\r\n this.y + vectorA.y * scalarA + vectorB.y * scalarB,\r\n result);\r\n }\r\n\r\n /** Return point + vectorA * scalarA + vectorB * scalarB + vectorC * scalarC */\r\n public plus3Scaled(vectorA: XAndY, scalarA: number, vectorB: XAndY, scalarB: number, vectorC: XAndY, scalarC: number, result?: Point2d): Point2d {\r\n return Point2d.create(\r\n this.x + vectorA.x * scalarA + vectorB.x * scalarB + vectorC.x * scalarC,\r\n this.y + vectorA.y * scalarA + vectorB.y * scalarB + vectorC.y * scalarC,\r\n result);\r\n }\r\n /**\r\n * Return the dot product of vector from this to targetA and vector from this to targetB\r\n * @param targetA target of first vector\r\n * @param targetB target of second vector\r\n */\r\n public dotVectorsToTargets(targetA: XAndY, targetB: XAndY): number {\r\n return (targetA.x - this.x) * (targetB.x - this.x) +\r\n (targetA.y - this.y) * (targetB.y - this.y);\r\n }\r\n\r\n /** Returns the (scalar) cross product of two points/vectors, computed from origin to target1 and target2 */\r\n public crossProductToPoints(target1: XAndY, target2: XAndY): number {\r\n const x1 = target1.x - this.x;\r\n const y1 = target1.y - this.y;\r\n const x2 = target2.x - this.x;\r\n const y2 = target2.y - this.y;\r\n return x1 * y2 - y1 * x2;\r\n }\r\n /** Return the fractional coordinate of the projection of this instance x,y onto the line from startPoint to endPoint.\r\n * @param startPoint start point of line\r\n * @param endPoint end point of line\r\n * @param defaultFraction fraction to return if startPoint and endPoint are equal.\r\n */\r\n public fractionOfProjectionToLine(startPoint: Point2d, endPoint: Point2d, defaultFraction?: number): number {\r\n const denominator = startPoint.distanceSquared(endPoint);\r\n if (denominator < Geometry.smallMetricDistanceSquared)\r\n return defaultFraction ? defaultFraction : 0;\r\n return startPoint.dotVectorsToTargets(endPoint, this) / denominator;\r\n }\r\n}\r\n/** 2D vector with `x`,`y` as properties\r\n * @public\r\n */\r\nexport class Vector2d extends XY implements BeJSONFunctions {\r\n constructor(x: number = 0, y: number = 0) { super(x, y); }\r\n /** Return a new Vector2d with the same x,y */\r\n public clone(result?: Vector2d): Vector2d { return Vector2d.create(this.x, this.y, result); }\r\n /** Return a new Vector2d with given x and y */\r\n public static create(x: number = 0, y: number = 0, result?: Vector2d): Vector2d {\r\n if (result) {\r\n result.x = x;\r\n result.y = y;\r\n return result;\r\n }\r\n return new Vector2d(x, y);\r\n }\r\n\r\n /** Return a (new) Vector2d with components 1,0 */\r\n public static unitX(scale: number = 1): Vector2d { return new Vector2d(scale, 0); }\r\n\r\n /** Return a (new) Vector2d with components 0,1 */\r\n public static unitY(scale: number = 1): Vector2d { return new Vector2d(0, scale); }\r\n\r\n /** Return a Vector2d with components 0,0 */\r\n public static createZero(result?: Vector2d): Vector2d { return Vector2d.create(0, 0, result); }\r\n\r\n /** copy contents from another Point3d, Point2d, Vector2d, or Vector3d, or leading entries of Float64Array */\r\n public static createFrom(data: XAndY | Float64Array, result?: Vector2d): Vector2d {\r\n if (data instanceof Float64Array) {\r\n if (data.length >= 2)\r\n return Vector2d.create(data[0], data[1]);\r\n if (data.length >= 1)\r\n return Vector2d.create(data[0], 0);\r\n return Vector2d.create(0, 0);\r\n }\r\n return Vector2d.create(data.x, data.y, result);\r\n }\r\n /** Return a new Vector2d from json structured as `[1,2]` or `{x:1,y:2}` */\r\n public static fromJSON(json?: XYProps): Vector2d { const val = new Vector2d(); val.setFromJSON(json); return val; }\r\n /** Return a new Vector2d from polar coordinates for radius and Angle from x axis */\r\n public static createPolar(r: number, theta: Angle): Vector2d {\r\n return Vector2d.create(r * theta.cos(), r * theta.sin());\r\n }\r\n /** Return a new Vector2d extending from point0 to point1 */\r\n public static createStartEnd(point0: XAndY, point1: XAndY, result?: Vector2d): Vector2d {\r\n return Vector2d.create(point1.x - point0.x, point1.y - point0.y, result);\r\n }\r\n /**\r\n * Return a vector that bisects the angle between two normals and extends to the intersection of two offset lines\r\n * @param unitPerpA unit perpendicular to incoming direction\r\n * @param unitPerpB unit perpendicular to outgoing direction\r\n * @param offset offset distance\r\n */\r\n public static createOffsetBisector(unitPerpA: Vector2d, unitPerpB: Vector2d, offset: number): Vector2d | undefined {\r\n let bisector: Vector2d | undefined = unitPerpA.plus(unitPerpB);\r\n bisector = bisector.normalize();\r\n if (bisector) {\r\n const c = offset * bisector.dotProduct(unitPerpA);\r\n return bisector.safeDivideOrNull(c);\r\n }\r\n return undefined;\r\n }\r\n\r\n /** Return a (new or optionally reused) vector which is `this` divided by denominator\r\n * * return undefined if denominator is zero.\r\n */\r\n public safeDivideOrNull(denominator: number, result?: Vector2d): Vector2d | undefined {\r\n if (denominator !== 0.0) {\r\n return this.scale(1.0 / denominator, result);\r\n }\r\n return undefined;\r\n }\r\n /** Return a unit vector in direction of this instance (undefined if this instance has near zero length) */\r\n public normalize(result?: Vector2d): Vector2d | undefined {\r\n const mag = Geometry.correctSmallMetricDistance(this.magnitude());\r\n result = result ? result : new Vector2d();\r\n return this.safeDivideOrNull(mag, result);\r\n }\r\n\r\n /** return the fractional projection of spaceVector onto this */\r\n public fractionOfProjectionToVector(target: Vector2d, defaultFraction?: number): number {\r\n const numerator = this.dotProduct(target);\r\n const denominator = target.magnitudeSquared();\r\n if (denominator < Geometry.smallMetricDistanceSquared)\r\n return defaultFraction ? defaultFraction : 0;\r\n return numerator / denominator;\r\n }\r\n\r\n /** Return a new vector with components negated from this instance. */\r\n public negate(result?: Vector2d): Vector2d {\r\n result = result ? result : new Vector2d();\r\n result.x = -this.x;\r\n result.y = -this.y;\r\n return result;\r\n }\r\n\r\n /** Return a vector same length as this but rotated 90 degrees counter clockwise */\r\n public rotate90CCWXY(result?: Vector2d): Vector2d {\r\n result = result ? result : new Vector2d();\r\n // save x,y to allow aliasing ..\r\n const xx: number = this.x;\r\n const yy: number = this.y;\r\n result.x = -yy;\r\n result.y = xx;\r\n return result;\r\n }\r\n\r\n /** Return a vector same length as this but rotated 90 degrees clockwise */\r\n public rotate90CWXY(result?: Vector2d): Vector2d {\r\n result = result ? result : new Vector2d();\r\n // save x,y to allow aliasing ..\r\n const xx: number = this.x;\r\n const yy: number = this.y;\r\n result.x = yy;\r\n result.y = -xx;\r\n return result;\r\n }\r\n /** Return a unit vector perpendicular to this instance. */\r\n public unitPerpendicularXY(result?: Vector2d): Vector2d {\r\n result = result ? result : new Vector2d();\r\n const xx: number = this.x;\r\n const yy: number = this.y;\r\n result.x = -yy;\r\n result.y = xx;\r\n const d2: number = xx * xx + yy * yy;\r\n if (d2 !== 0.0) {\r\n const a = 1.0 / Math.sqrt(d2);\r\n result.x *= a;\r\n result.y *= a;\r\n }\r\n return result;\r\n }\r\n /** return a new Vector2d rotated CCW by given angle */\r\n public rotateXY(angle: Angle, result?: Vector2d): Vector2d {\r\n const s = angle.sin();\r\n const c = angle.cos();\r\n const xx: number = this.x;\r\n const yy: number = this.y;\r\n result = result ? result : new Vector2d();\r\n result.x = xx * c - yy * s;\r\n result.y = xx * s + yy * c;\r\n return result;\r\n }\r\n\r\n /** return the interpolation {this + fraction * (right - this)} */\r\n public interpolate(fraction: number, right: Vector2d, result?: Vector2d): Vector2d {\r\n result = result ? result : new Vector2d();\r\n /* For best last-bit behavior, if fraction is below 0.5, use this as base point. If above 0.5, use right as base point. */\r\n if (fraction <= 0.5) {\r\n result.x = this.x + fraction * (right.x - this.x);\r\n result.y = this.y + fraction * (right.y - this.y);\r\n } else {\r\n const t: number = fraction - 1.0;\r\n result.x = right.x + t * (right.x - this.x);\r\n result.y = right.y + t * (right.y - this.y);\r\n }\r\n return result;\r\n }\r\n\r\n /** return {this + vector}. */\r\n public plus(vector: XAndY, result?: Vector2d): Vector2d {\r\n result = result ? result : new Vector2d();\r\n result.x = this.x + vector.x;\r\n result.y = this.y + vector.y;\r\n return result;\r\n }\r\n /** return {this - vector}. */\r\n public minus(vector: XAndY, result?: Vector2d): Vector2d {\r\n result = result ? result : new Vector2d();\r\n result.x = this.x - vector.x;\r\n result.y = this.y - vector.y;\r\n return result;\r\n }\r\n\r\n /** Return {point + vector \\* scalar} */\r\n public plusScaled(vector: XAndY, scaleFactor: number, result?: Vector2d): Vector2d {\r\n result = result ? result : new Vector2d();\r\n result.x = this.x + vector.x * scaleFactor;\r\n result.y = this.y + vector.y * scaleFactor;\r\n return result;\r\n }\r\n\r\n /** Return {point + vectorA \\* scalarA + vectorB \\* scalarB} */\r\n public plus2Scaled(vectorA: XAndY, scalarA: number, vectorB: XAndY, scalarB: number, result?: Vector2d): Vector2d {\r\n result = result ? result : new Vector2d();\r\n result.x = this.x + vectorA.x * scalarA + vectorB.x * scalarB;\r\n result.y = this.y + vectorA.y * scalarA + vectorB.y * scalarB;\r\n return result;\r\n }\r\n\r\n /** Return {this + vectorA \\* scalarA + vectorB \\* scalarB + vectorC \\* scalarC} */\r\n public plus3Scaled(vectorA: XAndY, scalarA: number, vectorB: XAndY, scalarB: number, vectorC: XAndY, scalarC: number, result?: Vector2d): Vector2d {\r\n result = result ? result : new Vector2d();\r\n result.x = this.x + vectorA.x * scalarA + vectorB.x * scalarB + vectorC.x * scalarC;\r\n result.y = this.y + vectorA.y * scalarA + vectorB.y * scalarB + vectorC.y * scalarC;\r\n return result;\r\n }\r\n /** Return {this * scale} */\r\n public scale(scale: number, result?: Vector2d): Vector2d {\r\n result = result ? result : new Vector2d();\r\n result.x = this.x * scale;\r\n result.y = this.y * scale;\r\n return result;\r\n }\r\n /** return a vector parallel to this but with specified length */\r\n public scaleToLength(length: number, result?: Vector2d): Vector2d | undefined {\r\n const mag = Geometry.correctSmallMetricDistance(this.magnitude());\r\n if (mag === 0)\r\n return undefined;\r\n return this.scale(length / mag, result);\r\n }\r\n /** return the dot product of this with vectorB */\r\n public dotProduct(vectorB: XAndY): number { return this.x * vectorB.x + this.y * vectorB.y; }\r\n\r\n /** dot product with vector from pointA to pointB */\r\n public dotProductStartEnd(pointA: XAndY, pointB: XAndY): number {\r\n return this.x * (pointB.x - pointA.x)\r\n + this.y * (pointB.y - pointA.y);\r\n }\r\n\r\n /** vector cross product {this CROSS vectorB} */\r\n public crossProduct(vectorB: XAndY): number { return this.x * vectorB.y - this.y * vectorB.x; }\r\n\r\n /**\r\n * return the (radians as a simple number, not strongly typed Angle) signed angle from this to vectorB.\r\n * This is positive if the shortest turn is counterclockwise, negative if clockwise.\r\n */\r\n public radiansTo(vectorB: XAndY): number {\r\n return Math.atan2(this.crossProduct(vectorB), this.dotProduct(vectorB));\r\n }\r\n\r\n /**\r\n * return the (strongly typed) signed angle from this to vectorB.\r\n * This is positive if the shortest turn is counterclockwise, negative if clockwise.\r\n */\r\n public angleTo(vectorB: XAndY): Angle {\r\n return Angle.createRadians(this.radiansTo(vectorB));\r\n }\r\n\r\n /* smallerUnorientedAngleTo(vectorB: Vector2d): Angle { }\r\n signedAngleTo(vectorB: Vector2d, upVector: Vector2d): Angle { }\r\n planarAngleTo(vectorB: Vector2d, planeNormal: Vector2d): Angle { }\r\n // sectors\r\n isInSmallerSector(vectorA: Vector2d, vectorB: Vector2d): boolean { }\r\n isInCCWSector(vectorA: Vector2d, vectorB: Vector2d, upVector: Vector2d): boolean { }\r\n */\r\n /**\r\n * Test if this vector is parallel to other.\r\n * * The input tolerances in `options`, if given, are considered to be squared for efficiency's sake,\r\n * so if you have a distance or angle tolerance t, you should pass in t * t.\r\n * @param other second vector for comparison.\r\n * @param oppositeIsParallel whether to consider diametrically opposed vectors as parallel.\r\n * @param options optional radian and distance tolerances.\r\n */\r\n public isParallelTo(other: Vector2d, oppositeIsParallel: boolean = false,\r\n returnValueIfAnInputIsZeroLength: boolean = false, options?: PerpParallelOptions): boolean {\r\n const radianSquaredTol: number = options?.radianSquaredTol ?? Geometry.smallAngleRadiansSquared;\r\n const distanceSquaredTol: number = options?.distanceSquaredTol ?? Geometry.smallMetricDistanceSquared;\r\n const a2 = this.magnitudeSquared();\r\n const b2 = other.magnitudeSquared();\r\n if (a2 < distanceSquaredTol || b2 < distanceSquaredTol)\r\n return returnValueIfAnInputIsZeroLength;\r\n const dot = this.dotProduct(other);\r\n if (dot < 0.0 && !oppositeIsParallel)\r\n return false;\r\n const cross = this.crossProduct(other);\r\n /* a2,b2,cross2 are squared lengths of respective vectors */\r\n /* cross2 = sin^2(theta) * a2 * b2 */\r\n /* For small theta, sin^2(theta)~~theta^2 */\r\n return cross * cross <= radianSquaredTol * a2 * b2;\r\n }\r\n /**\r\n * Test if this vector is perpendicular to other.\r\n * * The input tolerances in `options`, if given, are considered to be squared for efficiency's sake,\r\n * so if you have a distance or angle tolerance t, you should pass in t * t.\r\n * @param other second vector in comparison.\r\n * @param returnValueIfAnInputIsZeroLength if either vector is near zero length, return this value.\r\n * @param options optional radian and distance tolerances.\r\n */\r\n public isPerpendicularTo(other: Vector2d, returnValueIfAnInputIsZeroLength: boolean = false, options?: PerpParallelOptions): boolean {\r\n const radianSquaredTol: number = options?.radianSquaredTol ?? Geometry.smallAngleRadiansSquared;\r\n const distanceSquaredTol: number = options?.distanceSquaredTol ?? Geometry.smallMetricDistanceSquared;\r\n const aa = this.magnitudeSquared();\r\n const bb = other.magnitudeSquared();\r\n if (aa < distanceSquaredTol || bb < distanceSquaredTol)\r\n return returnValueIfAnInputIsZeroLength;\r\n const ab = this.dotProduct(other);\r\n return ab * ab <= radianSquaredTol * aa * bb;\r\n }\r\n}\r\n"]}
|