@itwin/core-geometry 4.2.0-dev.1 → 4.2.0-dev.10
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/CHANGELOG.md +34 -1
- package/lib/cjs/clipping/ClipPlane.d.ts +10 -7
- package/lib/cjs/clipping/ClipPlane.d.ts.map +1 -1
- package/lib/cjs/clipping/ClipPlane.js +5 -3
- package/lib/cjs/clipping/ClipPlane.js.map +1 -1
- package/lib/cjs/clipping/ClipUtils.d.ts +16 -4
- package/lib/cjs/clipping/ClipUtils.d.ts.map +1 -1
- package/lib/cjs/clipping/ClipUtils.js +77 -2
- package/lib/cjs/clipping/ClipUtils.js.map +1 -1
- package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts +3 -2
- package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
- package/lib/cjs/clipping/ConvexClipPlaneSet.js +3 -2
- package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.d.ts +2 -2
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js +2 -2
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
- package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
- package/lib/cjs/curve/Arc3d.js.map +1 -1
- package/lib/cjs/curve/CoordinateXYZ.d.ts +15 -15
- package/lib/cjs/curve/CoordinateXYZ.d.ts.map +1 -1
- package/lib/cjs/curve/CoordinateXYZ.js +15 -15
- package/lib/cjs/curve/CoordinateXYZ.js.map +1 -1
- package/lib/cjs/curve/CurveChain.d.ts +4 -2
- package/lib/cjs/curve/CurveChain.d.ts.map +1 -1
- package/lib/cjs/curve/CurveChain.js.map +1 -1
- package/lib/cjs/curve/CurveCollection.d.ts +1 -1
- package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
- package/lib/cjs/curve/CurveCollection.js +1 -1
- package/lib/cjs/curve/CurveCollection.js.map +1 -1
- package/lib/cjs/curve/CurveCurveCloseApproachXY.d.ts +18 -7
- package/lib/cjs/curve/CurveCurveCloseApproachXY.d.ts.map +1 -1
- package/lib/cjs/curve/CurveCurveCloseApproachXY.js +17 -5
- package/lib/cjs/curve/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/cjs/curve/CurveCurveIntersectXY.d.ts +2 -2
- package/lib/cjs/curve/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/cjs/curve/CurveCurveIntersectXY.js +12 -10
- package/lib/cjs/curve/CurveCurveIntersectXY.js.map +1 -1
- package/lib/cjs/curve/Loop.d.ts +1 -2
- package/lib/cjs/curve/Loop.d.ts.map +1 -1
- package/lib/cjs/curve/Loop.js.map +1 -1
- package/lib/cjs/curve/ParityRegion.js.map +1 -1
- package/lib/cjs/curve/Path.d.ts +2 -3
- package/lib/cjs/curve/Path.d.ts.map +1 -1
- package/lib/cjs/curve/Path.js +1 -1
- package/lib/cjs/curve/Path.js.map +1 -1
- package/lib/cjs/curve/UnionRegion.js +1 -1
- package/lib/cjs/curve/UnionRegion.js.map +1 -1
- package/lib/cjs/geometry3d/FrameBuilder.d.ts +29 -25
- package/lib/cjs/geometry3d/FrameBuilder.d.ts.map +1 -1
- package/lib/cjs/geometry3d/FrameBuilder.js +42 -29
- package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.d.ts +26 -6
- package/lib/cjs/geometry3d/GrowableXYArray.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.js +66 -15
- package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.d.ts +5 -2
- package/lib/cjs/geometry3d/GrowableXYZArray.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.js +10 -3
- package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.d.ts +9 -5
- package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.js +9 -5
- package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/esm/clipping/ClipPlane.d.ts +10 -7
- package/lib/esm/clipping/ClipPlane.d.ts.map +1 -1
- package/lib/esm/clipping/ClipPlane.js +5 -3
- package/lib/esm/clipping/ClipPlane.js.map +1 -1
- package/lib/esm/clipping/ClipUtils.d.ts +16 -4
- package/lib/esm/clipping/ClipUtils.d.ts.map +1 -1
- package/lib/esm/clipping/ClipUtils.js +77 -2
- package/lib/esm/clipping/ClipUtils.js.map +1 -1
- package/lib/esm/clipping/ConvexClipPlaneSet.d.ts +3 -2
- package/lib/esm/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
- package/lib/esm/clipping/ConvexClipPlaneSet.js +3 -2
- package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.d.ts +2 -2
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js +2 -2
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
- package/lib/esm/curve/Arc3d.d.ts.map +1 -1
- package/lib/esm/curve/Arc3d.js.map +1 -1
- package/lib/esm/curve/CoordinateXYZ.d.ts +15 -15
- package/lib/esm/curve/CoordinateXYZ.d.ts.map +1 -1
- package/lib/esm/curve/CoordinateXYZ.js +15 -15
- package/lib/esm/curve/CoordinateXYZ.js.map +1 -1
- package/lib/esm/curve/CurveChain.d.ts +4 -2
- package/lib/esm/curve/CurveChain.d.ts.map +1 -1
- package/lib/esm/curve/CurveChain.js.map +1 -1
- package/lib/esm/curve/CurveCollection.d.ts +1 -1
- package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
- package/lib/esm/curve/CurveCollection.js +1 -1
- package/lib/esm/curve/CurveCollection.js.map +1 -1
- package/lib/esm/curve/CurveCurveCloseApproachXY.d.ts +18 -7
- package/lib/esm/curve/CurveCurveCloseApproachXY.d.ts.map +1 -1
- package/lib/esm/curve/CurveCurveCloseApproachXY.js +17 -5
- package/lib/esm/curve/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/esm/curve/CurveCurveIntersectXY.d.ts +2 -2
- package/lib/esm/curve/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/esm/curve/CurveCurveIntersectXY.js +12 -10
- package/lib/esm/curve/CurveCurveIntersectXY.js.map +1 -1
- package/lib/esm/curve/Loop.d.ts +1 -2
- package/lib/esm/curve/Loop.d.ts.map +1 -1
- package/lib/esm/curve/Loop.js.map +1 -1
- package/lib/esm/curve/ParityRegion.js.map +1 -1
- package/lib/esm/curve/Path.d.ts +2 -3
- package/lib/esm/curve/Path.d.ts.map +1 -1
- package/lib/esm/curve/Path.js +1 -1
- package/lib/esm/curve/Path.js.map +1 -1
- package/lib/esm/curve/UnionRegion.js +1 -1
- package/lib/esm/curve/UnionRegion.js.map +1 -1
- package/lib/esm/geometry3d/FrameBuilder.d.ts +29 -25
- package/lib/esm/geometry3d/FrameBuilder.d.ts.map +1 -1
- package/lib/esm/geometry3d/FrameBuilder.js +42 -29
- package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.d.ts +26 -6
- package/lib/esm/geometry3d/GrowableXYArray.d.ts.map +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.js +66 -15
- package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.d.ts +5 -2
- package/lib/esm/geometry3d/GrowableXYZArray.d.ts.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.js +10 -3
- package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.d.ts +9 -5
- package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.js +9 -5
- package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UnionRegion.js","sourceRoot":"","sources":["../../../src/curve/UnionRegion.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAO/F,uDAAoD;AAGpD,iCAA8B;AAC9B,iDAA8C;AAG9C;;;;;;GAMG;AACH,MAAa,WAAY,SAAQ,iCAAe;IAG9C,yCAAyC;IAClC,mBAAmB,CAAC,KAAoB;QAC7C,OAAO,KAAK,YAAY,WAAW,CAAC;IACtC,CAAC;IAGD,kCAAkC;IAClC,IAAoB,QAAQ;QAC1B,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IACD,iDAAiD;IACjD;QACE,KAAK,EAAE,CAAC;QAdV,wCAAwC;QACxB,wBAAmB,GAAG,aAAa,CAAC;QAclD,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IACD,wDAAwD;IACjD,MAAM,CAAC,MAAM,CAAC,GAAG,IAAgC;QACtD,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE;YACxB,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;SAC3B;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,+EAA+E;IACxE,eAAe;QACpB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,2FAA2F;IACpF,wBAAwB,CAAC,SAAkC,EAAE,gBAAwB,CAAC,CAAC;QAC5F,OAAO,SAAS,CAAC,mBAAmB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC5D,CAAC;IACD,uDAAuD;IAChD,YAAY,CAAC,OAAuB;QACzC,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;QAChC,IAAI,KAAK,CAAC;QACV,KAAK,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE;YAC5B,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"UnionRegion.js","sourceRoot":"","sources":["../../../src/curve/UnionRegion.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAO/F,uDAAoD;AAGpD,iCAA8B;AAC9B,iDAA8C;AAG9C;;;;;;GAMG;AACH,MAAa,WAAY,SAAQ,iCAAe;IAG9C,yCAAyC;IAClC,mBAAmB,CAAC,KAAoB;QAC7C,OAAO,KAAK,YAAY,WAAW,CAAC;IACtC,CAAC;IAGD,kCAAkC;IAClC,IAAoB,QAAQ;QAC1B,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IACD,iDAAiD;IACjD;QACE,KAAK,EAAE,CAAC;QAdV,wCAAwC;QACxB,wBAAmB,GAAG,aAAa,CAAC;QAclD,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IACD,wDAAwD;IACjD,MAAM,CAAC,MAAM,CAAC,GAAG,IAAgC;QACtD,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE;YACxB,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;SAC3B;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,+EAA+E;IACxE,eAAe;QACpB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,2FAA2F;IACpF,wBAAwB,CAAC,SAAkC,EAAE,gBAAwB,CAAC,CAAC;QAC5F,OAAO,SAAS,CAAC,mBAAmB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC5D,CAAC;IACD,uDAAuD;IAChD,YAAY,CAAC,OAAuB;QACzC,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;QAChC,IAAI,KAAK,CAAC;QACV,KAAK,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE;YAC5B,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACjD,IAAI,YAAY;gBACd,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;SACrC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,qCAAqC;IAC9B,cAAc;QACnB,OAAO,IAAI,WAAW,EAAE,CAAC;IAC3B,CAAC;IACD;;;OAGG;IACI,WAAW,CAAC,KAAe;QAChC,IAAI,KAAK,IAAI,CAAC,KAAK,YAAY,2BAAY,IAAI,KAAK,YAAY,WAAI,CAAC,EAAE;YACrE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3B,OAAO,IAAI,CAAC;SACb;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,0CAA0C;IACnC,QAAQ,CAAC,CAAS;QACvB,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM;YAC3B,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,8EAA8E;IACvE,yBAAyB,CAAC,OAAwB;QACvD,OAAO,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;CACF;AAtED,kCAsEC","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 Curve\r\n */\r\nimport { GeometryHandler } from \"../geometry3d/GeometryHandler\";\r\nimport { AnyCurve } from \"./CurveChain\";\r\nimport { CurveCollection } from \"./CurveCollection\";\r\nimport { RecursiveCurveProcessor } from \"./CurveProcessor\";\r\nimport { GeometryQuery } from \"./GeometryQuery\";\r\nimport { Loop } from \"./Loop\";\r\nimport { ParityRegion } from \"./ParityRegion\";\r\nimport { StrokeOptions } from \"./StrokeOptions\";\r\n\r\n/**\r\n * * A `UnionRegion` is a collection of other planar region types -- `Loop` and `ParityRegion`.\r\n * * The composite is the union of the contained regions.\r\n * * A point is \"in\" the composite if it is \"in\" one or more of the contained regions.\r\n * @see [Curve Collections]($docs/learning/geometry/CurveCollection.md) learning article.\r\n * @public\r\n */\r\nexport class UnionRegion extends CurveCollection {\r\n /** String name for schema properties */\r\n public readonly curveCollectionType = \"unionRegion\";\r\n /** Test if `other` is a `UnionRegion` */\r\n public isSameGeometryClass(other: GeometryQuery): boolean {\r\n return other instanceof UnionRegion;\r\n }\r\n /** Collection of Loop and ParityRegion children. */\r\n protected _children: Array<ParityRegion | Loop>;\r\n /** Return the array of regions */\r\n public override get children(): Array<ParityRegion | Loop> {\r\n return this._children;\r\n }\r\n /** Constructor -- initialize with no children */\r\n public constructor() {\r\n super();\r\n this._children = [];\r\n }\r\n /** Create a `UnionRegion` with given region children */\r\n public static create(...data: Array<ParityRegion | Loop>): UnionRegion {\r\n const result = new UnionRegion();\r\n for (const child of data) {\r\n result.tryAddChild(child);\r\n }\r\n return result;\r\n }\r\n /** Return the boundary type (5) of a corresponding MicroStation CurveVector */\r\n public dgnBoundaryType(): number {\r\n return 5;\r\n }\r\n /** Dispatch to more strongly typed `processor.announceUnionRegion(this, indexInParent)` */\r\n public announceToCurveProcessor(processor: RecursiveCurveProcessor, indexInParent: number = -1): void {\r\n return processor.announceUnionRegion(this, indexInParent);\r\n }\r\n /** Return structural clone with stroked primitives. */\r\n public cloneStroked(options?: StrokeOptions): UnionRegion {\r\n const clone = new UnionRegion();\r\n let child;\r\n for (child of this._children) {\r\n const childStrokes = child.cloneStroked(options);\r\n if (childStrokes)\r\n clone.children.push(childStrokes);\r\n }\r\n return clone;\r\n }\r\n /** Return new empty `UnionRegion` */\r\n public cloneEmptyPeer(): UnionRegion {\r\n return new UnionRegion();\r\n }\r\n /**\r\n * Try to add a child.\r\n * * Returns false if the `AnyCurve` child is not a region type.\r\n */\r\n public tryAddChild(child: AnyCurve): boolean {\r\n if (child && (child instanceof ParityRegion || child instanceof Loop)) {\r\n this._children.push(child);\r\n return true;\r\n }\r\n return false;\r\n }\r\n /** Return a child identified by index. */\r\n public getChild(i: number): Loop | ParityRegion | undefined {\r\n if (i < this._children.length)\r\n return this._children[i];\r\n return undefined;\r\n }\r\n /** Second step of double dispatch: call `handler.handleUnionRegion(this)` */\r\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\r\n return handler.handleUnionRegion(this);\r\n }\r\n}\r\n"]}
|
|
@@ -9,10 +9,10 @@ import { Transform } from "./Transform";
|
|
|
9
9
|
* * create the FrameBuilder and make calls to announcePoint and announceVector.
|
|
10
10
|
* * the frame will be fully determined by an origin and two vectors.
|
|
11
11
|
* * the first call to announcePoint will set the origin.
|
|
12
|
-
* *
|
|
13
|
-
* *
|
|
12
|
+
* * additional calls to announcePoint will produce announceVector call with the vector from the origin.
|
|
13
|
+
* * after each announcement, call getValidatedFrame(false)
|
|
14
14
|
* * getValidatedFrame will succeed when it has two independent vectors.
|
|
15
|
-
* *
|
|
15
|
+
* * To build a left handed frame,
|
|
16
16
|
* * an origin and 3 independent vectors are required.
|
|
17
17
|
* * announce as above, but query with getValidatedFrame (true).
|
|
18
18
|
* * this will use the third vector to select right or left handed frame.
|
|
@@ -24,11 +24,11 @@ export declare class FrameBuilder {
|
|
|
24
24
|
private _vector1;
|
|
25
25
|
private _vector2;
|
|
26
26
|
private areStronglyIndependentVectors;
|
|
27
|
-
/**
|
|
27
|
+
/** Clear all accumulated point and vector data */
|
|
28
28
|
clear(): void;
|
|
29
29
|
constructor();
|
|
30
|
-
/**
|
|
31
|
-
*
|
|
30
|
+
/**
|
|
31
|
+
* Try to assemble the data into a non-singular transform.
|
|
32
32
|
* * If allowLeftHanded is false, vector0 and vector1 determine a right handed coordinate system.
|
|
33
33
|
* * if allowLeftHanded is true, the z vector of the right handed system can be flipped to agree with vector2 direction.
|
|
34
34
|
*/
|
|
@@ -37,43 +37,47 @@ export declare class FrameBuilder {
|
|
|
37
37
|
applyDefaultUpVector(vector?: Vector3d): void;
|
|
38
38
|
/** Ask if there is a defined origin for the evolving frame */
|
|
39
39
|
get hasOrigin(): boolean;
|
|
40
|
-
/**
|
|
40
|
+
/**
|
|
41
|
+
* Return the number of vectors saved. Because the save process checks numerics, this should be the rank of the system.
|
|
41
42
|
*/
|
|
42
43
|
savedVectorCount(): number;
|
|
43
|
-
/**
|
|
44
|
+
/**
|
|
45
|
+
* Announce a new point. If this point is different from the origin, also compute and announce the vector from the origin.
|
|
46
|
+
*/
|
|
44
47
|
announcePoint(point: Point3d): number;
|
|
45
|
-
/**
|
|
48
|
+
/** Announce a new vector. */
|
|
46
49
|
announceVector(vector: Vector3d): number;
|
|
47
|
-
/**
|
|
48
|
-
*
|
|
50
|
+
/**
|
|
51
|
+
* Inspect the content of the data. Announce points and vectors. Return when savedVectorCount becomes sufficient
|
|
52
|
+
* for a coordinate system.
|
|
49
53
|
*/
|
|
50
54
|
announce(data: any): void;
|
|
51
|
-
/**
|
|
52
|
-
*
|
|
53
|
-
* *
|
|
54
|
-
* *
|
|
55
|
-
* *
|
|
55
|
+
/**
|
|
56
|
+
* Create a localToWorld frame for the given data.
|
|
57
|
+
* * origin is at first point.
|
|
58
|
+
* * x axis in direction of first nonzero vector present or implied by the input.
|
|
59
|
+
* * y axis is perpendicular to x and contains (in positive side) the next vector present or implied by the input.
|
|
56
60
|
*/
|
|
57
61
|
static createRightHandedFrame(defaultUpVector: Vector3d | undefined, ...params: any[]): Transform | undefined;
|
|
58
|
-
/**
|
|
62
|
+
/**
|
|
63
|
+
* Create a transform containing points or vectors in the given data.
|
|
59
64
|
* * The xy columns of the transform contain the first points or vectors of the data.
|
|
60
65
|
* * The z column is perpendicular to that xy plane.
|
|
61
|
-
* * The calculation favors the first points found.
|
|
66
|
+
* * The calculation favors the first points found. It does not try to get a "best" plane.
|
|
62
67
|
*/
|
|
63
68
|
static createRightHandedLocalToWorld(...params: any[]): Transform | undefined;
|
|
64
69
|
/**
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
* point most distant from that line.
|
|
70
|
+
* Try to create a frame whose xy plane is through points.
|
|
71
|
+
* * If 3 or more distinct points are present, the x axis is from the first point to the most distant, and y
|
|
72
|
+
* direction is toward the point most distant from that line.
|
|
69
73
|
* @param points array of points
|
|
70
74
|
*/
|
|
71
75
|
static createFrameToDistantPoints(points: Point3d[]): Transform | undefined;
|
|
72
76
|
/**
|
|
73
|
-
*
|
|
77
|
+
* Try to create a frame whose xy plane is through points, with the points appearing CCW in the local frame.
|
|
74
78
|
*
|
|
75
|
-
* *
|
|
76
|
-
* point most distant from that line.
|
|
79
|
+
* * If 3 or more distinct points are present, the x axis is from the first point to the most distant, and y
|
|
80
|
+
* direction is toward the point most distant from that line.
|
|
77
81
|
* @param points array of points
|
|
78
82
|
*/
|
|
79
83
|
static createFrameWithCCWPolygon(points: Point3d[]): Transform | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FrameBuilder.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/FrameBuilder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FrameBuilder.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/FrameBuilder.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAa,eAAe,EAAY,MAAM,aAAa,CAAC;AAGnE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGtD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIxC;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,QAAQ,CAAuB;IAEvC,OAAO,CAAC,6BAA6B;IASrC,kDAAkD;IAC3C,KAAK;;IASZ;;;;OAIG;IACI,iBAAiB,CAAC,eAAe,GAAE,OAAe,GAAG,SAAS,GAAG,SAAS;IAuBjF,kGAAkG;IAC3F,oBAAoB,CAAC,MAAM,CAAC,EAAE,QAAQ;IAK7C,8DAA8D;IAC9D,IAAW,SAAS,IAAI,OAAO,CAE9B;IACD;;OAEG;IACI,gBAAgB,IAAI,MAAM;IASjC;;OAEG;IACI,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAU5C,6BAA6B;IACtB,cAAc,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM;IA0B/C;;;OAGG;IACI,QAAQ,CAAC,IAAI,EAAE,GAAG;IAkEzB;;;;;OAKG;WACW,sBAAsB,CAAC,eAAe,EAAE,QAAQ,GAAG,SAAS,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,SAAS,GAAG,SAAS;IAgCpH;;;;;OAKG;WACW,6BAA6B,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,SAAS,GAAG,SAAS;IAWpF;;;;;OAKG;WACW,0BAA0B,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,GAAG,SAAS;IAalF;;;;;;OAMG;WACW,yBAAyB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,GAAG,SAAS;IASjF;;;;;;;;OAQG;WACW,kCAAkC,CAC9C,KAAK,EAAE,OAAO,EACd,WAAW,GAAE,eAA4D,EACzE,SAAS,GAAE,MAAU,EACrB,SAAS,GAAE,MAAU,EACrB,SAAS,GAAE,MAAU,EACrB,iBAAiB,GAAE,MAAY,GAAG,SAAS;CAe9C"}
|
|
@@ -16,7 +16,6 @@ const CurveCollection_1 = require("../curve/CurveCollection");
|
|
|
16
16
|
const CurvePrimitive_1 = require("../curve/CurvePrimitive");
|
|
17
17
|
const LineSegment3d_1 = require("../curve/LineSegment3d");
|
|
18
18
|
const LineString3d_1 = require("../curve/LineString3d");
|
|
19
|
-
/* eslint-disable @typescript-eslint/naming-convention, no-empty */
|
|
20
19
|
const Geometry_1 = require("../Geometry");
|
|
21
20
|
const GrowableXYZArray_1 = require("./GrowableXYZArray");
|
|
22
21
|
const Matrix3d_1 = require("./Matrix3d");
|
|
@@ -24,6 +23,7 @@ const Point3dVector3d_1 = require("./Point3dVector3d");
|
|
|
24
23
|
const PointHelpers_1 = require("./PointHelpers");
|
|
25
24
|
const PolygonOps_1 = require("./PolygonOps");
|
|
26
25
|
const Transform_1 = require("./Transform");
|
|
26
|
+
/* eslint-disable @typescript-eslint/naming-convention, no-empty */
|
|
27
27
|
/**
|
|
28
28
|
* Helper class to accumulate points and vectors until there is enough data to define a coordinate system.
|
|
29
29
|
*
|
|
@@ -31,10 +31,10 @@ const Transform_1 = require("./Transform");
|
|
|
31
31
|
* * create the FrameBuilder and make calls to announcePoint and announceVector.
|
|
32
32
|
* * the frame will be fully determined by an origin and two vectors.
|
|
33
33
|
* * the first call to announcePoint will set the origin.
|
|
34
|
-
* *
|
|
35
|
-
* *
|
|
34
|
+
* * additional calls to announcePoint will produce announceVector call with the vector from the origin.
|
|
35
|
+
* * after each announcement, call getValidatedFrame(false)
|
|
36
36
|
* * getValidatedFrame will succeed when it has two independent vectors.
|
|
37
|
-
* *
|
|
37
|
+
* * To build a left handed frame,
|
|
38
38
|
* * an origin and 3 independent vectors are required.
|
|
39
39
|
* * announce as above, but query with getValidatedFrame (true).
|
|
40
40
|
* * this will use the third vector to select right or left handed frame.
|
|
@@ -49,11 +49,18 @@ class FrameBuilder {
|
|
|
49
49
|
}
|
|
50
50
|
return false;
|
|
51
51
|
}
|
|
52
|
-
/**
|
|
53
|
-
clear() {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
52
|
+
/** Clear all accumulated point and vector data */
|
|
53
|
+
clear() {
|
|
54
|
+
this._origin = undefined;
|
|
55
|
+
this._vector0 = undefined;
|
|
56
|
+
this._vector1 = undefined;
|
|
57
|
+
this._vector2 = undefined;
|
|
58
|
+
}
|
|
59
|
+
constructor() {
|
|
60
|
+
this.clear();
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Try to assemble the data into a non-singular transform.
|
|
57
64
|
* * If allowLeftHanded is false, vector0 and vector1 determine a right handed coordinate system.
|
|
58
65
|
* * if allowLeftHanded is true, the z vector of the right handed system can be flipped to agree with vector2 direction.
|
|
59
66
|
*/
|
|
@@ -88,8 +95,11 @@ class FrameBuilder {
|
|
|
88
95
|
}
|
|
89
96
|
}
|
|
90
97
|
/** Ask if there is a defined origin for the evolving frame */
|
|
91
|
-
get hasOrigin() {
|
|
92
|
-
|
|
98
|
+
get hasOrigin() {
|
|
99
|
+
return this._origin !== undefined;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Return the number of vectors saved. Because the save process checks numerics, this should be the rank of the system.
|
|
93
103
|
*/
|
|
94
104
|
savedVectorCount() {
|
|
95
105
|
if (!this._vector0)
|
|
@@ -100,7 +110,9 @@ class FrameBuilder {
|
|
|
100
110
|
return 2;
|
|
101
111
|
return 3;
|
|
102
112
|
}
|
|
103
|
-
/**
|
|
113
|
+
/**
|
|
114
|
+
* Announce a new point. If this point is different from the origin, also compute and announce the vector from the origin.
|
|
115
|
+
*/
|
|
104
116
|
announcePoint(point) {
|
|
105
117
|
if (!this._origin) {
|
|
106
118
|
this._origin = point.clone();
|
|
@@ -111,7 +123,7 @@ class FrameBuilder {
|
|
|
111
123
|
return this.savedVectorCount();
|
|
112
124
|
return this.announceVector(this._origin.vectorTo(point));
|
|
113
125
|
}
|
|
114
|
-
/**
|
|
126
|
+
/** Announce a new vector. */
|
|
115
127
|
announceVector(vector) {
|
|
116
128
|
if (vector.isAlmostZero)
|
|
117
129
|
return this.savedVectorCount();
|
|
@@ -138,8 +150,9 @@ class FrameBuilder {
|
|
|
138
150
|
// fall through if prior vectors are all there -- no need for the new one.
|
|
139
151
|
return 3;
|
|
140
152
|
}
|
|
141
|
-
/**
|
|
142
|
-
*
|
|
153
|
+
/**
|
|
154
|
+
* Inspect the content of the data. Announce points and vectors. Return when savedVectorCount becomes sufficient
|
|
155
|
+
* for a coordinate system.
|
|
143
156
|
*/
|
|
144
157
|
announce(data) {
|
|
145
158
|
if (this.savedVectorCount() > 1)
|
|
@@ -220,11 +233,11 @@ class FrameBuilder {
|
|
|
220
233
|
}
|
|
221
234
|
}
|
|
222
235
|
}
|
|
223
|
-
/**
|
|
224
|
-
*
|
|
225
|
-
* *
|
|
226
|
-
* *
|
|
227
|
-
* *
|
|
236
|
+
/**
|
|
237
|
+
* Create a localToWorld frame for the given data.
|
|
238
|
+
* * origin is at first point.
|
|
239
|
+
* * x axis in direction of first nonzero vector present or implied by the input.
|
|
240
|
+
* * y axis is perpendicular to x and contains (in positive side) the next vector present or implied by the input.
|
|
228
241
|
*/
|
|
229
242
|
static createRightHandedFrame(defaultUpVector, ...params) {
|
|
230
243
|
const builder = new FrameBuilder();
|
|
@@ -259,10 +272,11 @@ class FrameBuilder {
|
|
|
259
272
|
}
|
|
260
273
|
return undefined;
|
|
261
274
|
}
|
|
262
|
-
/**
|
|
275
|
+
/**
|
|
276
|
+
* Create a transform containing points or vectors in the given data.
|
|
263
277
|
* * The xy columns of the transform contain the first points or vectors of the data.
|
|
264
278
|
* * The z column is perpendicular to that xy plane.
|
|
265
|
-
* * The calculation favors the first points found.
|
|
279
|
+
* * The calculation favors the first points found. It does not try to get a "best" plane.
|
|
266
280
|
*/
|
|
267
281
|
static createRightHandedLocalToWorld(...params) {
|
|
268
282
|
const builder = new FrameBuilder();
|
|
@@ -275,10 +289,9 @@ class FrameBuilder {
|
|
|
275
289
|
return undefined;
|
|
276
290
|
}
|
|
277
291
|
/**
|
|
278
|
-
*
|
|
279
|
-
*
|
|
280
|
-
*
|
|
281
|
-
* point most distant from that line.
|
|
292
|
+
* Try to create a frame whose xy plane is through points.
|
|
293
|
+
* * If 3 or more distinct points are present, the x axis is from the first point to the most distant, and y
|
|
294
|
+
* direction is toward the point most distant from that line.
|
|
282
295
|
* @param points array of points
|
|
283
296
|
*/
|
|
284
297
|
static createFrameToDistantPoints(points) {
|
|
@@ -295,10 +308,10 @@ class FrameBuilder {
|
|
|
295
308
|
return undefined;
|
|
296
309
|
}
|
|
297
310
|
/**
|
|
298
|
-
*
|
|
311
|
+
* Try to create a frame whose xy plane is through points, with the points appearing CCW in the local frame.
|
|
299
312
|
*
|
|
300
|
-
* *
|
|
301
|
-
* point most distant from that line.
|
|
313
|
+
* * If 3 or more distinct points are present, the x axis is from the first point to the most distant, and y
|
|
314
|
+
* direction is toward the point most distant from that line.
|
|
302
315
|
* @param points array of points
|
|
303
316
|
*/
|
|
304
317
|
static createFrameWithCCWPolygon(points) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FrameBuilder.js","sourceRoot":"","sources":["../../../src/geometry3d/FrameBuilder.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\r\n// import { Point2d } from \"./Geometry2d\";\r\nimport { BSplineCurve3d } from \"../bspline/BSplineCurve\";\r\nimport { InterpolationCurve3d } from \"../bspline/InterpolationCurve3d\";\r\nimport { Arc3d } from \"../curve/Arc3d\";\r\nimport { CurveCollection } from \"../curve/CurveCollection\";\r\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\r\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\n/* eslint-disable @typescript-eslint/naming-convention, no-empty */\r\nimport { AxisOrder, AxisScaleSelect, Geometry } from \"../Geometry\";\r\nimport { GrowableXYZArray } from \"./GrowableXYZArray\";\r\nimport { Matrix3d } from \"./Matrix3d\";\r\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\r\nimport { Point3dArray } from \"./PointHelpers\";\r\nimport { PolygonOps } from \"./PolygonOps\";\r\nimport { Range3d } from \"./Range\";\r\nimport { Transform } from \"./Transform\";\r\n\r\n/**\r\n * Helper class to accumulate points and vectors until there is enough data to define a coordinate system.\r\n *\r\n * * For the common case of building a right handed frame:\r\n * * create the FrameBuilder and make calls to announcePoint and announceVector.\r\n * * the frame will be fully determined by an origin and two vectors.\r\n * * the first call to announcePoint will set the origin.\r\n * * additional calls to announcePoint will produce announceVector call with the vector from the origin.\r\n * * After each announcement, call getValidatedFrame(false)\r\n * * getValidatedFrame will succeed when it has two independent vectors.\r\n * * to build a left handed frame,\r\n * * an origin and 3 independent vectors are required.\r\n * * announce as above, but query with getValidatedFrame (true).\r\n * * this will use the third vector to select right or left handed frame.\r\n * @public\r\n */\r\nexport class FrameBuilder {\r\n private _origin: undefined | Point3d;\r\n private _vector0: undefined | Vector3d;\r\n private _vector1: undefined | Vector3d;\r\n private _vector2: undefined | Vector3d;\r\n // test if both vectors are defined and have significant angle between.\r\n private areStronglyIndependentVectors(vector0: Vector3d, vector1: Vector3d, radiansTolerance: number = Geometry.smallAngleRadians): boolean {\r\n if (vector0 !== undefined && vector1 !== undefined) {\r\n const q = vector0.smallerUnorientedRadiansTo(vector1);\r\n return q > radiansTolerance;\r\n }\r\n return false;\r\n }\r\n /** clear all accumulated point and vector data */\r\n public clear() { this._origin = undefined; this._vector0 = undefined; this._vector1 = undefined; this._vector2 = undefined; }\r\n constructor() { this.clear(); }\r\n /** Try to assemble the data into a non-singular transform.\r\n *\r\n * * If allowLeftHanded is false, vector0 and vector1 determine a right handed coordinate system.\r\n * * if allowLeftHanded is true, the z vector of the right handed system can be flipped to agree with vector2 direction.\r\n */\r\n public getValidatedFrame(allowLeftHanded: boolean = false): Transform | undefined {\r\n if (this._origin && this._vector0 && this._vector1) {\r\n if (!allowLeftHanded) {\r\n const matrix = Matrix3d.createRigidFromColumns(this._vector0, this._vector1, AxisOrder.XYZ);\r\n if (matrix)\r\n return Transform.createOriginAndMatrix(this._origin, matrix);\r\n // uh oh -- vector1 was not really independent. clear everything after vector0.\r\n this._vector1 = this._vector2 = undefined;\r\n } else if (this._vector2) {\r\n const matrix = Matrix3d.createRigidFromColumns(this._vector0, this._vector1, AxisOrder.XYZ);\r\n if (matrix) {\r\n if (this._vector0.tripleProduct(this._vector1, this._vector2) < 0)\r\n matrix.scaleColumns(1.0, 1.0, -1.0);\r\n return Transform.createOriginAndMatrix(this._origin, matrix);\r\n }\r\n // uh oh again -- clear vector1 and vector2, re-announce vector2 as possible vector1??\r\n const vector2 = this._vector2;\r\n this._vector1 = this._vector2 = undefined;\r\n this.announceVector(vector2);\r\n }\r\n }\r\n return undefined;\r\n }\r\n /** If vector0 is known but vector1 is not, make vector1 the cross of the up-vector and vector0 */\r\n public applyDefaultUpVector(vector?: Vector3d) {\r\n if (vector && this._vector0 && !this._vector1 && !vector.isParallelTo(this._vector0)) {\r\n this._vector1 = vector.crossProduct(this._vector0);\r\n }\r\n }\r\n /** Ask if there is a defined origin for the evolving frame */\r\n public get hasOrigin(): boolean { return this._origin !== undefined; }\r\n /** Return the number of vectors saved. Because the save process checks numerics, this should be the rank of the system.\r\n */\r\n public savedVectorCount(): number {\r\n if (!this._vector0)\r\n return 0;\r\n if (!this._vector1)\r\n return 1;\r\n if (!this._vector2)\r\n return 2;\r\n return 3;\r\n }\r\n /** announce a new point. If this point is different from the origin, also compute and announce the vector from the origin.*/\r\n public announcePoint(point: Point3d): number {\r\n if (!this._origin) {\r\n this._origin = point.clone();\r\n return this.savedVectorCount();\r\n }\r\n // the new point may provide an additional vector\r\n if (this._origin.isAlmostEqual(point))\r\n return this.savedVectorCount();\r\n return this.announceVector(this._origin.vectorTo(point));\r\n }\r\n /** announce a new vector. */\r\n public announceVector(vector: Vector3d): number {\r\n if (vector.isAlmostZero)\r\n return this.savedVectorCount();\r\n\r\n if (!this._vector0) { this._vector0 = vector.clone(this._vector0); return 1; }\r\n\r\n if (!this._vector1) {\r\n if (this.areStronglyIndependentVectors(vector, this._vector0, 1.0e-5)) {\r\n this._vector1 = vector.clone(this._vector1);\r\n return 2;\r\n }\r\n return 1;\r\n }\r\n\r\n // vector0 and vector1 are independent.\r\n if (!this._vector2) {\r\n const unitPerpendicular = this._vector0.unitCrossProduct(this._vector1);\r\n if (unitPerpendicular && !Geometry.isSameCoordinate(0, unitPerpendicular.dotProduct(vector))) {\r\n this._vector2 = vector.clone(this._vector2);\r\n return 3;\r\n }\r\n return 2;\r\n }\r\n // fall through if prior vectors are all there -- no need for the new one.\r\n return 3;\r\n }\r\n /** Inspect the content of the data. Announce points and vectors. Return when savedVectorCount becomes\r\n * sufficient for a coordinate system.\r\n */\r\n public announce(data: any) {\r\n if (this.savedVectorCount() > 1) return;\r\n if (data instanceof Point3d)\r\n this.announcePoint(data);\r\n else if (data instanceof Vector3d)\r\n this.announceVector(data);\r\n else if (Array.isArray(data)) {\r\n for (const child of data) {\r\n if (this.savedVectorCount() > 1)\r\n break;\r\n this.announce(child);\r\n }\r\n } else if (data instanceof CurvePrimitive) {\r\n if (data instanceof LineSegment3d) {\r\n this.announcePoint(data.startPoint());\r\n this.announcePoint(data.endPoint());\r\n } else if (data instanceof Arc3d) {\r\n const ray = data.fractionToPointAndDerivative(0.0);\r\n this.announcePoint(ray.origin);\r\n this.announceVector(ray.direction);\r\n this.announceVector(data.matrixRef.columnZCrossVector(ray.direction));\r\n } else if (data instanceof LineString3d) {\r\n for (const point of data.points) {\r\n this.announcePoint(point);\r\n if (this.savedVectorCount() > 1)\r\n break;\r\n }\r\n } else if (data instanceof BSplineCurve3d) {\r\n const point = Point3d.create();\r\n for (let i = 0; this.savedVectorCount() < 2; i++) {\r\n if (data.getPolePoint3d(i, point) instanceof Point3d)\r\n this.announcePoint(point);\r\n else break;\r\n }\r\n } else if (data instanceof InterpolationCurve3d) {\r\n const point = Point3d.create();\r\n for (let i = 0; this.savedVectorCount() < 2; i++) {\r\n if (i < data.options.fitPoints.length) {\r\n point.setFrom(data.options.fitPoints[i]);\r\n this.announcePoint(point);\r\n } else break;\r\n }\r\n } else { // unimplemented CurvePrimitive type\r\n const frame = data.fractionToFrenetFrame(0.0);\r\n if (undefined !== frame) {\r\n this.announcePoint(frame.getOrigin());\r\n this.announceVector(frame.matrix.getColumn(0));\r\n this.announceVector(frame.matrix.getColumn(1));\r\n }\r\n }\r\n } else if (data instanceof CurveCollection) {\r\n if (data.children)\r\n for (const child of data.children) {\r\n this.announce(child);\r\n if (this.savedVectorCount() > 1)\r\n break;\r\n }\r\n } else if (data instanceof GrowableXYZArray) {\r\n const point = Point3d.create();\r\n for (let i = 0; this.savedVectorCount() < 2; i++) {\r\n if (data.getPoint3dAtCheckedPointIndex(i, point) instanceof Point3d)\r\n this.announcePoint(point);\r\n else break;\r\n }\r\n }\r\n }\r\n /** create a localToWorld frame for the given data.\r\n *\r\n * * origin is at first point\r\n * * x axis in direction of first nonzero vector present or implied by the input.\r\n * * y axis is perpendicular to x and contains (in positive side) the next vector present or implied by the input.\r\n */\r\n public static createRightHandedFrame(defaultUpVector: Vector3d | undefined, ...params: any[]): Transform | undefined {\r\n const builder = new FrameBuilder();\r\n for (const data of params) {\r\n builder.announce(data);\r\n builder.applyDefaultUpVector(defaultUpVector);\r\n const result = builder.getValidatedFrame(false);\r\n if (result !== undefined) {\r\n if (defaultUpVector) {\r\n if (result.matrix.dotColumnZ(defaultUpVector) < 0.0)\r\n result.matrix.scaleColumnsInPlace(1, -1, -1);\r\n }\r\n return result;\r\n }\r\n }\r\n\r\n const evaluatePrimitiveFrame = (curve: CurvePrimitive): Transform | undefined => {\r\n return curve.fractionToFrenetFrame(0.0);\r\n };\r\n\r\n // try direct evaluation of curve primitives using the above lambda\r\n for (const data of params) {\r\n if (data instanceof CurvePrimitive) {\r\n return evaluatePrimitiveFrame(data);\r\n } else if (data instanceof CurveCollection) {\r\n const children = data.collectCurvePrimitives();\r\n for (const curve of children) {\r\n const frenetFrame = evaluatePrimitiveFrame(curve);\r\n if (frenetFrame)\r\n return frenetFrame;\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n /** create a transform containing points or vectors in the given data.\r\n * * The xy columns of the transform contain the first points or vectors of the data.\r\n * * The z column is perpendicular to that xy plane.\r\n * * The calculation favors the first points found. It does not try to get a \"best\" plane.\r\n */\r\n public static createRightHandedLocalToWorld(...params: any[]): Transform | undefined {\r\n const builder = new FrameBuilder();\r\n for (const data of params) {\r\n builder.announce(data);\r\n const localToWorld = builder.getValidatedFrame(false);\r\n if (localToWorld !== undefined)\r\n return localToWorld;\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * try to create a frame whose xy plane is through points.\r\n *\r\n * * if 3 or more distinct points are present, the x axis is from the first point to the most distance, and y direction is toward the\r\n * point most distant from that line.\r\n * @param points array of points\r\n */\r\n public static createFrameToDistantPoints(points: Point3d[]): Transform | undefined {\r\n if (points.length > 2) {\r\n const origin = points[0].clone();\r\n const vector01 = Vector3d.create();\r\n Point3dArray.indexOfMostDistantPoint(points, points[0], vector01);\r\n const vector02 = Vector3d.create();\r\n Point3dArray.indexOfPointWithMaxCrossProductMagnitude(points, origin, vector01, vector02);\r\n const matrix = Matrix3d.createRigidFromColumns(vector01, vector02, AxisOrder.XYZ);\r\n if (matrix)\r\n return Transform.createRefs(origin, matrix);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * try to create a frame whose xy plane is through points, with the points appearing CCW in the local frame.\r\n *\r\n * * if 3 or more distinct points are present, the x axis is from the first point to the most distance, and y direction is toward the\r\n * point most distant from that line.\r\n * @param points array of points\r\n */\r\n public static createFrameWithCCWPolygon(points: Point3d[]): Transform | undefined {\r\n if (points.length > 2) {\r\n const ray = PolygonOps.centroidAreaNormal(points);\r\n if (ray) {\r\n return ray.toRigidZFrame();\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Create the localToWorld transform from a range to axes of its parent coordinate system.\r\n * @param range [in] range to inspect\r\n * @param fractionX [in] fractional coordinate of frame origin x\r\n * @param fractionY [in] fractional coordinate of frame origin y\r\n * @param fractionZ [in] fractional coordinate of frame origin z\r\n * @param scaleSelect [in] selects size of localToWorld axes.\r\n * @param defaultAxisLength [in] if true and any axis length is 0, that axis vector takes this physical length.\r\n */\r\n public static createLocalToWorldTransformInRange(\r\n range: Range3d,\r\n scaleSelect: AxisScaleSelect = AxisScaleSelect.NonUniformRangeContainment,\r\n fractionX: number = 0,\r\n fractionY: number = 0,\r\n fractionZ: number = 0,\r\n defaultAxisLength: number = 1.0): Transform {\r\n if (range.isNull)\r\n return Transform.createIdentity();\r\n let a = 1.0;\r\n let b = 1.0;\r\n let c = 1.0;\r\n if (scaleSelect === AxisScaleSelect.LongestRangeDirection) {\r\n a = b = c = Geometry.correctSmallMetricDistance(range.maxLength(), defaultAxisLength);\r\n } else if (scaleSelect === AxisScaleSelect.NonUniformRangeContainment) {\r\n a = Geometry.correctSmallMetricDistance(range.xLength(), defaultAxisLength) * Geometry.maxAbsDiff(fractionX, 0, 1);\r\n b = Geometry.correctSmallMetricDistance(range.yLength(), defaultAxisLength) * Geometry.maxAbsDiff(fractionY, 0, 1);\r\n c = Geometry.correctSmallMetricDistance(range.zLength(), defaultAxisLength) * Geometry.maxAbsDiff(fractionZ, 0, 1);\r\n }\r\n return Transform.createRefs(range.fractionToPoint(fractionX, fractionY, fractionZ), Matrix3d.createScale(a, b, c));\r\n }\r\n\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"FrameBuilder.js","sourceRoot":"","sources":["../../../src/geometry3d/FrameBuilder.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\r\n// import { Point2d } from \"./Geometry2d\";\r\nimport { BSplineCurve3d } from \"../bspline/BSplineCurve\";\r\nimport { InterpolationCurve3d } from \"../bspline/InterpolationCurve3d\";\r\nimport { Arc3d } from \"../curve/Arc3d\";\r\nimport { CurveCollection } from \"../curve/CurveCollection\";\r\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\r\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\nimport { AxisOrder, AxisScaleSelect, Geometry } from \"../Geometry\";\r\nimport { GrowableXYZArray } from \"./GrowableXYZArray\";\r\nimport { Matrix3d } from \"./Matrix3d\";\r\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\r\nimport { Point3dArray } from \"./PointHelpers\";\r\nimport { PolygonOps } from \"./PolygonOps\";\r\nimport { Range3d } from \"./Range\";\r\nimport { Transform } from \"./Transform\";\r\n\r\n/* eslint-disable @typescript-eslint/naming-convention, no-empty */\r\n\r\n/**\r\n * Helper class to accumulate points and vectors until there is enough data to define a coordinate system.\r\n *\r\n * * For the common case of building a right handed frame:\r\n * * create the FrameBuilder and make calls to announcePoint and announceVector.\r\n * * the frame will be fully determined by an origin and two vectors.\r\n * * the first call to announcePoint will set the origin.\r\n * * additional calls to announcePoint will produce announceVector call with the vector from the origin.\r\n * * after each announcement, call getValidatedFrame(false)\r\n * * getValidatedFrame will succeed when it has two independent vectors.\r\n * * To build a left handed frame,\r\n * * an origin and 3 independent vectors are required.\r\n * * announce as above, but query with getValidatedFrame (true).\r\n * * this will use the third vector to select right or left handed frame.\r\n * @public\r\n */\r\nexport class FrameBuilder {\r\n private _origin: undefined | Point3d;\r\n private _vector0: undefined | Vector3d;\r\n private _vector1: undefined | Vector3d;\r\n private _vector2: undefined | Vector3d;\r\n // test if both vectors are defined and have significant angle between.\r\n private areStronglyIndependentVectors(\r\n vector0: Vector3d, vector1: Vector3d, radiansTolerance: number = Geometry.smallAngleRadians,\r\n ): boolean {\r\n if (vector0 !== undefined && vector1 !== undefined) {\r\n const q = vector0.smallerUnorientedRadiansTo(vector1);\r\n return q > radiansTolerance;\r\n }\r\n return false;\r\n }\r\n /** Clear all accumulated point and vector data */\r\n public clear() {\r\n this._origin = undefined;\r\n this._vector0 = undefined;\r\n this._vector1 = undefined;\r\n this._vector2 = undefined;\r\n }\r\n constructor() {\r\n this.clear();\r\n }\r\n /**\r\n * Try to assemble the data into a non-singular transform.\r\n * * If allowLeftHanded is false, vector0 and vector1 determine a right handed coordinate system.\r\n * * if allowLeftHanded is true, the z vector of the right handed system can be flipped to agree with vector2 direction.\r\n */\r\n public getValidatedFrame(allowLeftHanded: boolean = false): Transform | undefined {\r\n if (this._origin && this._vector0 && this._vector1) {\r\n if (!allowLeftHanded) {\r\n const matrix = Matrix3d.createRigidFromColumns(this._vector0, this._vector1, AxisOrder.XYZ);\r\n if (matrix)\r\n return Transform.createOriginAndMatrix(this._origin, matrix);\r\n // uh oh -- vector1 was not really independent. clear everything after vector0.\r\n this._vector1 = this._vector2 = undefined;\r\n } else if (this._vector2) {\r\n const matrix = Matrix3d.createRigidFromColumns(this._vector0, this._vector1, AxisOrder.XYZ);\r\n if (matrix) {\r\n if (this._vector0.tripleProduct(this._vector1, this._vector2) < 0)\r\n matrix.scaleColumns(1.0, 1.0, -1.0);\r\n return Transform.createOriginAndMatrix(this._origin, matrix);\r\n }\r\n // uh oh again -- clear vector1 and vector2, re-announce vector2 as possible vector1??\r\n const vector2 = this._vector2;\r\n this._vector1 = this._vector2 = undefined;\r\n this.announceVector(vector2);\r\n }\r\n }\r\n return undefined;\r\n }\r\n /** If vector0 is known but vector1 is not, make vector1 the cross of the up-vector and vector0 */\r\n public applyDefaultUpVector(vector?: Vector3d) {\r\n if (vector && this._vector0 && !this._vector1 && !vector.isParallelTo(this._vector0)) {\r\n this._vector1 = vector.crossProduct(this._vector0);\r\n }\r\n }\r\n /** Ask if there is a defined origin for the evolving frame */\r\n public get hasOrigin(): boolean {\r\n return this._origin !== undefined;\r\n }\r\n /**\r\n * Return the number of vectors saved. Because the save process checks numerics, this should be the rank of the system.\r\n */\r\n public savedVectorCount(): number {\r\n if (!this._vector0)\r\n return 0;\r\n if (!this._vector1)\r\n return 1;\r\n if (!this._vector2)\r\n return 2;\r\n return 3;\r\n }\r\n /**\r\n * Announce a new point. If this point is different from the origin, also compute and announce the vector from the origin.\r\n */\r\n public announcePoint(point: Point3d): number {\r\n if (!this._origin) {\r\n this._origin = point.clone();\r\n return this.savedVectorCount();\r\n }\r\n // the new point may provide an additional vector\r\n if (this._origin.isAlmostEqual(point))\r\n return this.savedVectorCount();\r\n return this.announceVector(this._origin.vectorTo(point));\r\n }\r\n /** Announce a new vector. */\r\n public announceVector(vector: Vector3d): number {\r\n if (vector.isAlmostZero)\r\n return this.savedVectorCount();\r\n if (!this._vector0) {\r\n this._vector0 = vector.clone(this._vector0);\r\n return 1;\r\n }\r\n if (!this._vector1) {\r\n if (this.areStronglyIndependentVectors(vector, this._vector0, 1.0e-5)) {\r\n this._vector1 = vector.clone(this._vector1);\r\n return 2;\r\n }\r\n return 1;\r\n }\r\n // vector0 and vector1 are independent.\r\n if (!this._vector2) {\r\n const unitPerpendicular = this._vector0.unitCrossProduct(this._vector1);\r\n if (unitPerpendicular && !Geometry.isSameCoordinate(0, unitPerpendicular.dotProduct(vector))) {\r\n this._vector2 = vector.clone(this._vector2);\r\n return 3;\r\n }\r\n return 2;\r\n }\r\n // fall through if prior vectors are all there -- no need for the new one.\r\n return 3;\r\n }\r\n /**\r\n * Inspect the content of the data. Announce points and vectors. Return when savedVectorCount becomes sufficient\r\n * for a coordinate system.\r\n */\r\n public announce(data: any) {\r\n if (this.savedVectorCount() > 1) return;\r\n if (data instanceof Point3d)\r\n this.announcePoint(data);\r\n else if (data instanceof Vector3d)\r\n this.announceVector(data);\r\n else if (Array.isArray(data)) {\r\n for (const child of data) {\r\n if (this.savedVectorCount() > 1)\r\n break;\r\n this.announce(child);\r\n }\r\n } else if (data instanceof CurvePrimitive) {\r\n if (data instanceof LineSegment3d) {\r\n this.announcePoint(data.startPoint());\r\n this.announcePoint(data.endPoint());\r\n } else if (data instanceof Arc3d) {\r\n const ray = data.fractionToPointAndDerivative(0.0);\r\n this.announcePoint(ray.origin);\r\n this.announceVector(ray.direction);\r\n this.announceVector(data.matrixRef.columnZCrossVector(ray.direction));\r\n } else if (data instanceof LineString3d) {\r\n for (const point of data.points) {\r\n this.announcePoint(point);\r\n if (this.savedVectorCount() > 1)\r\n break;\r\n }\r\n } else if (data instanceof BSplineCurve3d) {\r\n const point = Point3d.create();\r\n for (let i = 0; this.savedVectorCount() < 2; i++) {\r\n if (data.getPolePoint3d(i, point) instanceof Point3d)\r\n this.announcePoint(point);\r\n else break;\r\n }\r\n } else if (data instanceof InterpolationCurve3d) {\r\n const point = Point3d.create();\r\n for (let i = 0; this.savedVectorCount() < 2; i++) {\r\n if (i < data.options.fitPoints.length) {\r\n point.setFrom(data.options.fitPoints[i]);\r\n this.announcePoint(point);\r\n } else break;\r\n }\r\n } else { // unimplemented CurvePrimitive type\r\n const frame = data.fractionToFrenetFrame(0.0);\r\n if (undefined !== frame) {\r\n this.announcePoint(frame.getOrigin());\r\n this.announceVector(frame.matrix.getColumn(0));\r\n this.announceVector(frame.matrix.getColumn(1));\r\n }\r\n }\r\n } else if (data instanceof CurveCollection) {\r\n if (data.children)\r\n for (const child of data.children) {\r\n this.announce(child);\r\n if (this.savedVectorCount() > 1)\r\n break;\r\n }\r\n } else if (data instanceof GrowableXYZArray) {\r\n const point = Point3d.create();\r\n for (let i = 0; this.savedVectorCount() < 2; i++) {\r\n if (data.getPoint3dAtCheckedPointIndex(i, point) instanceof Point3d)\r\n this.announcePoint(point);\r\n else break;\r\n }\r\n }\r\n }\r\n /**\r\n * Create a localToWorld frame for the given data.\r\n * * origin is at first point.\r\n * * x axis in direction of first nonzero vector present or implied by the input.\r\n * * y axis is perpendicular to x and contains (in positive side) the next vector present or implied by the input.\r\n */\r\n public static createRightHandedFrame(defaultUpVector: Vector3d | undefined, ...params: any[]): Transform | undefined {\r\n const builder = new FrameBuilder();\r\n for (const data of params) {\r\n builder.announce(data);\r\n builder.applyDefaultUpVector(defaultUpVector);\r\n const result = builder.getValidatedFrame(false);\r\n if (result !== undefined) {\r\n if (defaultUpVector) {\r\n if (result.matrix.dotColumnZ(defaultUpVector) < 0.0)\r\n result.matrix.scaleColumnsInPlace(1, -1, -1);\r\n }\r\n return result;\r\n }\r\n }\r\n const evaluatePrimitiveFrame = (curve: CurvePrimitive): Transform | undefined => {\r\n return curve.fractionToFrenetFrame(0.0);\r\n };\r\n // try direct evaluation of curve primitives using the above lambda\r\n for (const data of params) {\r\n if (data instanceof CurvePrimitive) {\r\n return evaluatePrimitiveFrame(data);\r\n } else if (data instanceof CurveCollection) {\r\n const children = data.collectCurvePrimitives();\r\n for (const curve of children) {\r\n const frenetFrame = evaluatePrimitiveFrame(curve);\r\n if (frenetFrame)\r\n return frenetFrame;\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Create a transform containing points or vectors in the given data.\r\n * * The xy columns of the transform contain the first points or vectors of the data.\r\n * * The z column is perpendicular to that xy plane.\r\n * * The calculation favors the first points found. It does not try to get a \"best\" plane.\r\n */\r\n public static createRightHandedLocalToWorld(...params: any[]): Transform | undefined {\r\n const builder = new FrameBuilder();\r\n for (const data of params) {\r\n builder.announce(data);\r\n const localToWorld = builder.getValidatedFrame(false);\r\n if (localToWorld !== undefined)\r\n return localToWorld;\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Try to create a frame whose xy plane is through points.\r\n * * If 3 or more distinct points are present, the x axis is from the first point to the most distant, and y\r\n * direction is toward the point most distant from that line.\r\n * @param points array of points\r\n */\r\n public static createFrameToDistantPoints(points: Point3d[]): Transform | undefined {\r\n if (points.length > 2) {\r\n const origin = points[0].clone();\r\n const vector01 = Vector3d.create();\r\n Point3dArray.indexOfMostDistantPoint(points, points[0], vector01);\r\n const vector02 = Vector3d.create();\r\n Point3dArray.indexOfPointWithMaxCrossProductMagnitude(points, origin, vector01, vector02);\r\n const matrix = Matrix3d.createRigidFromColumns(vector01, vector02, AxisOrder.XYZ);\r\n if (matrix)\r\n return Transform.createRefs(origin, matrix);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Try to create a frame whose xy plane is through points, with the points appearing CCW in the local frame.\r\n *\r\n * * If 3 or more distinct points are present, the x axis is from the first point to the most distant, and y\r\n * direction is toward the point most distant from that line.\r\n * @param points array of points\r\n */\r\n public static createFrameWithCCWPolygon(points: Point3d[]): Transform | undefined {\r\n if (points.length > 2) {\r\n const ray = PolygonOps.centroidAreaNormal(points);\r\n if (ray) {\r\n return ray.toRigidZFrame();\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Create the localToWorld transform from a range to axes of its parent coordinate system.\r\n * @param range [in] range to inspect\r\n * @param fractionX [in] fractional coordinate of frame origin x\r\n * @param fractionY [in] fractional coordinate of frame origin y\r\n * @param fractionZ [in] fractional coordinate of frame origin z\r\n * @param scaleSelect [in] selects size of localToWorld axes.\r\n * @param defaultAxisLength [in] if true and any axis length is 0, that axis vector takes this physical length.\r\n */\r\n public static createLocalToWorldTransformInRange(\r\n range: Range3d,\r\n scaleSelect: AxisScaleSelect = AxisScaleSelect.NonUniformRangeContainment,\r\n fractionX: number = 0,\r\n fractionY: number = 0,\r\n fractionZ: number = 0,\r\n defaultAxisLength: number = 1.0): Transform {\r\n if (range.isNull)\r\n return Transform.createIdentity();\r\n let a = 1.0;\r\n let b = 1.0;\r\n let c = 1.0;\r\n if (scaleSelect === AxisScaleSelect.LongestRangeDirection) {\r\n a = b = c = Geometry.correctSmallMetricDistance(range.maxLength(), defaultAxisLength);\r\n } else if (scaleSelect === AxisScaleSelect.NonUniformRangeContainment) {\r\n a = Geometry.correctSmallMetricDistance(range.xLength(), defaultAxisLength) * Geometry.maxAbsDiff(fractionX, 0, 1);\r\n b = Geometry.correctSmallMetricDistance(range.yLength(), defaultAxisLength) * Geometry.maxAbsDiff(fractionY, 0, 1);\r\n c = Geometry.correctSmallMetricDistance(range.zLength(), defaultAxisLength) * Geometry.maxAbsDiff(fractionZ, 0, 1);\r\n }\r\n return Transform.createRefs(range.fractionToPoint(fractionX, fractionY, fractionZ), Matrix3d.createScale(a, b, c));\r\n }\r\n}\r\n"]}
|
|
@@ -66,13 +66,21 @@ export declare class GrowableXYArray extends IndexedXYCollection {
|
|
|
66
66
|
*/
|
|
67
67
|
clone(): GrowableXYArray;
|
|
68
68
|
/** Create an array populated from
|
|
69
|
-
*
|
|
70
|
-
* *
|
|
71
|
-
* *
|
|
72
|
-
* *
|
|
69
|
+
* Valid inputs are:
|
|
70
|
+
* * Point2d
|
|
71
|
+
* * Point3d
|
|
72
|
+
* * An array of 2 doubles
|
|
73
|
+
* * An array of 3 doubles
|
|
74
|
+
* * A GrowableXYZArray
|
|
75
|
+
* * A GrowableXYArray
|
|
76
|
+
* * Any json object satisfying Point3d.isXAndY
|
|
77
|
+
* * A Float64Array of doubles, interpreted as xyxy
|
|
78
|
+
* * An array of any of the above
|
|
79
|
+
*/
|
|
80
|
+
static create(data: any, result?: GrowableXYArray): GrowableXYArray;
|
|
81
|
+
/** Restructure MultiLineStringDataVariant as array of GrowableXYZArray
|
|
82
|
+
* @deprecated in 4.x. Moved to GrowableXYZArray class.
|
|
73
83
|
*/
|
|
74
|
-
static create(data: XAndY[] | GrowableXYZArray): GrowableXYArray;
|
|
75
|
-
/** Restructure MultiLineStringDataVariant as array of GrowableXYZArray */
|
|
76
84
|
static createArrayOfGrowableXYZArray(data: MultiLineStringDataVariant): GrowableXYZArray[] | undefined;
|
|
77
85
|
/** push a point to the end of the array */
|
|
78
86
|
push(toPush: XAndY): void;
|
|
@@ -80,6 +88,18 @@ export declare class GrowableXYArray extends IndexedXYCollection {
|
|
|
80
88
|
pushAll(points: XAndY[]): void;
|
|
81
89
|
/** push all points of an array */
|
|
82
90
|
pushAllXYAndZ(points: XYAndZ[] | GrowableXYZArray): void;
|
|
91
|
+
/** Push points from variant sources.
|
|
92
|
+
* Valid inputs are:
|
|
93
|
+
* * Point2d
|
|
94
|
+
* * Point3d
|
|
95
|
+
* * An array of 2 doubles
|
|
96
|
+
* * A GrowableXYArray
|
|
97
|
+
* * A GrowableXYZArray
|
|
98
|
+
* * Any json object satisfying Point3d.isXAndY
|
|
99
|
+
* * A Float64Array of doubles, interpreted as xyxy
|
|
100
|
+
* * An array of any of the above
|
|
101
|
+
*/
|
|
102
|
+
pushFrom(p: any): void;
|
|
83
103
|
/**
|
|
84
104
|
* Replicate numWrap xy values from the front of the array as new values at the end.
|
|
85
105
|
* @param numWrap number of xy values to replicate
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GrowableXYArray.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/GrowableXYArray.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"GrowableXYArray.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/GrowableXYArray.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,7 +13,6 @@ const GrowableXYZArray_1 = require("./GrowableXYZArray");
|
|
|
13
13
|
const IndexedXYCollection_1 = require("./IndexedXYCollection");
|
|
14
14
|
const Point2dVector2d_1 = require("./Point2dVector2d");
|
|
15
15
|
const Point3dVector3d_1 = require("./Point3dVector3d");
|
|
16
|
-
const PointStreaming_1 = require("./PointStreaming");
|
|
17
16
|
/** `GrowableXYArray` manages a (possibly growing) Float64Array to pack xy coordinates.
|
|
18
17
|
* @public
|
|
19
18
|
*/
|
|
@@ -108,26 +107,33 @@ class GrowableXYArray extends IndexedXYCollection_1.IndexedXYCollection {
|
|
|
108
107
|
return newPoints;
|
|
109
108
|
}
|
|
110
109
|
/** Create an array populated from
|
|
111
|
-
*
|
|
112
|
-
* *
|
|
113
|
-
* *
|
|
114
|
-
* *
|
|
110
|
+
* Valid inputs are:
|
|
111
|
+
* * Point2d
|
|
112
|
+
* * Point3d
|
|
113
|
+
* * An array of 2 doubles
|
|
114
|
+
* * An array of 3 doubles
|
|
115
|
+
* * A GrowableXYZArray
|
|
116
|
+
* * A GrowableXYArray
|
|
117
|
+
* * Any json object satisfying Point3d.isXAndY
|
|
118
|
+
* * A Float64Array of doubles, interpreted as xyxy
|
|
119
|
+
* * An array of any of the above
|
|
115
120
|
*/
|
|
116
|
-
static create(data) {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
newPoints.pushAllXYAndZ(data);
|
|
121
|
+
static create(data, result) {
|
|
122
|
+
if (result) {
|
|
123
|
+
result.clear();
|
|
120
124
|
}
|
|
121
125
|
else {
|
|
122
|
-
|
|
126
|
+
const pointCount = typeof data[0] === "number" ? data.length / 2 : data.length;
|
|
127
|
+
result = new GrowableXYArray(pointCount);
|
|
123
128
|
}
|
|
124
|
-
|
|
129
|
+
result.pushFrom(data);
|
|
130
|
+
return result;
|
|
125
131
|
}
|
|
126
|
-
/** Restructure MultiLineStringDataVariant as array of GrowableXYZArray
|
|
132
|
+
/** Restructure MultiLineStringDataVariant as array of GrowableXYZArray
|
|
133
|
+
* @deprecated in 4.x. Moved to GrowableXYZArray class.
|
|
134
|
+
*/
|
|
127
135
|
static createArrayOfGrowableXYZArray(data) {
|
|
128
|
-
|
|
129
|
-
PointStreaming_1.VariantPointDataStream.streamXYZ(data, collector);
|
|
130
|
-
return collector.claimArrayOfGrowableXYZArray();
|
|
136
|
+
return GrowableXYZArray_1.GrowableXYZArray.createArrayOfGrowableXYZArray(data);
|
|
131
137
|
}
|
|
132
138
|
/** push a point to the end of the array */
|
|
133
139
|
push(toPush) {
|
|
@@ -153,6 +159,51 @@ class GrowableXYArray extends IndexedXYCollection_1.IndexedXYCollection {
|
|
|
153
159
|
this.pushXY(p.x, p.y);
|
|
154
160
|
}
|
|
155
161
|
}
|
|
162
|
+
/** Push points from variant sources.
|
|
163
|
+
* Valid inputs are:
|
|
164
|
+
* * Point2d
|
|
165
|
+
* * Point3d
|
|
166
|
+
* * An array of 2 doubles
|
|
167
|
+
* * A GrowableXYArray
|
|
168
|
+
* * A GrowableXYZArray
|
|
169
|
+
* * Any json object satisfying Point3d.isXAndY
|
|
170
|
+
* * A Float64Array of doubles, interpreted as xyxy
|
|
171
|
+
* * An array of any of the above
|
|
172
|
+
*/
|
|
173
|
+
pushFrom(p) {
|
|
174
|
+
if (p instanceof Point3dVector3d_1.Point3d) {
|
|
175
|
+
this.pushXY(p.x, p.y);
|
|
176
|
+
}
|
|
177
|
+
else if (p instanceof GrowableXYZArray_1.GrowableXYZArray) {
|
|
178
|
+
this.pushAllXYAndZ(p);
|
|
179
|
+
}
|
|
180
|
+
else if (p instanceof Point2dVector2d_1.Point2d) {
|
|
181
|
+
this.pushXY(p.x, p.y);
|
|
182
|
+
}
|
|
183
|
+
else if (Geometry_1.Geometry.isNumberArray(p, 3) || p instanceof Float64Array) {
|
|
184
|
+
const xyToAdd = Math.trunc(p.length / 2);
|
|
185
|
+
this.ensureCapacity(this._xyInUse + xyToAdd, false);
|
|
186
|
+
this.copyData(p, xyToAdd, this._xyInUse);
|
|
187
|
+
this._xyInUse += xyToAdd;
|
|
188
|
+
}
|
|
189
|
+
else if (Geometry_1.Geometry.isNumberArray(p, 2)) {
|
|
190
|
+
this.pushXY(p[0], p[1]);
|
|
191
|
+
}
|
|
192
|
+
else if (Array.isArray(p)) {
|
|
193
|
+
// direct recursion re-wraps p and goes infinite. Unroll here.
|
|
194
|
+
for (const q of p)
|
|
195
|
+
this.pushFrom(q);
|
|
196
|
+
}
|
|
197
|
+
else if (Point3dVector3d_1.Point3d.isXAndY(p)) {
|
|
198
|
+
this.pushXY(p.x, p.y);
|
|
199
|
+
}
|
|
200
|
+
else if (p instanceof IndexedXYCollection_1.IndexedXYCollection) {
|
|
201
|
+
const n = p.length;
|
|
202
|
+
this.ensureCapacity(this._xyInUse + n, false);
|
|
203
|
+
for (let i = 0; i < n; i++)
|
|
204
|
+
this.pushXY(p.getXAtUncheckedPointIndex(i), p.getYAtUncheckedPointIndex(i));
|
|
205
|
+
}
|
|
206
|
+
}
|
|
156
207
|
/**
|
|
157
208
|
* Replicate numWrap xy values from the front of the array as new values at the end.
|
|
158
209
|
* @param numWrap number of xy values to replicate
|