@itwin/core-geometry 4.2.0-dev.1 → 4.2.0-dev.11

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.
Files changed (126) hide show
  1. package/CHANGELOG.md +34 -1
  2. package/lib/cjs/clipping/ClipPlane.d.ts +10 -7
  3. package/lib/cjs/clipping/ClipPlane.d.ts.map +1 -1
  4. package/lib/cjs/clipping/ClipPlane.js +5 -3
  5. package/lib/cjs/clipping/ClipPlane.js.map +1 -1
  6. package/lib/cjs/clipping/ClipUtils.d.ts +16 -4
  7. package/lib/cjs/clipping/ClipUtils.d.ts.map +1 -1
  8. package/lib/cjs/clipping/ClipUtils.js +77 -2
  9. package/lib/cjs/clipping/ClipUtils.js.map +1 -1
  10. package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts +3 -2
  11. package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  12. package/lib/cjs/clipping/ConvexClipPlaneSet.js +3 -2
  13. package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
  14. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.d.ts +2 -2
  15. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js +2 -2
  16. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  17. package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
  18. package/lib/cjs/curve/Arc3d.js.map +1 -1
  19. package/lib/cjs/curve/CoordinateXYZ.d.ts +15 -15
  20. package/lib/cjs/curve/CoordinateXYZ.d.ts.map +1 -1
  21. package/lib/cjs/curve/CoordinateXYZ.js +15 -15
  22. package/lib/cjs/curve/CoordinateXYZ.js.map +1 -1
  23. package/lib/cjs/curve/CurveChain.d.ts +4 -2
  24. package/lib/cjs/curve/CurveChain.d.ts.map +1 -1
  25. package/lib/cjs/curve/CurveChain.js.map +1 -1
  26. package/lib/cjs/curve/CurveCollection.d.ts +1 -1
  27. package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
  28. package/lib/cjs/curve/CurveCollection.js +1 -1
  29. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  30. package/lib/cjs/curve/CurveCurveCloseApproachXY.d.ts +18 -7
  31. package/lib/cjs/curve/CurveCurveCloseApproachXY.d.ts.map +1 -1
  32. package/lib/cjs/curve/CurveCurveCloseApproachXY.js +17 -5
  33. package/lib/cjs/curve/CurveCurveCloseApproachXY.js.map +1 -1
  34. package/lib/cjs/curve/CurveCurveIntersectXY.d.ts +2 -2
  35. package/lib/cjs/curve/CurveCurveIntersectXY.d.ts.map +1 -1
  36. package/lib/cjs/curve/CurveCurveIntersectXY.js +12 -10
  37. package/lib/cjs/curve/CurveCurveIntersectXY.js.map +1 -1
  38. package/lib/cjs/curve/Loop.d.ts +1 -2
  39. package/lib/cjs/curve/Loop.d.ts.map +1 -1
  40. package/lib/cjs/curve/Loop.js.map +1 -1
  41. package/lib/cjs/curve/ParityRegion.js.map +1 -1
  42. package/lib/cjs/curve/Path.d.ts +2 -3
  43. package/lib/cjs/curve/Path.d.ts.map +1 -1
  44. package/lib/cjs/curve/Path.js +1 -1
  45. package/lib/cjs/curve/Path.js.map +1 -1
  46. package/lib/cjs/curve/UnionRegion.js +1 -1
  47. package/lib/cjs/curve/UnionRegion.js.map +1 -1
  48. package/lib/cjs/geometry3d/FrameBuilder.d.ts +29 -25
  49. package/lib/cjs/geometry3d/FrameBuilder.d.ts.map +1 -1
  50. package/lib/cjs/geometry3d/FrameBuilder.js +42 -29
  51. package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
  52. package/lib/cjs/geometry3d/GrowableXYArray.d.ts +26 -6
  53. package/lib/cjs/geometry3d/GrowableXYArray.d.ts.map +1 -1
  54. package/lib/cjs/geometry3d/GrowableXYArray.js +66 -15
  55. package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
  56. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts +5 -2
  57. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  58. package/lib/cjs/geometry3d/GrowableXYZArray.js +10 -3
  59. package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
  60. package/lib/cjs/polyface/PolyfaceBuilder.d.ts +9 -5
  61. package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
  62. package/lib/cjs/polyface/PolyfaceBuilder.js +9 -5
  63. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  64. package/lib/esm/clipping/ClipPlane.d.ts +10 -7
  65. package/lib/esm/clipping/ClipPlane.d.ts.map +1 -1
  66. package/lib/esm/clipping/ClipPlane.js +5 -3
  67. package/lib/esm/clipping/ClipPlane.js.map +1 -1
  68. package/lib/esm/clipping/ClipUtils.d.ts +16 -4
  69. package/lib/esm/clipping/ClipUtils.d.ts.map +1 -1
  70. package/lib/esm/clipping/ClipUtils.js +77 -2
  71. package/lib/esm/clipping/ClipUtils.js.map +1 -1
  72. package/lib/esm/clipping/ConvexClipPlaneSet.d.ts +3 -2
  73. package/lib/esm/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  74. package/lib/esm/clipping/ConvexClipPlaneSet.js +3 -2
  75. package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
  76. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.d.ts +2 -2
  77. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js +2 -2
  78. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  79. package/lib/esm/curve/Arc3d.d.ts.map +1 -1
  80. package/lib/esm/curve/Arc3d.js.map +1 -1
  81. package/lib/esm/curve/CoordinateXYZ.d.ts +15 -15
  82. package/lib/esm/curve/CoordinateXYZ.d.ts.map +1 -1
  83. package/lib/esm/curve/CoordinateXYZ.js +15 -15
  84. package/lib/esm/curve/CoordinateXYZ.js.map +1 -1
  85. package/lib/esm/curve/CurveChain.d.ts +4 -2
  86. package/lib/esm/curve/CurveChain.d.ts.map +1 -1
  87. package/lib/esm/curve/CurveChain.js.map +1 -1
  88. package/lib/esm/curve/CurveCollection.d.ts +1 -1
  89. package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
  90. package/lib/esm/curve/CurveCollection.js +1 -1
  91. package/lib/esm/curve/CurveCollection.js.map +1 -1
  92. package/lib/esm/curve/CurveCurveCloseApproachXY.d.ts +18 -7
  93. package/lib/esm/curve/CurveCurveCloseApproachXY.d.ts.map +1 -1
  94. package/lib/esm/curve/CurveCurveCloseApproachXY.js +17 -5
  95. package/lib/esm/curve/CurveCurveCloseApproachXY.js.map +1 -1
  96. package/lib/esm/curve/CurveCurveIntersectXY.d.ts +2 -2
  97. package/lib/esm/curve/CurveCurveIntersectXY.d.ts.map +1 -1
  98. package/lib/esm/curve/CurveCurveIntersectXY.js +12 -10
  99. package/lib/esm/curve/CurveCurveIntersectXY.js.map +1 -1
  100. package/lib/esm/curve/Loop.d.ts +1 -2
  101. package/lib/esm/curve/Loop.d.ts.map +1 -1
  102. package/lib/esm/curve/Loop.js.map +1 -1
  103. package/lib/esm/curve/ParityRegion.js.map +1 -1
  104. package/lib/esm/curve/Path.d.ts +2 -3
  105. package/lib/esm/curve/Path.d.ts.map +1 -1
  106. package/lib/esm/curve/Path.js +1 -1
  107. package/lib/esm/curve/Path.js.map +1 -1
  108. package/lib/esm/curve/UnionRegion.js +1 -1
  109. package/lib/esm/curve/UnionRegion.js.map +1 -1
  110. package/lib/esm/geometry3d/FrameBuilder.d.ts +29 -25
  111. package/lib/esm/geometry3d/FrameBuilder.d.ts.map +1 -1
  112. package/lib/esm/geometry3d/FrameBuilder.js +42 -29
  113. package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
  114. package/lib/esm/geometry3d/GrowableXYArray.d.ts +26 -6
  115. package/lib/esm/geometry3d/GrowableXYArray.d.ts.map +1 -1
  116. package/lib/esm/geometry3d/GrowableXYArray.js +66 -15
  117. package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
  118. package/lib/esm/geometry3d/GrowableXYZArray.d.ts +5 -2
  119. package/lib/esm/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  120. package/lib/esm/geometry3d/GrowableXYZArray.js +10 -3
  121. package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
  122. package/lib/esm/polyface/PolyfaceBuilder.d.ts +9 -5
  123. package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
  124. package/lib/esm/polyface/PolyfaceBuilder.js +9 -5
  125. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  126. package/package.json +3 -3
@@ -64,7 +64,7 @@ export class UnionRegion extends CurveCollection {
64
64
  * * Returns false if the `AnyCurve` child is not a region type.
65
65
  */
66
66
  tryAddChild(child) {
67
- if (child && child instanceof ParityRegion || child instanceof Loop) {
67
+ if (child && (child instanceof ParityRegion || child instanceof Loop)) {
68
68
  this._children.push(child);
69
69
  return true;
70
70
  }
@@ -1 +1 @@
1
- {"version":3,"file":"UnionRegion.js","sourceRoot":"","sources":["../../../src/curve/UnionRegion.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAO/F,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C;;;;;;GAMG;AACH,MAAM,OAAO,WAAY,SAAQ,eAAe;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,CAAwB,CAAC;YACxE,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,KAAK,YAAY,YAAY,IAAI,KAAK,YAAY,IAAI,EAAE;YACnE,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","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) as ParityRegion | Loop;\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"]}
1
+ {"version":3,"file":"UnionRegion.js","sourceRoot":"","sources":["../../../src/curve/UnionRegion.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAO/F,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C;;;;;;GAMG;AACH,MAAM,OAAO,WAAY,SAAQ,eAAe;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,YAAY,IAAI,KAAK,YAAY,IAAI,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","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
- * * additional calls to announcePoint will produce announceVector call with the vector from the origin.
13
- * * After each announcement, call getValidatedFrame(false)
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
- * * to build a left handed frame,
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
- /** clear all accumulated point and vector data */
27
+ /** Clear all accumulated point and vector data */
28
28
  clear(): void;
29
29
  constructor();
30
- /** Try to assemble the data into a non-singular transform.
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
- /** Return the number of vectors saved. Because the save process checks numerics, this should be the rank of the system.
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
- /** announce a new point. If this point is different from the origin, also compute and announce the vector from the origin.*/
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
- /** announce a new vector. */
48
+ /** Announce a new vector. */
46
49
  announceVector(vector: Vector3d): number;
47
- /** Inspect the content of the data. Announce points and vectors. Return when savedVectorCount becomes
48
- * sufficient for a coordinate system.
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
- /** create a localToWorld frame for the given data.
52
- *
53
- * * origin is at first point
54
- * * x axis in direction of first nonzero vector present or implied by the input.
55
- * * y axis is perpendicular to x and contains (in positive side) the next vector present or implied by the input.
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
- /** create a transform containing points or vectors in the given data.
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. It does not try to get a "best" plane.
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
- * try to create a frame whose xy plane is through points.
66
- *
67
- * * 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
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
- * try to create a frame whose xy plane is through points, with the points appearing CCW in the local frame.
77
+ * Try to create a frame whose xy plane is through points, with the points appearing CCW in the local frame.
74
78
  *
75
- * * 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
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":"AAkBA,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;AAExC;;;;;;;;;;;;;;;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;IAOrC,kDAAkD;IAC3C,KAAK;;IAEZ;;;;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,CAAuC;IACtE;OACG;IACI,gBAAgB,IAAI,MAAM;IASjC,8HAA8H;IACvH,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAU5C,6BAA6B;IACtB,cAAc,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM;IA0B/C;;OAEG;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;IAkCpH;;;;OAIG;WACW,6BAA6B,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,SAAS,GAAG,SAAS;IAWpF;;;;;;OAMG;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;CAgB9C"}
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"}
@@ -13,7 +13,6 @@ import { CurveCollection } from "../curve/CurveCollection";
13
13
  import { CurvePrimitive } from "../curve/CurvePrimitive";
14
14
  import { LineSegment3d } from "../curve/LineSegment3d";
15
15
  import { LineString3d } from "../curve/LineString3d";
16
- /* eslint-disable @typescript-eslint/naming-convention, no-empty */
17
16
  import { AxisOrder, AxisScaleSelect, Geometry } from "../Geometry";
18
17
  import { GrowableXYZArray } from "./GrowableXYZArray";
19
18
  import { Matrix3d } from "./Matrix3d";
@@ -21,6 +20,7 @@ import { Point3d, Vector3d } from "./Point3dVector3d";
21
20
  import { Point3dArray } from "./PointHelpers";
22
21
  import { PolygonOps } from "./PolygonOps";
23
22
  import { Transform } from "./Transform";
23
+ /* eslint-disable @typescript-eslint/naming-convention, no-empty */
24
24
  /**
25
25
  * Helper class to accumulate points and vectors until there is enough data to define a coordinate system.
26
26
  *
@@ -28,10 +28,10 @@ import { Transform } from "./Transform";
28
28
  * * create the FrameBuilder and make calls to announcePoint and announceVector.
29
29
  * * the frame will be fully determined by an origin and two vectors.
30
30
  * * the first call to announcePoint will set the origin.
31
- * * additional calls to announcePoint will produce announceVector call with the vector from the origin.
32
- * * After each announcement, call getValidatedFrame(false)
31
+ * * additional calls to announcePoint will produce announceVector call with the vector from the origin.
32
+ * * after each announcement, call getValidatedFrame(false)
33
33
  * * getValidatedFrame will succeed when it has two independent vectors.
34
- * * to build a left handed frame,
34
+ * * To build a left handed frame,
35
35
  * * an origin and 3 independent vectors are required.
36
36
  * * announce as above, but query with getValidatedFrame (true).
37
37
  * * this will use the third vector to select right or left handed frame.
@@ -46,11 +46,18 @@ export class FrameBuilder {
46
46
  }
47
47
  return false;
48
48
  }
49
- /** clear all accumulated point and vector data */
50
- clear() { this._origin = undefined; this._vector0 = undefined; this._vector1 = undefined; this._vector2 = undefined; }
51
- constructor() { this.clear(); }
52
- /** Try to assemble the data into a non-singular transform.
53
- *
49
+ /** Clear all accumulated point and vector data */
50
+ clear() {
51
+ this._origin = undefined;
52
+ this._vector0 = undefined;
53
+ this._vector1 = undefined;
54
+ this._vector2 = undefined;
55
+ }
56
+ constructor() {
57
+ this.clear();
58
+ }
59
+ /**
60
+ * Try to assemble the data into a non-singular transform.
54
61
  * * If allowLeftHanded is false, vector0 and vector1 determine a right handed coordinate system.
55
62
  * * if allowLeftHanded is true, the z vector of the right handed system can be flipped to agree with vector2 direction.
56
63
  */
@@ -85,8 +92,11 @@ export class FrameBuilder {
85
92
  }
86
93
  }
87
94
  /** Ask if there is a defined origin for the evolving frame */
88
- get hasOrigin() { return this._origin !== undefined; }
89
- /** Return the number of vectors saved. Because the save process checks numerics, this should be the rank of the system.
95
+ get hasOrigin() {
96
+ return this._origin !== undefined;
97
+ }
98
+ /**
99
+ * Return the number of vectors saved. Because the save process checks numerics, this should be the rank of the system.
90
100
  */
91
101
  savedVectorCount() {
92
102
  if (!this._vector0)
@@ -97,7 +107,9 @@ export class FrameBuilder {
97
107
  return 2;
98
108
  return 3;
99
109
  }
100
- /** announce a new point. If this point is different from the origin, also compute and announce the vector from the origin.*/
110
+ /**
111
+ * Announce a new point. If this point is different from the origin, also compute and announce the vector from the origin.
112
+ */
101
113
  announcePoint(point) {
102
114
  if (!this._origin) {
103
115
  this._origin = point.clone();
@@ -108,7 +120,7 @@ export class FrameBuilder {
108
120
  return this.savedVectorCount();
109
121
  return this.announceVector(this._origin.vectorTo(point));
110
122
  }
111
- /** announce a new vector. */
123
+ /** Announce a new vector. */
112
124
  announceVector(vector) {
113
125
  if (vector.isAlmostZero)
114
126
  return this.savedVectorCount();
@@ -135,8 +147,9 @@ export class FrameBuilder {
135
147
  // fall through if prior vectors are all there -- no need for the new one.
136
148
  return 3;
137
149
  }
138
- /** Inspect the content of the data. Announce points and vectors. Return when savedVectorCount becomes
139
- * sufficient for a coordinate system.
150
+ /**
151
+ * Inspect the content of the data. Announce points and vectors. Return when savedVectorCount becomes sufficient
152
+ * for a coordinate system.
140
153
  */
141
154
  announce(data) {
142
155
  if (this.savedVectorCount() > 1)
@@ -217,11 +230,11 @@ export class FrameBuilder {
217
230
  }
218
231
  }
219
232
  }
220
- /** create a localToWorld frame for the given data.
221
- *
222
- * * origin is at first point
223
- * * x axis in direction of first nonzero vector present or implied by the input.
224
- * * y axis is perpendicular to x and contains (in positive side) the next vector present or implied by the input.
233
+ /**
234
+ * Create a localToWorld frame for the given data.
235
+ * * origin is at first point.
236
+ * * x axis in direction of first nonzero vector present or implied by the input.
237
+ * * y axis is perpendicular to x and contains (in positive side) the next vector present or implied by the input.
225
238
  */
226
239
  static createRightHandedFrame(defaultUpVector, ...params) {
227
240
  const builder = new FrameBuilder();
@@ -256,10 +269,11 @@ export class FrameBuilder {
256
269
  }
257
270
  return undefined;
258
271
  }
259
- /** create a transform containing points or vectors in the given data.
272
+ /**
273
+ * Create a transform containing points or vectors in the given data.
260
274
  * * The xy columns of the transform contain the first points or vectors of the data.
261
275
  * * The z column is perpendicular to that xy plane.
262
- * * The calculation favors the first points found. It does not try to get a "best" plane.
276
+ * * The calculation favors the first points found. It does not try to get a "best" plane.
263
277
  */
264
278
  static createRightHandedLocalToWorld(...params) {
265
279
  const builder = new FrameBuilder();
@@ -272,10 +286,9 @@ export class FrameBuilder {
272
286
  return undefined;
273
287
  }
274
288
  /**
275
- * try to create a frame whose xy plane is through points.
276
- *
277
- * * 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
278
- * point most distant from that line.
289
+ * Try to create a frame whose xy plane is through points.
290
+ * * If 3 or more distinct points are present, the x axis is from the first point to the most distant, and y
291
+ * direction is toward the point most distant from that line.
279
292
  * @param points array of points
280
293
  */
281
294
  static createFrameToDistantPoints(points) {
@@ -292,10 +305,10 @@ export class FrameBuilder {
292
305
  return undefined;
293
306
  }
294
307
  /**
295
- * try to create a frame whose xy plane is through points, with the points appearing CCW in the local frame.
308
+ * Try to create a frame whose xy plane is through points, with the points appearing CCW in the local frame.
296
309
  *
297
- * * 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
298
- * point most distant from that line.
310
+ * * If 3 or more distinct points are present, the x axis is from the first point to the most distant, and y
311
+ * direction is toward the point most distant from that line.
299
312
  * @param points array of points
300
313
  */
301
314
  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
- * * An array of Point2d
70
- * * An array of Point3d (hidden as XAndY)
71
- * * An array of objects with keyed values, et `{x:1, y:1}`
72
- * * A `GrowableXYZArray`
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":"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"}
1
+ {"version":3,"file":"GrowableXYArray.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/GrowableXYArray.ts"],"names":[],"mappings":"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"}
@@ -10,7 +10,6 @@ import { GrowableXYZArray } from "./GrowableXYZArray";
10
10
  import { IndexedXYCollection } from "./IndexedXYCollection";
11
11
  import { Point2d, Vector2d } from "./Point2dVector2d";
12
12
  import { Point3d } from "./Point3dVector3d";
13
- import { PointStreamGrowableXYZArrayCollector, VariantPointDataStream } from "./PointStreaming";
14
13
  /** `GrowableXYArray` manages a (possibly growing) Float64Array to pack xy coordinates.
15
14
  * @public
16
15
  */
@@ -105,26 +104,33 @@ export class GrowableXYArray extends IndexedXYCollection {
105
104
  return newPoints;
106
105
  }
107
106
  /** Create an array populated from
108
- * * An array of Point2d
109
- * * An array of Point3d (hidden as XAndY)
110
- * * An array of objects with keyed values, et `{x:1, y:1}`
111
- * * A `GrowableXYZArray`
107
+ * Valid inputs are:
108
+ * * Point2d
109
+ * * Point3d
110
+ * * An array of 2 doubles
111
+ * * An array of 3 doubles
112
+ * * A GrowableXYZArray
113
+ * * A GrowableXYArray
114
+ * * Any json object satisfying Point3d.isXAndY
115
+ * * A Float64Array of doubles, interpreted as xyxy
116
+ * * An array of any of the above
112
117
  */
113
- static create(data) {
114
- const newPoints = new GrowableXYArray(data.length);
115
- if (data instanceof GrowableXYZArray) {
116
- newPoints.pushAllXYAndZ(data);
118
+ static create(data, result) {
119
+ if (result) {
120
+ result.clear();
117
121
  }
118
122
  else {
119
- newPoints.pushAll(data);
123
+ const pointCount = typeof data[0] === "number" ? data.length / 2 : data.length;
124
+ result = new GrowableXYArray(pointCount);
120
125
  }
121
- return newPoints;
126
+ result.pushFrom(data);
127
+ return result;
122
128
  }
123
- /** Restructure MultiLineStringDataVariant as array of GrowableXYZArray */
129
+ /** Restructure MultiLineStringDataVariant as array of GrowableXYZArray
130
+ * @deprecated in 4.x. Moved to GrowableXYZArray class.
131
+ */
124
132
  static createArrayOfGrowableXYZArray(data) {
125
- const collector = new PointStreamGrowableXYZArrayCollector();
126
- VariantPointDataStream.streamXYZ(data, collector);
127
- return collector.claimArrayOfGrowableXYZArray();
133
+ return GrowableXYZArray.createArrayOfGrowableXYZArray(data);
128
134
  }
129
135
  /** push a point to the end of the array */
130
136
  push(toPush) {
@@ -150,6 +156,51 @@ export class GrowableXYArray extends IndexedXYCollection {
150
156
  this.pushXY(p.x, p.y);
151
157
  }
152
158
  }
159
+ /** Push points from variant sources.
160
+ * Valid inputs are:
161
+ * * Point2d
162
+ * * Point3d
163
+ * * An array of 2 doubles
164
+ * * A GrowableXYArray
165
+ * * A GrowableXYZArray
166
+ * * Any json object satisfying Point3d.isXAndY
167
+ * * A Float64Array of doubles, interpreted as xyxy
168
+ * * An array of any of the above
169
+ */
170
+ pushFrom(p) {
171
+ if (p instanceof Point3d) {
172
+ this.pushXY(p.x, p.y);
173
+ }
174
+ else if (p instanceof GrowableXYZArray) {
175
+ this.pushAllXYAndZ(p);
176
+ }
177
+ else if (p instanceof Point2d) {
178
+ this.pushXY(p.x, p.y);
179
+ }
180
+ else if (Geometry.isNumberArray(p, 3) || p instanceof Float64Array) {
181
+ const xyToAdd = Math.trunc(p.length / 2);
182
+ this.ensureCapacity(this._xyInUse + xyToAdd, false);
183
+ this.copyData(p, xyToAdd, this._xyInUse);
184
+ this._xyInUse += xyToAdd;
185
+ }
186
+ else if (Geometry.isNumberArray(p, 2)) {
187
+ this.pushXY(p[0], p[1]);
188
+ }
189
+ else if (Array.isArray(p)) {
190
+ // direct recursion re-wraps p and goes infinite. Unroll here.
191
+ for (const q of p)
192
+ this.pushFrom(q);
193
+ }
194
+ else if (Point3d.isXAndY(p)) {
195
+ this.pushXY(p.x, p.y);
196
+ }
197
+ else if (p instanceof IndexedXYCollection) {
198
+ const n = p.length;
199
+ this.ensureCapacity(this._xyInUse + n, false);
200
+ for (let i = 0; i < n; i++)
201
+ this.pushXY(p.getXAtUncheckedPointIndex(i), p.getYAtUncheckedPointIndex(i));
202
+ }
203
+ }
153
204
  /**
154
205
  * Replicate numWrap xy values from the front of the array as new values at the end.
155
206
  * @param numWrap number of xy values to replicate