@itwin/core-geometry 4.0.0-dev.22 → 4.0.0-dev.24

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 (123) hide show
  1. package/lib/cjs/Geometry.d.ts +23 -0
  2. package/lib/cjs/Geometry.d.ts.map +1 -1
  3. package/lib/cjs/Geometry.js +25 -1
  4. package/lib/cjs/Geometry.js.map +1 -1
  5. package/lib/cjs/geometry3d/BarycentricTriangle.d.ts +195 -8
  6. package/lib/cjs/geometry3d/BarycentricTriangle.d.ts.map +1 -1
  7. package/lib/cjs/geometry3d/BarycentricTriangle.js +459 -11
  8. package/lib/cjs/geometry3d/BarycentricTriangle.js.map +1 -1
  9. package/lib/cjs/geometry3d/GrowableXYArray.d.ts +1 -1
  10. package/lib/cjs/geometry3d/GrowableXYArray.d.ts.map +1 -1
  11. package/lib/cjs/geometry3d/GrowableXYArray.js +1 -1
  12. package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
  13. package/lib/cjs/geometry3d/IndexedXYCollection.d.ts +22 -7
  14. package/lib/cjs/geometry3d/IndexedXYCollection.d.ts.map +1 -1
  15. package/lib/cjs/geometry3d/IndexedXYCollection.js +41 -5
  16. package/lib/cjs/geometry3d/IndexedXYCollection.js.map +1 -1
  17. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts +58 -4
  18. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  19. package/lib/cjs/geometry3d/IndexedXYZCollection.js +102 -4
  20. package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
  21. package/lib/cjs/geometry3d/Point2dArrayCarrier.d.ts +10 -0
  22. package/lib/cjs/geometry3d/Point2dArrayCarrier.d.ts.map +1 -1
  23. package/lib/cjs/geometry3d/Point2dArrayCarrier.js +14 -0
  24. package/lib/cjs/geometry3d/Point2dArrayCarrier.js.map +1 -1
  25. package/lib/cjs/geometry3d/Point3dArrayCarrier.d.ts +0 -6
  26. package/lib/cjs/geometry3d/Point3dArrayCarrier.d.ts.map +1 -1
  27. package/lib/cjs/geometry3d/Point3dArrayCarrier.js +0 -6
  28. package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
  29. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +1 -1
  30. package/lib/cjs/geometry3d/Point3dVector3d.js +2 -2
  31. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  32. package/lib/cjs/geometry3d/PointHelpers.d.ts +14 -1
  33. package/lib/cjs/geometry3d/PointHelpers.d.ts.map +1 -1
  34. package/lib/cjs/geometry3d/PointHelpers.js +33 -1
  35. package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
  36. package/lib/cjs/geometry3d/PolygonOps.d.ts +120 -10
  37. package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
  38. package/lib/cjs/geometry3d/PolygonOps.js +412 -12
  39. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  40. package/lib/cjs/polyface/FacetLocationDetail.d.ts +264 -0
  41. package/lib/cjs/polyface/FacetLocationDetail.d.ts.map +1 -0
  42. package/lib/cjs/polyface/FacetLocationDetail.js +378 -0
  43. package/lib/cjs/polyface/FacetLocationDetail.js.map +1 -0
  44. package/lib/cjs/polyface/IndexedPolyfaceVisitor.d.ts +2 -5
  45. package/lib/cjs/polyface/IndexedPolyfaceVisitor.d.ts.map +1 -1
  46. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js +5 -2
  47. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  48. package/lib/cjs/polyface/PolyfaceBuilder.d.ts +20 -14
  49. package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
  50. package/lib/cjs/polyface/PolyfaceBuilder.js +21 -17
  51. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  52. package/lib/cjs/polyface/PolyfaceData.d.ts +1 -1
  53. package/lib/cjs/polyface/PolyfaceData.d.ts.map +1 -1
  54. package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
  55. package/lib/cjs/polyface/PolyfaceQuery.d.ts +22 -1
  56. package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
  57. package/lib/cjs/polyface/PolyfaceQuery.js +52 -2
  58. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  59. package/lib/cjs/solid/Sphere.d.ts +5 -5
  60. package/lib/cjs/solid/Sphere.js +5 -5
  61. package/lib/cjs/solid/Sphere.js.map +1 -1
  62. package/lib/esm/Geometry.d.ts +23 -0
  63. package/lib/esm/Geometry.d.ts.map +1 -1
  64. package/lib/esm/Geometry.js +24 -0
  65. package/lib/esm/Geometry.js.map +1 -1
  66. package/lib/esm/geometry3d/BarycentricTriangle.d.ts +195 -8
  67. package/lib/esm/geometry3d/BarycentricTriangle.d.ts.map +1 -1
  68. package/lib/esm/geometry3d/BarycentricTriangle.js +459 -12
  69. package/lib/esm/geometry3d/BarycentricTriangle.js.map +1 -1
  70. package/lib/esm/geometry3d/GrowableXYArray.d.ts +1 -1
  71. package/lib/esm/geometry3d/GrowableXYArray.d.ts.map +1 -1
  72. package/lib/esm/geometry3d/GrowableXYArray.js +1 -1
  73. package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
  74. package/lib/esm/geometry3d/IndexedXYCollection.d.ts +22 -7
  75. package/lib/esm/geometry3d/IndexedXYCollection.d.ts.map +1 -1
  76. package/lib/esm/geometry3d/IndexedXYCollection.js +41 -5
  77. package/lib/esm/geometry3d/IndexedXYCollection.js.map +1 -1
  78. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts +58 -4
  79. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  80. package/lib/esm/geometry3d/IndexedXYZCollection.js +103 -5
  81. package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
  82. package/lib/esm/geometry3d/Point2dArrayCarrier.d.ts +10 -0
  83. package/lib/esm/geometry3d/Point2dArrayCarrier.d.ts.map +1 -1
  84. package/lib/esm/geometry3d/Point2dArrayCarrier.js +14 -0
  85. package/lib/esm/geometry3d/Point2dArrayCarrier.js.map +1 -1
  86. package/lib/esm/geometry3d/Point3dArrayCarrier.d.ts +0 -6
  87. package/lib/esm/geometry3d/Point3dArrayCarrier.d.ts.map +1 -1
  88. package/lib/esm/geometry3d/Point3dArrayCarrier.js +0 -6
  89. package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
  90. package/lib/esm/geometry3d/Point3dVector3d.d.ts +1 -1
  91. package/lib/esm/geometry3d/Point3dVector3d.js +2 -2
  92. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  93. package/lib/esm/geometry3d/PointHelpers.d.ts +14 -1
  94. package/lib/esm/geometry3d/PointHelpers.d.ts.map +1 -1
  95. package/lib/esm/geometry3d/PointHelpers.js +33 -1
  96. package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
  97. package/lib/esm/geometry3d/PolygonOps.d.ts +120 -10
  98. package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
  99. package/lib/esm/geometry3d/PolygonOps.js +411 -12
  100. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  101. package/lib/esm/polyface/FacetLocationDetail.d.ts +264 -0
  102. package/lib/esm/polyface/FacetLocationDetail.d.ts.map +1 -0
  103. package/lib/esm/polyface/FacetLocationDetail.js +371 -0
  104. package/lib/esm/polyface/FacetLocationDetail.js.map +1 -0
  105. package/lib/esm/polyface/IndexedPolyfaceVisitor.d.ts +2 -5
  106. package/lib/esm/polyface/IndexedPolyfaceVisitor.d.ts.map +1 -1
  107. package/lib/esm/polyface/IndexedPolyfaceVisitor.js +5 -2
  108. package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  109. package/lib/esm/polyface/PolyfaceBuilder.d.ts +20 -14
  110. package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
  111. package/lib/esm/polyface/PolyfaceBuilder.js +21 -17
  112. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  113. package/lib/esm/polyface/PolyfaceData.d.ts +1 -1
  114. package/lib/esm/polyface/PolyfaceData.d.ts.map +1 -1
  115. package/lib/esm/polyface/PolyfaceData.js.map +1 -1
  116. package/lib/esm/polyface/PolyfaceQuery.d.ts +22 -1
  117. package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
  118. package/lib/esm/polyface/PolyfaceQuery.js +52 -2
  119. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  120. package/lib/esm/solid/Sphere.d.ts +5 -5
  121. package/lib/esm/solid/Sphere.js +5 -5
  122. package/lib/esm/solid/Sphere.js.map +1 -1
  123. package/package.json +4 -4
@@ -187,6 +187,38 @@ export class NumberArray {
187
187
  result.push(knot1);
188
188
  return result;
189
189
  }
190
+ /** Compute the linear combination s of the numbers and scales.
191
+ * @param data array of numbers d_i.
192
+ * @param scales array of scales s_i. For best results, `scales` should have the same length as `data`.
193
+ * @return s = sum(d_i * s_i), where i ranges from 0 to min(data.length, scales.length).
194
+ */
195
+ static linearCombination(data, scales) {
196
+ const numTerms = Math.min(data.length, scales.length);
197
+ let sum = 0;
198
+ for (let i = 0; i < numTerms; ++i)
199
+ sum += scales[i] * data[i];
200
+ return sum;
201
+ }
202
+ /** Compute the linear combination s of the colors and scales.
203
+ * * The result is another color if the scales are in [0,1] and sum to 1.
204
+ * @param colors array of colors c_i (rgba in first four bytes).
205
+ * @param scales array of scales s_i. For best results, `scales` should have the same length as `colors`.
206
+ * @return s = sum(c_i * s_i), where i ranges from 0 to min(colors.length, scales.length).
207
+ */
208
+ static linearCombinationOfColors(colors, scales) {
209
+ const numTerms = Math.min(colors.length, scales.length);
210
+ const bytes = [0, 0, 0, 0];
211
+ // compute a convex combination of each byte
212
+ for (let iByte = 0, shiftBits = 0; iByte < 4; ++iByte, shiftBits += 8) {
213
+ for (let iTerm = 0; iTerm < numTerms; ++iTerm) {
214
+ const fraction = Geometry.clamp(scales[iTerm], 0, 1); // chop slop
215
+ const colorComponent = (colors[iTerm] >>> shiftBits) & 0xFF;
216
+ bytes[iByte] += fraction * colorComponent;
217
+ }
218
+ bytes[iByte] = (Math.floor(bytes[iByte]) & 0xFF) << shiftBits;
219
+ }
220
+ return bytes[0] | bytes[1] | bytes[2] | bytes[3];
221
+ }
190
222
  }
191
223
  /**
192
224
  * The `Point2dArray` class contains static methods that act on arrays of 2d points.
@@ -232,7 +264,7 @@ export class Point2dArray {
232
264
  }
233
265
  }
234
266
  /**
235
- * The `Vector3ddArray` class contains static methods that act on arrays of 2d vectors.
267
+ * The `Vector3dArray` class contains static methods that act on arrays of 3d vectors.
236
268
  * @public
237
269
  */
238
270
  export class Vector3dArray {
@@ -1 +1 @@
1
- {"version":3,"file":"PointHelpers.js","sourceRoot":"","sources":["../../../src/geometry3d/PointHelpers.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/* eslint-disable @typescript-eslint/naming-convention, no-empty */\r\nimport { Geometry } from \"../Geometry\";\r\nimport { Point4d } from \"../geometry4d/Point4d\";\r\nimport { MultiLineStringDataVariant } from \"../topology/Triangulation\";\r\nimport { IndexedXYZCollection } from \"./IndexedXYZCollection\";\r\nimport { Plane3dByOriginAndUnitNormal } from \"./Plane3dByOriginAndUnitNormal\";\r\nimport { Point2d } from \"./Point2dVector2d\";\r\nimport { Point3dArrayCarrier } from \"./Point3dArrayCarrier\";\r\nimport { Point3d, Vector3d, XYZ } from \"./Point3dVector3d\";\r\nimport { PointStringDeepXYZArrayCollector, VariantPointDataStream } from \"./PointStreaming\";\r\nimport { Transform } from \"./Transform\";\r\nimport { XAndY, XYAndZ, XYZProps } from \"./XYZProps\";\r\n\r\n/**\r\n *\r\n * @param numA first candidate -- presumed 0 or positive\r\n * @param numB second candidate -- may be undefined, invalid if outside closed interval 0..numA\r\n * @param multiplyBy second candidate multiplier (applied only if candidate is defined)\r\n */\r\nfunction selectOptionalClampedMin(numA: number, numB: number | undefined, multiplyBy: number): number {\r\n\r\n if (numB !== undefined){\r\n const numC = numB * multiplyBy;\r\n if (numC >= 0 && numC <= numA)\r\n return numC;\r\n }\r\n return numA;\r\n}\r\n/**\r\n * The `NumberArray` class contains static methods that act on arrays of numbers.\r\n * @public\r\n */\r\nexport class NumberArray {\r\n /** return the sum of values in an array, The summation is done with correction terms which\r\n * improves last-bit numeric accuracy.\r\n */\r\n public static preciseSum(data: number[]) {\r\n const n = data.length;\r\n if (n === 0)\r\n return 0.0;\r\n let sum = data[0];\r\n let c = 0.0;\r\n let y: number;\r\n let t: number;\r\n for (let i = 1; i < n; i++) {\r\n y = data[i] - c;\r\n t = sum + y;\r\n c = (t - sum) - y;\r\n sum = t;\r\n }\r\n return sum;\r\n }\r\n /** Return true if arrays have identical counts and equal entries (using `!==` comparison) */\r\n public static isExactEqual(dataA: any[] | Float64Array | undefined, dataB: any[] | Float64Array | undefined) {\r\n if (dataA && dataB) {\r\n if (dataA.length !== dataB.length)\r\n return false;\r\n for (let i = 0; i < dataA.length; i++)\r\n if (dataA[i] !== dataB[i])\r\n return false;\r\n return true;\r\n }\r\n return (dataA === undefined && dataB === undefined);\r\n }\r\n /** Return true if arrays have identical counts and entries equal within tolerance */\r\n public static isAlmostEqual(\r\n dataA: number[] | Float64Array | undefined,\r\n dataB: number[] | Float64Array | undefined,\r\n tolerance: number) {\r\n if (dataA && dataB) {\r\n if (dataA.length !== dataB.length)\r\n return false;\r\n for (let i = 0; i < dataA.length; i++)\r\n if (Math.abs(dataA[i] - dataB[i]) >= tolerance) return false;\r\n return true;\r\n }\r\n return (dataA === undefined && dataB === undefined);\r\n }\r\n\r\n /** return the sum of numbers in an array. Note that \"PreciseSum\" may be more accurate. */\r\n public static sum(data: number[] | Float64Array) {\r\n let sum = 0;\r\n for (const x of data) { sum += x; }\r\n return sum;\r\n }\r\n /** test if coordinate x appears (to tolerance by `Geometry.isSameCoordinate`) in this array of numbers */\r\n public static isCoordinateInArray(x: number, data: number[] | undefined): boolean {\r\n if (data) {\r\n for (const y of data) { if (Geometry.isSameCoordinate(x, y)) return true; }\r\n }\r\n return false;\r\n }\r\n /** Return the max absolute value in a array of numbers. */\r\n public static maxAbsArray(values: number[]) {\r\n const arrLen = values.length;\r\n if (arrLen === 0) {\r\n return 0.0;\r\n }\r\n let a = Math.abs(values[0]);\r\n for (let i = 1; i < arrLen; i++) {\r\n const b = Math.abs(values[i]);\r\n if (a < b) {\r\n a = b;\r\n }\r\n }\r\n return a;\r\n }\r\n /** return the max absolute value of a pair of numbers */\r\n public static maxAbsTwo(a1: number, a2: number) {\r\n a1 = Math.abs(a1);\r\n a2 = Math.abs(a2);\r\n return (a1 > a2) ? a1 : a2;\r\n }\r\n /** Return the max absolute difference between corresponding entries in two arrays of numbers\r\n * * If sizes are mismatched, only the smaller length is tested.\r\n */\r\n public static maxAbsDiff(dataA: number[] | Float64Array, dataB: number[] | Float64Array): number {\r\n let a = 0.0;\r\n const n = Math.min(dataA.length, dataB.length);\r\n for (let i = 0; i < n; i++) { a = Math.max(a, Math.abs(dataA[i] - dataB[i])); }\r\n return a;\r\n }\r\n\r\n /** Return the max absolute difference between corresponding entries in two Float64Array\r\n * * If sizes are mismatched, only the smaller length is tested.\r\n */\r\n public static maxAbsDiffFloat64(dataA: Float64Array, dataB: Float64Array): number {\r\n let a = 0.0;\r\n const n = Math.min(dataA.length, dataB.length);\r\n for (let i = 0; i < n; i++) { a = Math.max(a, Math.abs(dataA[i] - dataB[i])); }\r\n return a;\r\n }\r\n /**\r\n * Return an array with indicated start and end points, maximum step size internally\r\n * @param low low value\r\n * @param high high value\r\n * @param step max permitted step\r\n */\r\n public static createArrayWithMaxStepSize(low: number, high: number, step: number): number[] {\r\n if (low === high)\r\n return [low];\r\n const delta = high - low;\r\n const numInterval = Math.max(1, Math.floor(Math.abs(delta / step)));\r\n const result = [];\r\n result.push(low);\r\n for (let i = 1; i < numInterval; i++) {\r\n result.push(low + (i / numInterval) * delta);\r\n }\r\n result.push(high);\r\n return result;\r\n }\r\n\r\n /** copy numbers from variant sources to number[]. */\r\n public static create(source: number[] | Float64Array): number[] {\r\n const result: number[] = [];\r\n for (const q of source)\r\n result.push(q);\r\n return result;\r\n }\r\n\r\n /** Return a copy of the knots array, with multiplicity of first and last knots raised or lowered to expectedMultiplicity. */\r\n public static cloneWithStartAndEndMultiplicity(knots: number[] | undefined, target0: number, target1: number): number[] {\r\n const result: number[] = [];\r\n if (knots === undefined || knots.length === 0)\r\n return result;\r\n let multiplicity0 = 1;\r\n const knot0 = knots[0];\r\n const knot1 = knots[knots.length - 1];\r\n for (; multiplicity0 < knots.length && knots[multiplicity0] === knot0;) { multiplicity0++; }\r\n let multiplicity1 = 1;\r\n const k1 = knots.length - 1;\r\n for (; k1 - multiplicity1 >= 0 && knots[k1 - multiplicity1] === knot1;) { multiplicity1++; }\r\n\r\n for (let k = 0; k < target0; k++)\r\n result.push(knot0);\r\n for (let k = multiplicity0; k + multiplicity1 < knots.length; k++)\r\n result.push(knots[k]);\r\n for (let k = 0; k < target1; k++)\r\n result.push(knot1);\r\n return result;\r\n }\r\n\r\n}\r\n/**\r\n * The `Point2dArray` class contains static methods that act on arrays of 2d points.\r\n * @public\r\n */\r\nexport class Point2dArray {\r\n /** Return true if arrays have same length and matching coordinates. */\r\n public static isAlmostEqual(dataA: undefined | Point2d[], dataB: undefined | Point2d[]): boolean {\r\n if (dataA && dataB) {\r\n if (dataA.length !== dataB.length)\r\n return false;\r\n for (let i = 0; i < dataA.length; i++) {\r\n if (!dataA[i].isAlmostEqual(dataB[i]))\r\n return false;\r\n }\r\n return true;\r\n }\r\n return (dataA === undefined && dataB === undefined);\r\n }\r\n /**\r\n * Return an array containing clones of the Point3d data[]\r\n * @param data source data\r\n */\r\n public static clonePoint2dArray(data: Point2d[]): Point2d[] {\r\n return data.map((p: Point2d) => p.clone());\r\n }\r\n /**\r\n * Return the number of points when trailing points that match point 0 are excluded.\r\n * @param data array of XAndY points.\r\n */\r\n public static pointCountExcludingTrailingWraparound(data: XAndY[]): number {\r\n let n = data.length;\r\n if (n < 2)\r\n return n;\r\n const x0 = data[0].x;\r\n const y0 = data[0].y;\r\n while (n > 1) {\r\n if (!Geometry.isSameCoordinate(data[n - 1].x, x0) || !Geometry.isSameCoordinate(data[n - 1].y, y0))\r\n return n;\r\n n--;\r\n }\r\n return n;\r\n }\r\n\r\n}\r\n\r\n/**\r\n * The `Vector3ddArray` class contains static methods that act on arrays of 2d vectors.\r\n * @public\r\n */\r\nexport class Vector3dArray {\r\n /** Return true if arrays have same length and matching coordinates. */\r\n public static isAlmostEqual(dataA: undefined | Vector3d[], dataB: undefined | Vector3d[]): boolean {\r\n if (dataA && dataB) {\r\n if (dataA.length !== dataB.length)\r\n return false;\r\n for (let i = 0; i < dataA.length; i++)\r\n if (!dataA[i].isAlmostEqual(dataB[i]))\r\n return false;\r\n return true;\r\n }\r\n return (dataA === undefined && dataB === undefined);\r\n }\r\n /**\r\n * Return an array containing clones of the Vector3d data[]\r\n * @param data source data\r\n */\r\n public static cloneVector3dArray(data: XYAndZ[]): Vector3d[] {\r\n return data.map((p: XYAndZ) => Vector3d.create(p.x, p.y, p.z));\r\n }\r\n}\r\n\r\n/**\r\n * The `Point4dArray` class contains static methods that act on arrays of 4d points.\r\n * @public\r\n */\r\nexport class Point4dArray {\r\n /** pack each point and its corresponding weight into a buffer of xyzw xyzw ... */\r\n public static packPointsAndWeightsToFloat64Array(data: Point3d[] | Float64Array | number[], weights: number[] | Float64Array,\r\n result?: Float64Array): Float64Array | undefined {\r\n if (Array.isArray(data) && data[0] instanceof Point3d) {\r\n const points = data as Point3d[];\r\n if (points.length !== weights.length)\r\n return undefined;\r\n result = result ? result : new Float64Array(4 * points.length);\r\n let i = 0;\r\n let k = 0;\r\n for (k = 0; k < points.length; k++) {\r\n result[i++] = points[k].x;\r\n result[i++] = points[k].y;\r\n result[i++] = points[k].z;\r\n result[i++] = weights[k];\r\n }\r\n return result;\r\n } else {\r\n const points = data as (Float64Array | number[]);\r\n const numPoints = weights.length;\r\n if (points.length !== 3 * numPoints)\r\n return undefined;\r\n let i = 0; let k;\r\n result = result ? result : new Float64Array(4 * numPoints);\r\n for (k = 0; k < numPoints; k++) {\r\n const k0 = 3 * k;\r\n result[i++] = points[k0];\r\n result[i++] = points[k0 + 1];\r\n result[i++] = points[k0 + 2];\r\n result[i++] = weights[k];\r\n }\r\n return result;\r\n }\r\n return undefined;\r\n }\r\n\r\n /** pack x,y,z,w in Float64Array. */\r\n public static packToFloat64Array(data: Point4d[], result?: Float64Array): Float64Array {\r\n result = result ? result : new Float64Array(4 * data.length);\r\n let i = 0;\r\n for (const p of data) {\r\n result[i++] = p.x;\r\n result[i++] = p.y;\r\n result[i++] = p.z;\r\n result[i++] = p.w;\r\n }\r\n return result;\r\n }\r\n /** unpack from ... to array of Point4d */\r\n public static unpackToPoint4dArray(data: Float64Array): Point4d[] {\r\n const result = [];\r\n for (let i = 0; i + 3 < data.length; i += 4) {\r\n result.push(Point4d.create(data[i], data[i + 1], data[i + 2], data[i + 3]));\r\n }\r\n return result;\r\n }\r\n /** unpack from xyzw xyzw... array to array of Point3d and array of weight.\r\n */\r\n public static unpackFloat64ArrayToPointsAndWeights(data: Float64Array, points: Point3d[], weights: number[],\r\n pointFormatter: (x: number, y: number, z: number) => any = Point3d.create) {\r\n points.length = 0;\r\n weights.length = 0;\r\n for (let i = 0; i + 3 < data.length; i += 4) {\r\n points.push(pointFormatter(data[i], data[i + 1], data[i + 2]));\r\n weights.push(data[i + 3]);\r\n }\r\n }\r\n private static _workPoint4d = Point4d.create();\r\n /**\r\n * Multiply (and replace) each block of 4 values as a Point4d.\r\n * @param transform transform to apply\r\n * @param xyzw array of x,y,z,w points.\r\n */\r\n public static multiplyInPlace(transform: Transform, xyzw: Float64Array): void {\r\n const numXYZW = xyzw.length;\r\n const xyzw1 = Point4dArray._workPoint4d;\r\n for (let i = 0; i + 3 < numXYZW; i += 4) {\r\n transform.multiplyXYZW(xyzw[i], xyzw[i + 1], xyzw[i + 2], xyzw[i + 3], xyzw1);\r\n xyzw[i] = xyzw1.x;\r\n xyzw[i + 1] = xyzw1.y;\r\n xyzw[i + 2] = xyzw1.z;\r\n xyzw[i + 3] = xyzw1.w;\r\n }\r\n }\r\n /** test for near equality of all corresponding numeric values, treated as coordinates. */\r\n public static isAlmostEqual(dataA: Point4d[] | Float64Array | undefined, dataB: Point4d[] | Float64Array | undefined): boolean {\r\n if (dataA && dataB) {\r\n if (dataA.length !== dataB.length)\r\n return false;\r\n if (dataA instanceof Float64Array && dataB instanceof Float64Array) {\r\n for (let i = 0; i < dataA.length; i++)\r\n if (!Geometry.isSameCoordinate(dataA[i], dataB[i]))\r\n return false;\r\n } else if (Array.isArray(dataA) && Array.isArray(dataB)) {\r\n for (let i = 0; i < dataA.length; i++)\r\n if (!dataA[i].isAlmostEqual(dataB[i]))\r\n return false;\r\n }\r\n return true;\r\n }\r\n // if both are null it is equal, otherwise unequal\r\n return (dataA === undefined && dataB === undefined);\r\n }\r\n /** return true iff all xyzw points' altitudes are within tolerance of the plane.*/\r\n public static isCloseToPlane(data: Point4d[] | Float64Array, plane: Plane3dByOriginAndUnitNormal, tolerance: number = Geometry.smallMetricDistance): boolean {\r\n if (Array.isArray(data)) {\r\n for (const xyzw of data) {\r\n if (Math.abs(plane.altitudeXYZW(xyzw.x, xyzw.y, xyzw.z, xyzw.w)) > tolerance)\r\n return false;\r\n }\r\n } else if (data instanceof Float64Array) {\r\n const numXYZ = data.length;\r\n for (let i = 0; i + 2 < numXYZ; i += 4) {\r\n if (Math.abs(plane.altitudeXYZW(data[i], data[i + 1], data[i + 2], data[i + 3])) > tolerance)\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n}\r\n/**\r\n * The `Point3dArray` class contains static methods that act on arrays of 3d points.\r\n * @public\r\n */\r\n\r\nexport class Point3dArray {\r\n /** pack x,y,z to `Float64Array` */\r\n public static packToFloat64Array(data: Point3d[]): Float64Array {\r\n const result = new Float64Array(3 * data.length);\r\n let i = 0;\r\n for (const p of data) {\r\n result[i++] = p.x;\r\n result[i++] = p.y;\r\n result[i++] = p.z;\r\n }\r\n return result;\r\n }\r\n /**\r\n * Compute the 8 weights of trilinear mapping\r\n * By appropriate choice of weights, this can be used for both point and derivative mappings.\r\n * @param weights preallocated array to receive weights.\r\n * @param u0 low u weight\r\n * @param u1 high u weight\r\n * @param v0 low v weight\r\n * @param v1 high v weight\r\n * @param w0 low w weight\r\n * @param w1 high w weight\r\n */\r\n public static evaluateTrilinearWeights(weights: Float64Array, u0: number, u1: number, v0: number, v1: number, w0: number, w1: number) {\r\n\r\n weights[0] = u0 * v0 * w0;\r\n weights[1] = u1 * v0 * w0;\r\n weights[2] = u0 * v1 * w0;\r\n weights[3] = u1 * v1 * w0;\r\n weights[4] = u0 * v0 * w1;\r\n weights[5] = u1 * v0 * w1;\r\n weights[6] = u0 * v1 * w1;\r\n weights[7] = u1 * v1 * w1;\r\n }\r\n /**\r\n * sum the weighted x components from a point array.\r\n * * weights.length is the number of summed terms\r\n * * points must have at least that length\r\n * @param weights\r\n * @param points\r\n */\r\n public static sumWeightedX(weights: Float64Array, points: Point3d[]): number {\r\n let sum = 0.0;\r\n const n = weights.length;\r\n for (let i = 0; i < n; i++)\r\n sum += weights[i] * points[i].x;\r\n return sum;\r\n }\r\n\r\n /**\r\n * sum the weighted x components from a point array.\r\n * * weights.length is the number of summed terms\r\n * * points must have at least that length\r\n * @param weights\r\n * @param points\r\n */\r\n public static sumWeightedY(weights: Float64Array, points: Point3d[]): number {\r\n let sum = 0.0;\r\n const n = weights.length;\r\n for (let i = 0; i < n; i++)\r\n sum += weights[i] * points[i].y;\r\n return sum;\r\n }\r\n\r\n /**\r\n * sum the weighted x components from a point array.\r\n * * weights.length is the number of summed terms\r\n * * points must have at least that length\r\n * @param weights\r\n * @param points\r\n */\r\n public static sumWeightedZ(weights: Float64Array, points: Point3d[]): number {\r\n let sum = 0.0;\r\n const n = weights.length;\r\n for (let i = 0; i < n; i++)\r\n sum += weights[i] * points[i].z;\r\n return sum;\r\n }\r\n\r\n private static _weightUVW = new Float64Array(8);\r\n private static _weightDU = new Float64Array(8);\r\n private static _weightDV = new Float64Array(8);\r\n private static _weightDW = new Float64Array(8);\r\n /**\r\n * Compute a point by trilinear mapping.\r\n * @param points array of 8 points at corners, with x index varying fastest.\r\n * @param result optional result point\r\n */\r\n public static evaluateTrilinearPoint(points: Point3d[], u: number, v: number, w: number, result?: Point3d): Point3d {\r\n if (!result) result = Point3d.create(0, 0, 0);\r\n this.evaluateTrilinearWeights(this._weightUVW, 1 - u, u, 1 - v, v, 1 - w, w);\r\n let a;\r\n for (let i = 0; i < 8; i++) {\r\n a = this._weightUVW[i];\r\n result.x += a * points[i].x;\r\n result.y += a * points[i].y;\r\n result.z += a * points[i].z;\r\n }\r\n return result;\r\n }\r\n /**\r\n * Compute a point and derivatives wrt uvw by trilinear mapping.\r\n * * evaluated point is the point part of the transform\r\n * * u,v,w derivatives are the respective columns of the matrix part of the transform.\r\n * @param points array of 8 points at corners, with x index varying fastest.\r\n * @param result optional result transform\r\n */\r\n public static evaluateTrilinearDerivativeTransform(points: Point3d[], u: number, v: number, w: number, result?: Transform): Transform {\r\n this.evaluateTrilinearWeights(this._weightUVW, 1 - u, u, 1 - v, v, 1 - w, w);\r\n this.evaluateTrilinearWeights(this._weightDU, -1, 1, 1 - v, v, 1 - w, w);\r\n this.evaluateTrilinearWeights(this._weightDV, 1 - u, u, -1, 1, 1 - w, w);\r\n this.evaluateTrilinearWeights(this._weightDW, 1 - u, u, 1 - v, v, -1, 1);\r\n return Transform.createRowValues(\r\n this.sumWeightedX(this._weightDU, points), this.sumWeightedX(this._weightDV, points), this.sumWeightedX(this._weightDW, points), this.sumWeightedX(this._weightUVW, points),\r\n this.sumWeightedY(this._weightDU, points), this.sumWeightedY(this._weightDV, points), this.sumWeightedY(this._weightDW, points), this.sumWeightedY(this._weightUVW, points),\r\n this.sumWeightedZ(this._weightDU, points), this.sumWeightedZ(this._weightDV, points), this.sumWeightedZ(this._weightDW, points), this.sumWeightedZ(this._weightUVW, points),\r\n result);\r\n }\r\n /** unpack from a number array or Float64Array to an array of `Point3d` */\r\n public static unpackNumbersToPoint3dArray(data: Float64Array | number[]): Point3d[] {\r\n const result = [];\r\n for (let i = 0; i + 2 < data.length; i += 3) {\r\n result.push(Point3d.create(data[i], data[i + 1], data[i + 2]));\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * return an 2-dimensional array containing all the values of `data` in arrays of numPerBlock\r\n * @param data simple array of numbers\r\n * @param numPerBlock number of values in each block at first level down\r\n */\r\n public static unpackNumbersToNestedArrays(data: Float64Array, numPerBlock: number): any[] {\r\n const result = [];\r\n const n = data.length;\r\n let i = 0;\r\n let i1 = 0;\r\n while (i < n) {\r\n // there is at least one more value for a block\r\n const row = [];\r\n i1 = i + numPerBlock;\r\n if (i1 > n)\r\n i1 = n;\r\n for (; i < i1; i++) {\r\n row.push(data[i]);\r\n }\r\n result.push(row);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * return an 3-dimensional array containing all the values of `data` in arrays numPerRow blocks of numPerBlock\r\n * @param data simple array of numbers\r\n * @param numPerBlock number of values in each block at first level down\r\n */\r\n public static unpackNumbersToNestedArraysIJK(data: Float64Array, numPerBlock: number, numPerRow: number): any[] {\r\n const result = [];\r\n const n = data.length;\r\n let i = 0;\r\n let i1 = 0;\r\n let i2;\r\n while (i < n) {\r\n const row = [];\r\n i2 = i + numPerBlock * numPerRow;\r\n while (i < i2) {\r\n const block = [];\r\n i1 = i + numPerBlock;\r\n if (i1 > n)\r\n i1 = n;\r\n for (; i < i1; i++) {\r\n block.push(data[i]);\r\n }\r\n row.push(block);\r\n }\r\n result.push(row);\r\n }\r\n return result;\r\n }\r\n /** multiply a transform times each x,y,z triple and replace the x,y,z in the packed array */\r\n public static multiplyInPlace(transform: Transform, xyz: Float64Array): void {\r\n const xyz1 = Point3d.create();\r\n const numXYZ = xyz.length;\r\n for (let i = 0; i + 2 < numXYZ; i += 3) {\r\n transform.multiplyXYZ(xyz[i], xyz[i + 1], xyz[i + 2], xyz1);\r\n xyz[i] = xyz1.x;\r\n xyz[i + 1] = xyz1.y;\r\n xyz[i + 2] = xyz1.z;\r\n }\r\n }\r\n /** Apply Geometry.isAlmostEqual to corresponding coordinates */\r\n public static isAlmostEqual(dataA: Point3d[] | Float64Array | undefined, dataB: Point3d[] | Float64Array | undefined): boolean {\r\n if (dataA && dataB) {\r\n if (dataA.length !== dataB.length)\r\n return false;\r\n if (dataA instanceof Float64Array && dataB instanceof Float64Array) {\r\n for (let i = 0; i < dataA.length; i++)\r\n if (!Geometry.isSameCoordinate(dataA[i], dataB[i]))\r\n return false;\r\n } else if (Array.isArray(dataA) && Array.isArray(dataB)) {\r\n for (let i = 0; i < dataA.length; i++)\r\n if (!dataA[i].isAlmostEqual(dataB[i]))\r\n return false;\r\n }\r\n return true;\r\n }\r\n // if both are null it is equal, otherwise unequal\r\n return (dataA === undefined && dataB === undefined);\r\n }\r\n\r\n /** return simple average of all coordinates. (000 if empty array) */\r\n public static centroid(points: IndexedXYZCollection | Point3d[], result?: Point3d): Point3d {\r\n if (points instanceof IndexedXYZCollection) {\r\n result = Point3d.create(0, 0, 0, result);\r\n const p = Point3d.create();\r\n if (points.length > 0) {\r\n for (let i = 0; i < points.length; i++) {\r\n points.getPoint3dAtCheckedPointIndex(i, p);\r\n result.x += p.x; result.y += p.y; result.z += p.z;\r\n }\r\n result.scaleInPlace(1.0 / points.length);\r\n }\r\n return result;\r\n }\r\n const carrier = new Point3dArrayCarrier(points);\r\n return this.centroid(carrier);\r\n }\r\n\r\n /** Return the index of the point most distant from spacePoint */\r\n public static indexOfMostDistantPoint(points: Point3d[], spacePoint: XYZ, farVector: Vector3d): number | undefined {\r\n if (points.length === 0)\r\n return undefined;\r\n let dMax = -1;\r\n let d;\r\n let result = -1;\r\n for (let i = 0; i < points.length; i++) {\r\n d = spacePoint.distance(points[i]);\r\n if (d > dMax) {\r\n spacePoint.vectorTo(points[i], farVector);\r\n dMax = d;\r\n result = i;\r\n }\r\n }\r\n return result;\r\n }\r\n /** return the index of the point whose vector from space point has the largest magnitude of cross product with given vector. */\r\n public static indexOfPointWithMaxCrossProductMagnitude(points: Point3d[], spacePoint: Point3d, vector: Vector3d, farVector: Vector3d): number | undefined {\r\n if (points.length === 0)\r\n return undefined;\r\n let dMax = -1;\r\n let d;\r\n let result = -1;\r\n let vectorAB; // to be reused in loop !!!\r\n for (let i = 0; i < points.length; i++) {\r\n vectorAB = spacePoint.vectorTo(points[i], vectorAB);\r\n d = vectorAB.crossProductMagnitude(vector);\r\n if (d > dMax) {\r\n farVector.setFrom(vectorAB);\r\n dMax = d;\r\n result = i;\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /** Return the index of the closest point in the array (full xyz) */\r\n public static closestPointIndex(data: XYAndZ[], spacePoint: XYAndZ): number {\r\n let index = -1;\r\n let dMin = Number.MAX_VALUE;\r\n let d;\r\n const x0 = spacePoint.x;\r\n const y0 = spacePoint.y;\r\n const z0 = spacePoint.z;\r\n for (let i = 0; i < data.length; i++) {\r\n d = Geometry.distanceXYZXYZ(x0, y0, z0, data[i].x, data[i].y, data[i].z);\r\n if (d < dMin) {\r\n index = i;\r\n dMin = d;\r\n }\r\n }\r\n return index;\r\n }\r\n /** return true iff all points' altitudes are within tolerance of the plane.*/\r\n public static isCloseToPlane(data: Point3d[] | Float64Array, plane: Plane3dByOriginAndUnitNormal, tolerance: number = Geometry.smallMetricDistance): boolean {\r\n if (Array.isArray(data)) {\r\n let xyz;\r\n for (xyz of data) {\r\n if (Math.abs(plane.altitude(xyz)) > tolerance)\r\n return false;\r\n }\r\n } else if (data instanceof Float64Array) {\r\n const numXYZ = data.length;\r\n for (let i = 0; i + 2 < numXYZ; i += 3) {\r\n if (Math.abs(plane.altitudeXYZ(data[i], data[i + 1], data[i + 2])) > tolerance)\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Sum lengths of edges.\r\n * @param data points.\r\n */\r\n public static sumEdgeLengths(data: Point3d[] | Float64Array, addClosureEdge: boolean = false, maxPointsToUse?: number): number {\r\n let sum = 0.0;\r\n\r\n if (Array.isArray(data)) {\r\n const n = selectOptionalClampedMin (data.length, maxPointsToUse, 1) - 1;\r\n for (let i = 0; i < n; i++) sum += data[i].distance(data[i + 1]);\r\n if (addClosureEdge && n > 0)\r\n sum += data[0].distance(data[n]);\r\n\r\n } else if (data instanceof Float64Array) {\r\n const numXYZ = selectOptionalClampedMin (data.length, maxPointsToUse, 3);\r\n let i = 0;\r\n for (; i + 5 < numXYZ; i += 3) { // final i points at final point x\r\n sum += Geometry.hypotenuseXYZ(data[i + 3] - data[i],\r\n data[i + 4] - data[i + 1],\r\n data[i + 5] - data[i + 2]);\r\n }\r\n if (addClosureEdge && i >= 3) {\r\n sum += Geometry.hypotenuseXYZ(data[0] - data[i],\r\n data[1] - data[i + 1],\r\n data[2] - data[i + 2]);\r\n }\r\n }\r\n return sum;\r\n }\r\n\r\n /**\r\n * Count the number of points, but ...\r\n * * ignore trailing duplicates of point 0.\r\n * * return 0 if there are any duplicates within the remaining points.\r\n * @param points points to examine.\r\n */\r\n public static countNonDuplicates(points: Point3d[], tolerance: number = Geometry.smallMetricDistance): number {\r\n let n = points.length;\r\n // strip of (allow) trailing duplicates ...\r\n while (n > 1){\r\n if (points[0].isAlmostEqual (points[n-1], tolerance))\r\n n--;\r\n else\r\n break;\r\n }\r\n for (let i = 0; i+1 < n; i++)\r\n if (points[i].isAlmostEqual (points[i+1], tolerance))\r\n return 0;\r\n return n;\r\n }\r\n\r\n /**\r\n * Return an array containing clones of the Point3d data[]\r\n * @param data source data\r\n */\r\n public static clonePoint3dArray(data: XYZProps[] | Float64Array): Point3d[] {\r\n const result: Point3d[] = [];\r\n if (data.length === 0)\r\n return result;\r\n if (data instanceof Float64Array) {\r\n for (let i = 0; i + 2 < data.length; i += 3)\r\n result.push(Point3d.create(data[i], data[i + 1], data[i + 2]));\r\n return result;\r\n }\r\n for (const p of data) {\r\n if (Array.isArray(p))\r\n result.push(Point3d.create(p[0], p[1], p[2]));\r\n else\r\n result.push(Point3d.create(p.x, p.y, p.z));\r\n }\r\n return result;\r\n }\r\n /**\r\n * Return an array containing Point2d with xy parts of each Point3d\r\n * @param data source data\r\n */\r\n public static clonePoint2dArray(data: XYAndZ[]): Point2d[] {\r\n return data.map((p: XYAndZ) => Point2d.create(p.x, p.y));\r\n }\r\n /**\r\n * clone points in the input array, inserting points within each edge to limit edge length.\r\n * @param points array of points\r\n * @param maxEdgeLength max length of an edge\r\n */\r\n public static cloneWithMaxEdgeLength(points: Point3d[], maxEdgeLength: number): Point3d[] {\r\n if (points.length === 0)\r\n return [];\r\n const result = [points[0]];\r\n for (let i = 1; i < points.length; i++) {\r\n const a = points[i - 1].distance(points[i]);\r\n const n = Geometry.stepCount(maxEdgeLength, a, 1);\r\n for (let k = 1; k < n; k++)\r\n result.push(points[i - 1].interpolate(k / n, points[i]));\r\n result.push(points[i]);\r\n\r\n }\r\n return result;\r\n }\r\n /** Pack isolated x,y,z args as a json `[x,y,z]` */\r\n private static xyzToArray(x: number, y: number, z: number): number[] { return [x, y, z]; }\r\n\r\n /**\r\n * return similarly-structured array, array of arrays, etc, with the lowest level point data specifically structured as arrays of 3 numbers `[1,2,3]`\r\n * @param data point data with various leaf forms such as `[1,2,3]`, `{x:1,y:2,z:3}`, `Point3d`\r\n */\r\n public static cloneDeepJSONNumberArrays(data: MultiLineStringDataVariant): number[][] {\r\n const collector = new PointStringDeepXYZArrayCollector(this.xyzToArray);\r\n VariantPointDataStream.streamXYZ(data, collector);\r\n return collector.claimResult();\r\n }\r\n /**\r\n * clone an array of [[XYZProps]] data, specifically as arrays of 3 numbers\r\n */\r\n public static cloneXYZPropsAsNumberArray(data: XYZProps[]): number[][] {\r\n // data is an array ... each member is either Point3d or [x,y,z]\r\n const result = [];\r\n for (const p of data) {\r\n if (p instanceof Point3d) {\r\n result.push([p.x, p.y, p.z]);\r\n } else if (Array.isArray(p)) {\r\n result.push([p[0], p[1], p.length > 2 ? p[2] : 0.0]);\r\n }\r\n }\r\n return result;\r\n }\r\n /**\r\n * clone an array of [[XYZProps]] data, specifically as flattened array of number\r\n */\r\n public static cloneXYZPropsAsFloat64Array(data: XYZProps[]): Float64Array {\r\n const result = new Float64Array(data.length * 3);\r\n let i = 0;\r\n for (const p of data) {\r\n if (p instanceof Point3d) {\r\n result[i++] = p.x;\r\n result[i++] = p.y;\r\n result[i++] = p.z;\r\n } else if (Array.isArray(p)) {\r\n result[i++] = p[0];\r\n result[i++] = p[1];\r\n result[i++] = p.length > 2 ? p[2] : 0.0; // allow missing z\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * return similarly-structured array, array of arrays, etc, with the lowest level point data specifically structured as `Point3d`.\r\n * @param data point data with various leaf forms such as `[1,2,3]`, `{x:1,y:2,z:3}`, `Point3d`\r\n */\r\n public static cloneDeepXYZPoint3dArrays(data: MultiLineStringDataVariant): any[] {\r\n const collector = new PointStringDeepXYZArrayCollector(Point3d.create);\r\n VariantPointDataStream.streamXYZ(data, collector);\r\n return collector.claimResult();\r\n }\r\n\r\n /**\r\n * return perpendicular distance from points[indexB] to the segment points[indexA] to points[indexC].\r\n * * extrapolation option when projection is outside of fraction range 0..1 are:\r\n * * false ==> measure distance to closest endpoint\r\n * * true ==> measure distance to extended line segment.\r\n * (no index checking!)\r\n */\r\n public static distanceIndexedPointBToSegmentAC(points: Point3d[], indexA: number, indexB: number, indexC: number, extrapolate: boolean): number {\r\n const vectorU = Vector3d.createStartEnd(points[indexA], points[indexC]);\r\n const vectorV = Vector3d.createStartEnd(points[indexA], points[indexB]);\r\n const uDotU = vectorU.dotProduct(vectorU);\r\n const uDotV = vectorU.dotProduct(vectorV);\r\n let fraction = Geometry.conditionalDivideFraction(uDotV, uDotU);\r\n if (fraction === undefined)\r\n fraction = 0.0;\r\n if (!extrapolate) {\r\n if (fraction > 1.0)\r\n fraction = 1.0;\r\n if (fraction < 0.0)\r\n fraction = 0.0;\r\n }\r\n let h2 = vectorV.magnitudeSquared() - fraction * fraction * uDotU;\r\n // h2 should never be negative except for quirky tolerance ..\r\n if (h2 < 0.0)\r\n h2 = 0.0;\r\n return Math.sqrt(h2);\r\n }\r\n\r\n /** Computes the hull of the XY projection of points.\r\n * * Returns the hull as an array of Point3d\r\n * * Optionally returns non-hull points in `insidePoints[]`\r\n * * If both arrays empty if less than 3 points.\r\n * *\r\n */\r\n public static computeConvexHullXY(points: Point3d[], hullPoints: Point3d[], insidePoints: Point3d[], addClosurePoint: boolean = false) {\r\n hullPoints.length = 0;\r\n insidePoints.length = 0;\r\n let n = points.length;\r\n // Get deep copy\r\n const xy1: Point3d[] = points.slice(0, n);\r\n xy1.sort(Geometry.lexicalXYLessThan);\r\n if (n < 3) {\r\n for (const p of xy1)\r\n hullPoints.push(p);\r\n if (addClosurePoint && xy1.length > 0)\r\n hullPoints.push(xy1[0]);\r\n return;\r\n }\r\n hullPoints.push(xy1[0]); // This is sure to stay\r\n hullPoints.push(xy1[1]); // This one can be removed in loop.\r\n let numInside = 0;\r\n // First sweep creates upper hull\r\n for (let i = 2; i < n; i++) {\r\n const candidate = xy1[i];\r\n let top = hullPoints.length - 1;\r\n while (top >= 1 && hullPoints[top - 1].crossProductToPointsXY(hullPoints[top], candidate) <= 0.0) {\r\n xy1[numInside++] = hullPoints[top];\r\n top--;\r\n hullPoints.pop();\r\n }\r\n hullPoints.push(candidate);\r\n }\r\n const i0 = hullPoints.length - 1;\r\n xy1.length = numInside;\r\n xy1.push(hullPoints[0]); // force first point to be reconsidered as final hull point.\r\n xy1.sort(Geometry.lexicalXYLessThan);\r\n n = xy1.length;\r\n // xy1.back () is already on stack.\r\n hullPoints.push(xy1[n - 1]);\r\n for (let i = n - 1; i-- > 0;) {\r\n const candidate = xy1[i];\r\n let top = hullPoints.length - 1;\r\n while (top > i0 && hullPoints[top - 1].crossProductToPointsXY(hullPoints[top], candidate) <= 0.0) {\r\n insidePoints.push(hullPoints[top]);\r\n top--;\r\n hullPoints.pop();\r\n }\r\n if (i > 0) // don't replicate start !!!\r\n hullPoints.push(candidate);\r\n }\r\n if (addClosurePoint)\r\n hullPoints.push(hullPoints[0]);\r\n }\r\n /**\r\n * Return (clones of) points in data[] with min and max x and y parts.\r\n * @param data array to examine.\r\n */\r\n public static minMaxPoints(data: Point3d[]): { minXPoint: Point3d, maxXPoint: Point3d, minYPoint: Point3d, maxYPoint: Point3d } | undefined {\r\n if (data.length === 0)\r\n return undefined;\r\n const result = { minXPoint: data[0].clone(), maxXPoint: data[0].clone(), minYPoint: data[0].clone(), maxYPoint: data[0].clone() };\r\n let q;\r\n for (let i = 1; i < data.length; i++) {\r\n q = data[i];\r\n if (q.x < result.minXPoint.x) result.minXPoint.setFromPoint3d(q);\r\n if (q.x > result.maxXPoint.x) result.maxXPoint.setFromPoint3d(q);\r\n if (q.y < result.minYPoint.y) result.minYPoint.setFromPoint3d(q);\r\n if (q.y > result.maxYPoint.y) result.maxYPoint.setFromPoint3d(q);\r\n }\r\n return result;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"PointHelpers.js","sourceRoot":"","sources":["../../../src/geometry3d/PointHelpers.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/* eslint-disable @typescript-eslint/naming-convention, no-empty */\r\nimport { Geometry } from \"../Geometry\";\r\nimport { Point4d } from \"../geometry4d/Point4d\";\r\nimport { MultiLineStringDataVariant } from \"../topology/Triangulation\";\r\nimport { IndexedXYZCollection } from \"./IndexedXYZCollection\";\r\nimport { Plane3dByOriginAndUnitNormal } from \"./Plane3dByOriginAndUnitNormal\";\r\nimport { Point2d } from \"./Point2dVector2d\";\r\nimport { Point3dArrayCarrier } from \"./Point3dArrayCarrier\";\r\nimport { Point3d, Vector3d, XYZ } from \"./Point3dVector3d\";\r\nimport { PointStringDeepXYZArrayCollector, VariantPointDataStream } from \"./PointStreaming\";\r\nimport { Transform } from \"./Transform\";\r\nimport { XAndY, XYAndZ, XYZProps } from \"./XYZProps\";\r\n\r\n/**\r\n *\r\n * @param numA first candidate -- presumed 0 or positive\r\n * @param numB second candidate -- may be undefined, invalid if outside closed interval 0..numA\r\n * @param multiplyBy second candidate multiplier (applied only if candidate is defined)\r\n */\r\nfunction selectOptionalClampedMin(numA: number, numB: number | undefined, multiplyBy: number): number {\r\n\r\n if (numB !== undefined){\r\n const numC = numB * multiplyBy;\r\n if (numC >= 0 && numC <= numA)\r\n return numC;\r\n }\r\n return numA;\r\n}\r\n/**\r\n * The `NumberArray` class contains static methods that act on arrays of numbers.\r\n * @public\r\n */\r\nexport class NumberArray {\r\n /** return the sum of values in an array, The summation is done with correction terms which\r\n * improves last-bit numeric accuracy.\r\n */\r\n public static preciseSum(data: number[]): number {\r\n const n = data.length;\r\n if (n === 0)\r\n return 0.0;\r\n let sum = data[0];\r\n let c = 0.0;\r\n let y: number;\r\n let t: number;\r\n for (let i = 1; i < n; i++) {\r\n y = data[i] - c;\r\n t = sum + y;\r\n c = (t - sum) - y;\r\n sum = t;\r\n }\r\n return sum;\r\n }\r\n /** Return true if arrays have identical counts and equal entries (using `!==` comparison) */\r\n public static isExactEqual(dataA: any[] | Float64Array | undefined, dataB: any[] | Float64Array | undefined): boolean {\r\n if (dataA && dataB) {\r\n if (dataA.length !== dataB.length)\r\n return false;\r\n for (let i = 0; i < dataA.length; i++)\r\n if (dataA[i] !== dataB[i])\r\n return false;\r\n return true;\r\n }\r\n return (dataA === undefined && dataB === undefined);\r\n }\r\n /** Return true if arrays have identical counts and entries equal within tolerance */\r\n public static isAlmostEqual(\r\n dataA: number[] | Float64Array | undefined,\r\n dataB: number[] | Float64Array | undefined,\r\n tolerance: number): boolean {\r\n if (dataA && dataB) {\r\n if (dataA.length !== dataB.length)\r\n return false;\r\n for (let i = 0; i < dataA.length; i++)\r\n if (Math.abs(dataA[i] - dataB[i]) >= tolerance) return false;\r\n return true;\r\n }\r\n return (dataA === undefined && dataB === undefined);\r\n }\r\n\r\n /** return the sum of numbers in an array. Note that \"PreciseSum\" may be more accurate. */\r\n public static sum(data: number[] | Float64Array): number {\r\n let sum = 0;\r\n for (const x of data) { sum += x; }\r\n return sum;\r\n }\r\n /** test if coordinate x appears (to tolerance by `Geometry.isSameCoordinate`) in this array of numbers */\r\n public static isCoordinateInArray(x: number, data: number[] | undefined): boolean {\r\n if (data) {\r\n for (const y of data) { if (Geometry.isSameCoordinate(x, y)) return true; }\r\n }\r\n return false;\r\n }\r\n /** Return the max absolute value in a array of numbers. */\r\n public static maxAbsArray(values: number[]): number {\r\n const arrLen = values.length;\r\n if (arrLen === 0) {\r\n return 0.0;\r\n }\r\n let a = Math.abs(values[0]);\r\n for (let i = 1; i < arrLen; i++) {\r\n const b = Math.abs(values[i]);\r\n if (a < b) {\r\n a = b;\r\n }\r\n }\r\n return a;\r\n }\r\n /** return the max absolute value of a pair of numbers */\r\n public static maxAbsTwo(a1: number, a2: number): number {\r\n a1 = Math.abs(a1);\r\n a2 = Math.abs(a2);\r\n return (a1 > a2) ? a1 : a2;\r\n }\r\n /** Return the max absolute difference between corresponding entries in two arrays of numbers\r\n * * If sizes are mismatched, only the smaller length is tested.\r\n */\r\n public static maxAbsDiff(dataA: number[] | Float64Array, dataB: number[] | Float64Array): number {\r\n let a = 0.0;\r\n const n = Math.min(dataA.length, dataB.length);\r\n for (let i = 0; i < n; i++) { a = Math.max(a, Math.abs(dataA[i] - dataB[i])); }\r\n return a;\r\n }\r\n\r\n /** Return the max absolute difference between corresponding entries in two Float64Array\r\n * * If sizes are mismatched, only the smaller length is tested.\r\n */\r\n public static maxAbsDiffFloat64(dataA: Float64Array, dataB: Float64Array): number {\r\n let a = 0.0;\r\n const n = Math.min(dataA.length, dataB.length);\r\n for (let i = 0; i < n; i++) { a = Math.max(a, Math.abs(dataA[i] - dataB[i])); }\r\n return a;\r\n }\r\n /**\r\n * Return an array with indicated start and end points, maximum step size internally\r\n * @param low low value\r\n * @param high high value\r\n * @param step max permitted step\r\n */\r\n public static createArrayWithMaxStepSize(low: number, high: number, step: number): number[] {\r\n if (low === high)\r\n return [low];\r\n const delta = high - low;\r\n const numInterval = Math.max(1, Math.floor(Math.abs(delta / step)));\r\n const result = [];\r\n result.push(low);\r\n for (let i = 1; i < numInterval; i++) {\r\n result.push(low + (i / numInterval) * delta);\r\n }\r\n result.push(high);\r\n return result;\r\n }\r\n\r\n /** copy numbers from variant sources to number[]. */\r\n public static create(source: number[] | Float64Array): number[] {\r\n const result: number[] = [];\r\n for (const q of source)\r\n result.push(q);\r\n return result;\r\n }\r\n\r\n /** Return a copy of the knots array, with multiplicity of first and last knots raised or lowered to expectedMultiplicity. */\r\n public static cloneWithStartAndEndMultiplicity(knots: number[] | undefined, target0: number, target1: number): number[] {\r\n const result: number[] = [];\r\n if (knots === undefined || knots.length === 0)\r\n return result;\r\n let multiplicity0 = 1;\r\n const knot0 = knots[0];\r\n const knot1 = knots[knots.length - 1];\r\n for (; multiplicity0 < knots.length && knots[multiplicity0] === knot0;) { multiplicity0++; }\r\n let multiplicity1 = 1;\r\n const k1 = knots.length - 1;\r\n for (; k1 - multiplicity1 >= 0 && knots[k1 - multiplicity1] === knot1;) { multiplicity1++; }\r\n\r\n for (let k = 0; k < target0; k++)\r\n result.push(knot0);\r\n for (let k = multiplicity0; k + multiplicity1 < knots.length; k++)\r\n result.push(knots[k]);\r\n for (let k = 0; k < target1; k++)\r\n result.push(knot1);\r\n return result;\r\n }\r\n\r\n /** Compute the linear combination s of the numbers and scales.\r\n * @param data array of numbers d_i.\r\n * @param scales array of scales s_i. For best results, `scales` should have the same length as `data`.\r\n * @return s = sum(d_i * s_i), where i ranges from 0 to min(data.length, scales.length).\r\n */\r\n public static linearCombination(data: number[], scales: number[]): number {\r\n const numTerms = Math.min(data.length, scales.length);\r\n let sum = 0;\r\n for (let i = 0; i < numTerms; ++i)\r\n sum += scales[i] * data[i];\r\n return sum;\r\n }\r\n\r\n /** Compute the linear combination s of the colors and scales.\r\n * * The result is another color if the scales are in [0,1] and sum to 1.\r\n * @param colors array of colors c_i (rgba in first four bytes).\r\n * @param scales array of scales s_i. For best results, `scales` should have the same length as `colors`.\r\n * @return s = sum(c_i * s_i), where i ranges from 0 to min(colors.length, scales.length).\r\n */\r\n public static linearCombinationOfColors(colors: number[], scales: number[]): number {\r\n const numTerms = Math.min(colors.length, scales.length);\r\n const bytes = [0,0,0,0];\r\n // compute a convex combination of each byte\r\n for (let iByte = 0, shiftBits = 0; iByte < 4; ++iByte, shiftBits += 8) {\r\n for (let iTerm = 0; iTerm < numTerms; ++iTerm) {\r\n const fraction = Geometry.clamp(scales[iTerm], 0, 1); // chop slop\r\n const colorComponent = (colors[iTerm] >>> shiftBits) & 0xFF;\r\n bytes[iByte] += fraction * colorComponent;\r\n }\r\n bytes[iByte] = (Math.floor(bytes[iByte]) & 0xFF) << shiftBits;\r\n }\r\n return bytes[0] | bytes[1] | bytes[2] | bytes[3];\r\n }\r\n}\r\n\r\n/**\r\n * The `Point2dArray` class contains static methods that act on arrays of 2d points.\r\n * @public\r\n */\r\nexport class Point2dArray {\r\n /** Return true if arrays have same length and matching coordinates. */\r\n public static isAlmostEqual(dataA: undefined | Point2d[], dataB: undefined | Point2d[]): boolean {\r\n if (dataA && dataB) {\r\n if (dataA.length !== dataB.length)\r\n return false;\r\n for (let i = 0; i < dataA.length; i++) {\r\n if (!dataA[i].isAlmostEqual(dataB[i]))\r\n return false;\r\n }\r\n return true;\r\n }\r\n return (dataA === undefined && dataB === undefined);\r\n }\r\n /**\r\n * Return an array containing clones of the Point3d data[]\r\n * @param data source data\r\n */\r\n public static clonePoint2dArray(data: Point2d[]): Point2d[] {\r\n return data.map((p: Point2d) => p.clone());\r\n }\r\n /**\r\n * Return the number of points when trailing points that match point 0 are excluded.\r\n * @param data array of XAndY points.\r\n */\r\n public static pointCountExcludingTrailingWraparound(data: XAndY[]): number {\r\n let n = data.length;\r\n if (n < 2)\r\n return n;\r\n const x0 = data[0].x;\r\n const y0 = data[0].y;\r\n while (n > 1) {\r\n if (!Geometry.isSameCoordinate(data[n - 1].x, x0) || !Geometry.isSameCoordinate(data[n - 1].y, y0))\r\n return n;\r\n n--;\r\n }\r\n return n;\r\n }\r\n\r\n}\r\n\r\n/**\r\n * The `Vector3dArray` class contains static methods that act on arrays of 3d vectors.\r\n * @public\r\n */\r\nexport class Vector3dArray {\r\n /** Return true if arrays have same length and matching coordinates. */\r\n public static isAlmostEqual(dataA: undefined | Vector3d[], dataB: undefined | Vector3d[]): boolean {\r\n if (dataA && dataB) {\r\n if (dataA.length !== dataB.length)\r\n return false;\r\n for (let i = 0; i < dataA.length; i++)\r\n if (!dataA[i].isAlmostEqual(dataB[i]))\r\n return false;\r\n return true;\r\n }\r\n return (dataA === undefined && dataB === undefined);\r\n }\r\n /**\r\n * Return an array containing clones of the Vector3d data[]\r\n * @param data source data\r\n */\r\n public static cloneVector3dArray(data: XYAndZ[]): Vector3d[] {\r\n return data.map((p: XYAndZ) => Vector3d.create(p.x, p.y, p.z));\r\n }\r\n}\r\n\r\n/**\r\n * The `Point4dArray` class contains static methods that act on arrays of 4d points.\r\n * @public\r\n */\r\nexport class Point4dArray {\r\n /** pack each point and its corresponding weight into a buffer of xyzw xyzw ... */\r\n public static packPointsAndWeightsToFloat64Array(data: Point3d[] | Float64Array | number[], weights: number[] | Float64Array,\r\n result?: Float64Array): Float64Array | undefined {\r\n if (Array.isArray(data) && data[0] instanceof Point3d) {\r\n const points = data as Point3d[];\r\n if (points.length !== weights.length)\r\n return undefined;\r\n result = result ? result : new Float64Array(4 * points.length);\r\n let i = 0;\r\n let k = 0;\r\n for (k = 0; k < points.length; k++) {\r\n result[i++] = points[k].x;\r\n result[i++] = points[k].y;\r\n result[i++] = points[k].z;\r\n result[i++] = weights[k];\r\n }\r\n return result;\r\n } else {\r\n const points = data as (Float64Array | number[]);\r\n const numPoints = weights.length;\r\n if (points.length !== 3 * numPoints)\r\n return undefined;\r\n let i = 0; let k;\r\n result = result ? result : new Float64Array(4 * numPoints);\r\n for (k = 0; k < numPoints; k++) {\r\n const k0 = 3 * k;\r\n result[i++] = points[k0];\r\n result[i++] = points[k0 + 1];\r\n result[i++] = points[k0 + 2];\r\n result[i++] = weights[k];\r\n }\r\n return result;\r\n }\r\n return undefined;\r\n }\r\n\r\n /** pack x,y,z,w in Float64Array. */\r\n public static packToFloat64Array(data: Point4d[], result?: Float64Array): Float64Array {\r\n result = result ? result : new Float64Array(4 * data.length);\r\n let i = 0;\r\n for (const p of data) {\r\n result[i++] = p.x;\r\n result[i++] = p.y;\r\n result[i++] = p.z;\r\n result[i++] = p.w;\r\n }\r\n return result;\r\n }\r\n /** unpack from ... to array of Point4d */\r\n public static unpackToPoint4dArray(data: Float64Array): Point4d[] {\r\n const result = [];\r\n for (let i = 0; i + 3 < data.length; i += 4) {\r\n result.push(Point4d.create(data[i], data[i + 1], data[i + 2], data[i + 3]));\r\n }\r\n return result;\r\n }\r\n /** unpack from xyzw xyzw... array to array of Point3d and array of weight.\r\n */\r\n public static unpackFloat64ArrayToPointsAndWeights(data: Float64Array, points: Point3d[], weights: number[],\r\n pointFormatter: (x: number, y: number, z: number) => any = Point3d.create) {\r\n points.length = 0;\r\n weights.length = 0;\r\n for (let i = 0; i + 3 < data.length; i += 4) {\r\n points.push(pointFormatter(data[i], data[i + 1], data[i + 2]));\r\n weights.push(data[i + 3]);\r\n }\r\n }\r\n private static _workPoint4d = Point4d.create();\r\n /**\r\n * Multiply (and replace) each block of 4 values as a Point4d.\r\n * @param transform transform to apply\r\n * @param xyzw array of x,y,z,w points.\r\n */\r\n public static multiplyInPlace(transform: Transform, xyzw: Float64Array): void {\r\n const numXYZW = xyzw.length;\r\n const xyzw1 = Point4dArray._workPoint4d;\r\n for (let i = 0; i + 3 < numXYZW; i += 4) {\r\n transform.multiplyXYZW(xyzw[i], xyzw[i + 1], xyzw[i + 2], xyzw[i + 3], xyzw1);\r\n xyzw[i] = xyzw1.x;\r\n xyzw[i + 1] = xyzw1.y;\r\n xyzw[i + 2] = xyzw1.z;\r\n xyzw[i + 3] = xyzw1.w;\r\n }\r\n }\r\n /** test for near equality of all corresponding numeric values, treated as coordinates. */\r\n public static isAlmostEqual(dataA: Point4d[] | Float64Array | undefined, dataB: Point4d[] | Float64Array | undefined): boolean {\r\n if (dataA && dataB) {\r\n if (dataA.length !== dataB.length)\r\n return false;\r\n if (dataA instanceof Float64Array && dataB instanceof Float64Array) {\r\n for (let i = 0; i < dataA.length; i++)\r\n if (!Geometry.isSameCoordinate(dataA[i], dataB[i]))\r\n return false;\r\n } else if (Array.isArray(dataA) && Array.isArray(dataB)) {\r\n for (let i = 0; i < dataA.length; i++)\r\n if (!dataA[i].isAlmostEqual(dataB[i]))\r\n return false;\r\n }\r\n return true;\r\n }\r\n // if both are null it is equal, otherwise unequal\r\n return (dataA === undefined && dataB === undefined);\r\n }\r\n /** return true iff all xyzw points' altitudes are within tolerance of the plane.*/\r\n public static isCloseToPlane(data: Point4d[] | Float64Array, plane: Plane3dByOriginAndUnitNormal, tolerance: number = Geometry.smallMetricDistance): boolean {\r\n if (Array.isArray(data)) {\r\n for (const xyzw of data) {\r\n if (Math.abs(plane.altitudeXYZW(xyzw.x, xyzw.y, xyzw.z, xyzw.w)) > tolerance)\r\n return false;\r\n }\r\n } else if (data instanceof Float64Array) {\r\n const numXYZ = data.length;\r\n for (let i = 0; i + 2 < numXYZ; i += 4) {\r\n if (Math.abs(plane.altitudeXYZW(data[i], data[i + 1], data[i + 2], data[i + 3])) > tolerance)\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n}\r\n/**\r\n * The `Point3dArray` class contains static methods that act on arrays of 3d points.\r\n * @public\r\n */\r\n\r\nexport class Point3dArray {\r\n /** pack x,y,z to `Float64Array` */\r\n public static packToFloat64Array(data: Point3d[]): Float64Array {\r\n const result = new Float64Array(3 * data.length);\r\n let i = 0;\r\n for (const p of data) {\r\n result[i++] = p.x;\r\n result[i++] = p.y;\r\n result[i++] = p.z;\r\n }\r\n return result;\r\n }\r\n /**\r\n * Compute the 8 weights of trilinear mapping\r\n * By appropriate choice of weights, this can be used for both point and derivative mappings.\r\n * @param weights preallocated array to receive weights.\r\n * @param u0 low u weight\r\n * @param u1 high u weight\r\n * @param v0 low v weight\r\n * @param v1 high v weight\r\n * @param w0 low w weight\r\n * @param w1 high w weight\r\n */\r\n public static evaluateTrilinearWeights(weights: Float64Array, u0: number, u1: number, v0: number, v1: number, w0: number, w1: number) {\r\n\r\n weights[0] = u0 * v0 * w0;\r\n weights[1] = u1 * v0 * w0;\r\n weights[2] = u0 * v1 * w0;\r\n weights[3] = u1 * v1 * w0;\r\n weights[4] = u0 * v0 * w1;\r\n weights[5] = u1 * v0 * w1;\r\n weights[6] = u0 * v1 * w1;\r\n weights[7] = u1 * v1 * w1;\r\n }\r\n /**\r\n * sum the weighted x components from a point array.\r\n * * weights.length is the number of summed terms\r\n * * points must have at least that length\r\n * @param weights\r\n * @param points\r\n */\r\n public static sumWeightedX(weights: Float64Array, points: Point3d[]): number {\r\n let sum = 0.0;\r\n const n = weights.length;\r\n for (let i = 0; i < n; i++)\r\n sum += weights[i] * points[i].x;\r\n return sum;\r\n }\r\n\r\n /**\r\n * sum the weighted x components from a point array.\r\n * * weights.length is the number of summed terms\r\n * * points must have at least that length\r\n * @param weights\r\n * @param points\r\n */\r\n public static sumWeightedY(weights: Float64Array, points: Point3d[]): number {\r\n let sum = 0.0;\r\n const n = weights.length;\r\n for (let i = 0; i < n; i++)\r\n sum += weights[i] * points[i].y;\r\n return sum;\r\n }\r\n\r\n /**\r\n * sum the weighted x components from a point array.\r\n * * weights.length is the number of summed terms\r\n * * points must have at least that length\r\n * @param weights\r\n * @param points\r\n */\r\n public static sumWeightedZ(weights: Float64Array, points: Point3d[]): number {\r\n let sum = 0.0;\r\n const n = weights.length;\r\n for (let i = 0; i < n; i++)\r\n sum += weights[i] * points[i].z;\r\n return sum;\r\n }\r\n\r\n private static _weightUVW = new Float64Array(8);\r\n private static _weightDU = new Float64Array(8);\r\n private static _weightDV = new Float64Array(8);\r\n private static _weightDW = new Float64Array(8);\r\n /**\r\n * Compute a point by trilinear mapping.\r\n * @param points array of 8 points at corners, with x index varying fastest.\r\n * @param result optional result point\r\n */\r\n public static evaluateTrilinearPoint(points: Point3d[], u: number, v: number, w: number, result?: Point3d): Point3d {\r\n if (!result) result = Point3d.create(0, 0, 0);\r\n this.evaluateTrilinearWeights(this._weightUVW, 1 - u, u, 1 - v, v, 1 - w, w);\r\n let a;\r\n for (let i = 0; i < 8; i++) {\r\n a = this._weightUVW[i];\r\n result.x += a * points[i].x;\r\n result.y += a * points[i].y;\r\n result.z += a * points[i].z;\r\n }\r\n return result;\r\n }\r\n /**\r\n * Compute a point and derivatives wrt uvw by trilinear mapping.\r\n * * evaluated point is the point part of the transform\r\n * * u,v,w derivatives are the respective columns of the matrix part of the transform.\r\n * @param points array of 8 points at corners, with x index varying fastest.\r\n * @param result optional result transform\r\n */\r\n public static evaluateTrilinearDerivativeTransform(points: Point3d[], u: number, v: number, w: number, result?: Transform): Transform {\r\n this.evaluateTrilinearWeights(this._weightUVW, 1 - u, u, 1 - v, v, 1 - w, w);\r\n this.evaluateTrilinearWeights(this._weightDU, -1, 1, 1 - v, v, 1 - w, w);\r\n this.evaluateTrilinearWeights(this._weightDV, 1 - u, u, -1, 1, 1 - w, w);\r\n this.evaluateTrilinearWeights(this._weightDW, 1 - u, u, 1 - v, v, -1, 1);\r\n return Transform.createRowValues(\r\n this.sumWeightedX(this._weightDU, points), this.sumWeightedX(this._weightDV, points), this.sumWeightedX(this._weightDW, points), this.sumWeightedX(this._weightUVW, points),\r\n this.sumWeightedY(this._weightDU, points), this.sumWeightedY(this._weightDV, points), this.sumWeightedY(this._weightDW, points), this.sumWeightedY(this._weightUVW, points),\r\n this.sumWeightedZ(this._weightDU, points), this.sumWeightedZ(this._weightDV, points), this.sumWeightedZ(this._weightDW, points), this.sumWeightedZ(this._weightUVW, points),\r\n result);\r\n }\r\n /** unpack from a number array or Float64Array to an array of `Point3d` */\r\n public static unpackNumbersToPoint3dArray(data: Float64Array | number[]): Point3d[] {\r\n const result = [];\r\n for (let i = 0; i + 2 < data.length; i += 3) {\r\n result.push(Point3d.create(data[i], data[i + 1], data[i + 2]));\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * return an 2-dimensional array containing all the values of `data` in arrays of numPerBlock\r\n * @param data simple array of numbers\r\n * @param numPerBlock number of values in each block at first level down\r\n */\r\n public static unpackNumbersToNestedArrays(data: Float64Array, numPerBlock: number): any[] {\r\n const result = [];\r\n const n = data.length;\r\n let i = 0;\r\n let i1 = 0;\r\n while (i < n) {\r\n // there is at least one more value for a block\r\n const row = [];\r\n i1 = i + numPerBlock;\r\n if (i1 > n)\r\n i1 = n;\r\n for (; i < i1; i++) {\r\n row.push(data[i]);\r\n }\r\n result.push(row);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * return an 3-dimensional array containing all the values of `data` in arrays numPerRow blocks of numPerBlock\r\n * @param data simple array of numbers\r\n * @param numPerBlock number of values in each block at first level down\r\n */\r\n public static unpackNumbersToNestedArraysIJK(data: Float64Array, numPerBlock: number, numPerRow: number): any[] {\r\n const result = [];\r\n const n = data.length;\r\n let i = 0;\r\n let i1 = 0;\r\n let i2;\r\n while (i < n) {\r\n const row = [];\r\n i2 = i + numPerBlock * numPerRow;\r\n while (i < i2) {\r\n const block = [];\r\n i1 = i + numPerBlock;\r\n if (i1 > n)\r\n i1 = n;\r\n for (; i < i1; i++) {\r\n block.push(data[i]);\r\n }\r\n row.push(block);\r\n }\r\n result.push(row);\r\n }\r\n return result;\r\n }\r\n /** multiply a transform times each x,y,z triple and replace the x,y,z in the packed array */\r\n public static multiplyInPlace(transform: Transform, xyz: Float64Array): void {\r\n const xyz1 = Point3d.create();\r\n const numXYZ = xyz.length;\r\n for (let i = 0; i + 2 < numXYZ; i += 3) {\r\n transform.multiplyXYZ(xyz[i], xyz[i + 1], xyz[i + 2], xyz1);\r\n xyz[i] = xyz1.x;\r\n xyz[i + 1] = xyz1.y;\r\n xyz[i + 2] = xyz1.z;\r\n }\r\n }\r\n /** Apply Geometry.isAlmostEqual to corresponding coordinates */\r\n public static isAlmostEqual(dataA: Point3d[] | Float64Array | undefined, dataB: Point3d[] | Float64Array | undefined): boolean {\r\n if (dataA && dataB) {\r\n if (dataA.length !== dataB.length)\r\n return false;\r\n if (dataA instanceof Float64Array && dataB instanceof Float64Array) {\r\n for (let i = 0; i < dataA.length; i++)\r\n if (!Geometry.isSameCoordinate(dataA[i], dataB[i]))\r\n return false;\r\n } else if (Array.isArray(dataA) && Array.isArray(dataB)) {\r\n for (let i = 0; i < dataA.length; i++)\r\n if (!dataA[i].isAlmostEqual(dataB[i]))\r\n return false;\r\n }\r\n return true;\r\n }\r\n // if both are null it is equal, otherwise unequal\r\n return (dataA === undefined && dataB === undefined);\r\n }\r\n\r\n /** return simple average of all coordinates. (000 if empty array) */\r\n public static centroid(points: IndexedXYZCollection | Point3d[], result?: Point3d): Point3d {\r\n if (points instanceof IndexedXYZCollection) {\r\n result = Point3d.create(0, 0, 0, result);\r\n const p = Point3d.create();\r\n if (points.length > 0) {\r\n for (let i = 0; i < points.length; i++) {\r\n points.getPoint3dAtCheckedPointIndex(i, p);\r\n result.x += p.x; result.y += p.y; result.z += p.z;\r\n }\r\n result.scaleInPlace(1.0 / points.length);\r\n }\r\n return result;\r\n }\r\n const carrier = new Point3dArrayCarrier(points);\r\n return this.centroid(carrier);\r\n }\r\n\r\n /** Return the index of the point most distant from spacePoint */\r\n public static indexOfMostDistantPoint(points: Point3d[], spacePoint: XYZ, farVector: Vector3d): number | undefined {\r\n if (points.length === 0)\r\n return undefined;\r\n let dMax = -1;\r\n let d;\r\n let result = -1;\r\n for (let i = 0; i < points.length; i++) {\r\n d = spacePoint.distance(points[i]);\r\n if (d > dMax) {\r\n spacePoint.vectorTo(points[i], farVector);\r\n dMax = d;\r\n result = i;\r\n }\r\n }\r\n return result;\r\n }\r\n /** return the index of the point whose vector from space point has the largest magnitude of cross product with given vector. */\r\n public static indexOfPointWithMaxCrossProductMagnitude(points: Point3d[], spacePoint: Point3d, vector: Vector3d, farVector: Vector3d): number | undefined {\r\n if (points.length === 0)\r\n return undefined;\r\n let dMax = -1;\r\n let d;\r\n let result = -1;\r\n let vectorAB; // to be reused in loop !!!\r\n for (let i = 0; i < points.length; i++) {\r\n vectorAB = spacePoint.vectorTo(points[i], vectorAB);\r\n d = vectorAB.crossProductMagnitude(vector);\r\n if (d > dMax) {\r\n farVector.setFrom(vectorAB);\r\n dMax = d;\r\n result = i;\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /** Return the index of the closest point in the array (full xyz) */\r\n public static closestPointIndex(data: XYAndZ[], spacePoint: XYAndZ): number {\r\n let index = -1;\r\n let dMin = Number.MAX_VALUE;\r\n let d;\r\n const x0 = spacePoint.x;\r\n const y0 = spacePoint.y;\r\n const z0 = spacePoint.z;\r\n for (let i = 0; i < data.length; i++) {\r\n d = Geometry.distanceXYZXYZ(x0, y0, z0, data[i].x, data[i].y, data[i].z);\r\n if (d < dMin) {\r\n index = i;\r\n dMin = d;\r\n }\r\n }\r\n return index;\r\n }\r\n /** return true iff all points' altitudes are within tolerance of the plane.*/\r\n public static isCloseToPlane(data: Point3d[] | Float64Array, plane: Plane3dByOriginAndUnitNormal, tolerance: number = Geometry.smallMetricDistance): boolean {\r\n if (Array.isArray(data)) {\r\n let xyz;\r\n for (xyz of data) {\r\n if (Math.abs(plane.altitude(xyz)) > tolerance)\r\n return false;\r\n }\r\n } else if (data instanceof Float64Array) {\r\n const numXYZ = data.length;\r\n for (let i = 0; i + 2 < numXYZ; i += 3) {\r\n if (Math.abs(plane.altitudeXYZ(data[i], data[i + 1], data[i + 2])) > tolerance)\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Sum lengths of edges.\r\n * @param data points.\r\n */\r\n public static sumEdgeLengths(data: Point3d[] | Float64Array, addClosureEdge: boolean = false, maxPointsToUse?: number): number {\r\n let sum = 0.0;\r\n\r\n if (Array.isArray(data)) {\r\n const n = selectOptionalClampedMin (data.length, maxPointsToUse, 1) - 1;\r\n for (let i = 0; i < n; i++) sum += data[i].distance(data[i + 1]);\r\n if (addClosureEdge && n > 0)\r\n sum += data[0].distance(data[n]);\r\n\r\n } else if (data instanceof Float64Array) {\r\n const numXYZ = selectOptionalClampedMin (data.length, maxPointsToUse, 3);\r\n let i = 0;\r\n for (; i + 5 < numXYZ; i += 3) { // final i points at final point x\r\n sum += Geometry.hypotenuseXYZ(data[i + 3] - data[i],\r\n data[i + 4] - data[i + 1],\r\n data[i + 5] - data[i + 2]);\r\n }\r\n if (addClosureEdge && i >= 3) {\r\n sum += Geometry.hypotenuseXYZ(data[0] - data[i],\r\n data[1] - data[i + 1],\r\n data[2] - data[i + 2]);\r\n }\r\n }\r\n return sum;\r\n }\r\n\r\n /**\r\n * Count the number of points, but ...\r\n * * ignore trailing duplicates of point 0.\r\n * * return 0 if there are any duplicates within the remaining points.\r\n * @param points points to examine.\r\n */\r\n public static countNonDuplicates(points: Point3d[], tolerance: number = Geometry.smallMetricDistance): number {\r\n let n = points.length;\r\n // strip of (allow) trailing duplicates ...\r\n while (n > 1){\r\n if (points[0].isAlmostEqual (points[n-1], tolerance))\r\n n--;\r\n else\r\n break;\r\n }\r\n for (let i = 0; i+1 < n; i++)\r\n if (points[i].isAlmostEqual (points[i+1], tolerance))\r\n return 0;\r\n return n;\r\n }\r\n\r\n /**\r\n * Return an array containing clones of the Point3d data[]\r\n * @param data source data\r\n */\r\n public static clonePoint3dArray(data: XYZProps[] | Float64Array): Point3d[] {\r\n const result: Point3d[] = [];\r\n if (data.length === 0)\r\n return result;\r\n if (data instanceof Float64Array) {\r\n for (let i = 0; i + 2 < data.length; i += 3)\r\n result.push(Point3d.create(data[i], data[i + 1], data[i + 2]));\r\n return result;\r\n }\r\n for (const p of data) {\r\n if (Array.isArray(p))\r\n result.push(Point3d.create(p[0], p[1], p[2]));\r\n else\r\n result.push(Point3d.create(p.x, p.y, p.z));\r\n }\r\n return result;\r\n }\r\n /**\r\n * Return an array containing Point2d with xy parts of each Point3d\r\n * @param data source data\r\n */\r\n public static clonePoint2dArray(data: XYAndZ[]): Point2d[] {\r\n return data.map((p: XYAndZ) => Point2d.create(p.x, p.y));\r\n }\r\n /**\r\n * clone points in the input array, inserting points within each edge to limit edge length.\r\n * @param points array of points\r\n * @param maxEdgeLength max length of an edge\r\n */\r\n public static cloneWithMaxEdgeLength(points: Point3d[], maxEdgeLength: number): Point3d[] {\r\n if (points.length === 0)\r\n return [];\r\n const result = [points[0]];\r\n for (let i = 1; i < points.length; i++) {\r\n const a = points[i - 1].distance(points[i]);\r\n const n = Geometry.stepCount(maxEdgeLength, a, 1);\r\n for (let k = 1; k < n; k++)\r\n result.push(points[i - 1].interpolate(k / n, points[i]));\r\n result.push(points[i]);\r\n\r\n }\r\n return result;\r\n }\r\n /** Pack isolated x,y,z args as a json `[x,y,z]` */\r\n private static xyzToArray(x: number, y: number, z: number): number[] { return [x, y, z]; }\r\n\r\n /**\r\n * return similarly-structured array, array of arrays, etc, with the lowest level point data specifically structured as arrays of 3 numbers `[1,2,3]`\r\n * @param data point data with various leaf forms such as `[1,2,3]`, `{x:1,y:2,z:3}`, `Point3d`\r\n */\r\n public static cloneDeepJSONNumberArrays(data: MultiLineStringDataVariant): number[][] {\r\n const collector = new PointStringDeepXYZArrayCollector(this.xyzToArray);\r\n VariantPointDataStream.streamXYZ(data, collector);\r\n return collector.claimResult();\r\n }\r\n /**\r\n * clone an array of [[XYZProps]] data, specifically as arrays of 3 numbers\r\n */\r\n public static cloneXYZPropsAsNumberArray(data: XYZProps[]): number[][] {\r\n // data is an array ... each member is either Point3d or [x,y,z]\r\n const result = [];\r\n for (const p of data) {\r\n if (p instanceof Point3d) {\r\n result.push([p.x, p.y, p.z]);\r\n } else if (Array.isArray(p)) {\r\n result.push([p[0], p[1], p.length > 2 ? p[2] : 0.0]);\r\n }\r\n }\r\n return result;\r\n }\r\n /**\r\n * clone an array of [[XYZProps]] data, specifically as flattened array of number\r\n */\r\n public static cloneXYZPropsAsFloat64Array(data: XYZProps[]): Float64Array {\r\n const result = new Float64Array(data.length * 3);\r\n let i = 0;\r\n for (const p of data) {\r\n if (p instanceof Point3d) {\r\n result[i++] = p.x;\r\n result[i++] = p.y;\r\n result[i++] = p.z;\r\n } else if (Array.isArray(p)) {\r\n result[i++] = p[0];\r\n result[i++] = p[1];\r\n result[i++] = p.length > 2 ? p[2] : 0.0; // allow missing z\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * return similarly-structured array, array of arrays, etc, with the lowest level point data specifically structured as `Point3d`.\r\n * @param data point data with various leaf forms such as `[1,2,3]`, `{x:1,y:2,z:3}`, `Point3d`\r\n */\r\n public static cloneDeepXYZPoint3dArrays(data: MultiLineStringDataVariant): any[] {\r\n const collector = new PointStringDeepXYZArrayCollector(Point3d.create);\r\n VariantPointDataStream.streamXYZ(data, collector);\r\n return collector.claimResult();\r\n }\r\n\r\n /**\r\n * return perpendicular distance from points[indexB] to the segment points[indexA] to points[indexC].\r\n * * extrapolation option when projection is outside of fraction range 0..1 are:\r\n * * false ==> measure distance to closest endpoint\r\n * * true ==> measure distance to extended line segment.\r\n * (no index checking!)\r\n */\r\n public static distanceIndexedPointBToSegmentAC(points: Point3d[], indexA: number, indexB: number, indexC: number, extrapolate: boolean): number {\r\n const vectorU = Vector3d.createStartEnd(points[indexA], points[indexC]);\r\n const vectorV = Vector3d.createStartEnd(points[indexA], points[indexB]);\r\n const uDotU = vectorU.dotProduct(vectorU);\r\n const uDotV = vectorU.dotProduct(vectorV);\r\n let fraction = Geometry.conditionalDivideFraction(uDotV, uDotU);\r\n if (fraction === undefined)\r\n fraction = 0.0;\r\n if (!extrapolate) {\r\n if (fraction > 1.0)\r\n fraction = 1.0;\r\n if (fraction < 0.0)\r\n fraction = 0.0;\r\n }\r\n let h2 = vectorV.magnitudeSquared() - fraction * fraction * uDotU;\r\n // h2 should never be negative except for quirky tolerance ..\r\n if (h2 < 0.0)\r\n h2 = 0.0;\r\n return Math.sqrt(h2);\r\n }\r\n\r\n /** Computes the hull of the XY projection of points.\r\n * * Returns the hull as an array of Point3d\r\n * * Optionally returns non-hull points in `insidePoints[]`\r\n * * If both arrays empty if less than 3 points.\r\n * *\r\n */\r\n public static computeConvexHullXY(points: Point3d[], hullPoints: Point3d[], insidePoints: Point3d[], addClosurePoint: boolean = false) {\r\n hullPoints.length = 0;\r\n insidePoints.length = 0;\r\n let n = points.length;\r\n // Get deep copy\r\n const xy1: Point3d[] = points.slice(0, n);\r\n xy1.sort(Geometry.lexicalXYLessThan);\r\n if (n < 3) {\r\n for (const p of xy1)\r\n hullPoints.push(p);\r\n if (addClosurePoint && xy1.length > 0)\r\n hullPoints.push(xy1[0]);\r\n return;\r\n }\r\n hullPoints.push(xy1[0]); // This is sure to stay\r\n hullPoints.push(xy1[1]); // This one can be removed in loop.\r\n let numInside = 0;\r\n // First sweep creates upper hull\r\n for (let i = 2; i < n; i++) {\r\n const candidate = xy1[i];\r\n let top = hullPoints.length - 1;\r\n while (top >= 1 && hullPoints[top - 1].crossProductToPointsXY(hullPoints[top], candidate) <= 0.0) {\r\n xy1[numInside++] = hullPoints[top];\r\n top--;\r\n hullPoints.pop();\r\n }\r\n hullPoints.push(candidate);\r\n }\r\n const i0 = hullPoints.length - 1;\r\n xy1.length = numInside;\r\n xy1.push(hullPoints[0]); // force first point to be reconsidered as final hull point.\r\n xy1.sort(Geometry.lexicalXYLessThan);\r\n n = xy1.length;\r\n // xy1.back () is already on stack.\r\n hullPoints.push(xy1[n - 1]);\r\n for (let i = n - 1; i-- > 0;) {\r\n const candidate = xy1[i];\r\n let top = hullPoints.length - 1;\r\n while (top > i0 && hullPoints[top - 1].crossProductToPointsXY(hullPoints[top], candidate) <= 0.0) {\r\n insidePoints.push(hullPoints[top]);\r\n top--;\r\n hullPoints.pop();\r\n }\r\n if (i > 0) // don't replicate start !!!\r\n hullPoints.push(candidate);\r\n }\r\n if (addClosurePoint)\r\n hullPoints.push(hullPoints[0]);\r\n }\r\n /**\r\n * Return (clones of) points in data[] with min and max x and y parts.\r\n * @param data array to examine.\r\n */\r\n public static minMaxPoints(data: Point3d[]): { minXPoint: Point3d, maxXPoint: Point3d, minYPoint: Point3d, maxYPoint: Point3d } | undefined {\r\n if (data.length === 0)\r\n return undefined;\r\n const result = { minXPoint: data[0].clone(), maxXPoint: data[0].clone(), minYPoint: data[0].clone(), maxYPoint: data[0].clone() };\r\n let q;\r\n for (let i = 1; i < data.length; i++) {\r\n q = data[i];\r\n if (q.x < result.minXPoint.x) result.minXPoint.setFromPoint3d(q);\r\n if (q.x > result.maxXPoint.x) result.maxXPoint.setFromPoint3d(q);\r\n if (q.y < result.minYPoint.y) result.minYPoint.setFromPoint3d(q);\r\n if (q.y > result.maxYPoint.y) result.maxYPoint.setFromPoint3d(q);\r\n }\r\n return result;\r\n }\r\n}\r\n"]}
@@ -1,7 +1,4 @@
1
- /** @packageDocumentation
2
- * @module CartesianGeometry
3
- */
4
- import { PlaneAltitudeEvaluator } from "../Geometry";
1
+ import { PlaneAltitudeEvaluator, PolygonLocation } from "../Geometry";
5
2
  import { Matrix4d } from "../geometry4d/Matrix4d";
6
3
  import { GrowableXYZArray } from "./GrowableXYZArray";
7
4
  import { IndexedReadWriteXYZCollection, IndexedXYZCollection } from "./IndexedXYZCollection";
@@ -10,6 +7,39 @@ import { Point3d, Vector3d } from "./Point3dVector3d";
10
7
  import { Range1d, Range3d } from "./Range";
11
8
  import { Ray3d } from "./Ray3d";
12
9
  import { XAndY } from "./XYZProps";
10
+ /**
11
+ * Carries data about a point in the plane of a polygon.
12
+ * @public
13
+ */
14
+ export declare class PolygonLocationDetail {
15
+ /** The coordinates of the point p. */
16
+ point: Point3d;
17
+ /** Application-specific number */
18
+ a: number;
19
+ /** Application-specific vector */
20
+ v: Vector3d;
21
+ /** A number that classifies the point's location with respect to the polygon. */
22
+ code: PolygonLocation;
23
+ /** Index of the polygon vertex at the base of the edge closest to p. */
24
+ closestEdgeIndex: number;
25
+ /** The parameter along the closest edge of the projection of p. */
26
+ closestEdgeParam: number;
27
+ private constructor();
28
+ /** Invalidate this detail. */
29
+ invalidate(): void;
30
+ /** Create an invalid detail.
31
+ * @param result optional pre-allocated object to fill and return
32
+ */
33
+ static create(result?: PolygonLocationDetail): PolygonLocationDetail;
34
+ /** Set the instance contents from the other detail.
35
+ * @param other detail to clone
36
+ */
37
+ copyContentsFrom(other: PolygonLocationDetail): void;
38
+ /** Whether this detail is valid. */
39
+ get isValid(): boolean;
40
+ /** Whether this instance specifies a location inside or on the polygon. */
41
+ get isInsideOrOn(): boolean;
42
+ }
13
43
  /**
14
44
  * Carrier for a loop extracted from clip operation, annotated for sorting
15
45
  * @internal
@@ -188,13 +218,17 @@ export declare class PolygonOps {
188
218
  */
189
219
  private static addSecondMomentTransformedProducts;
190
220
  /** Test the direction of turn at the vertices of the polygon, ignoring z-coordinates.
191
- *
192
- * * For a polygon without self intersections, this is a convexity and orientation test: all positive is convex and counterclockwise,
193
- * all negative is convex and clockwise
194
- * * Beware that a polygon which turns through more than a full turn can cross itself and close, but is not convex
195
- * * Returns 1 if all turns are to the left, -1 if all to the right, and 0 if there are any zero or reverse turns
221
+ * * For a polygon without self-intersections and successive colinear edges, this is a convexity and orientation test: all positive is convex and counterclockwise, all negative is convex and clockwise.
222
+ * * Beware that a polygon which turns through more than a full turn can cross itself and close, but is not convex.
223
+ * @returns 1 if all turns are to the left, -1 if all to the right, and 0 if there are any zero or reverse turns
224
+ */
225
+ static testXYPolygonTurningDirections(points: Point2d[] | Point3d[]): number;
226
+ /**
227
+ * Determine whether the polygon is convex.
228
+ * @param polygon vertices, closure point optional
229
+ * @returns whether the polygon is convex.
196
230
  */
197
- static testXYPolygonTurningDirections(pPointArray: Point2d[] | Point3d[]): number;
231
+ static isConvex(polygon: Point3d[] | IndexedXYZCollection): boolean;
198
232
  /**
199
233
  * Test if point (x,y) is IN, OUT or ON a polygon.
200
234
  * @return (1) for in, (-1) for OUT, (0) for ON
@@ -236,6 +270,82 @@ export declare class PolygonOps {
236
270
  * @param defaultNormal optional normal for the loops, if known
237
271
  */
238
272
  static sortOuterAndHoleLoops(loops: IndexedReadWriteXYZCollection[], defaultNormal: Vector3d | undefined): IndexedReadWriteXYZCollection[][];
273
+ /** Compute the closest point on the polygon boundary to the given point.
274
+ * @param polygon points of the polygon, closure point optional
275
+ * @param testPoint point p to project onto the polygon edges. Works best when p is in the plane of the polygon.
276
+ * @param tolerance optional distance tolerance to determine point-vertex and point-edge coincidence.
277
+ * @param result optional pre-allocated object to fill and return
278
+ * @returns details d of the closest point `d.point`:
279
+ * * `d.isValid()` returns true if and only if the polygon is nontrivial.
280
+ * * `d.edgeIndex` and `d.edgeParam` specify the location of the closest point, within `distTol`.
281
+ * * `d.code` classifies the closest point as a vertex (`PolygonLocation.OnPolygonVertex`) or as a point on an edge (`PolygonLocation.OnPolygonEdgeInterior`).
282
+ * * `d.a` is the distance from testPoint to the closest point.
283
+ * * `d.v` can be used to classify p (if p and polygon are coplanar): if n is the polygon normal then `d.v.dotProduct(n)` is +/-/0 if and only if p is inside/outside/on the polygon.
284
+ */
285
+ static closestPointOnBoundary(polygon: Point3d[] | IndexedXYZCollection, testPoint: Point3d, tolerance?: number, result?: PolygonLocationDetail): PolygonLocationDetail;
286
+ private static _workXYZ?;
287
+ private static _workXY0?;
288
+ private static _workXY1?;
289
+ private static _workXY2?;
290
+ private static _workRay?;
291
+ private static _workMatrix3d?;
292
+ private static _workPlane?;
293
+ /** Compute the intersection of a line (parameterized as a ray) with the plane of this polygon.
294
+ * @param polygon points of the polygon, closure point optional
295
+ * @param ray infinite line to intersect, as a ray
296
+ * @param tolerance optional distance tolerance to determine point-vertex and point-edge coincidence.
297
+ * @param result optional pre-allocated object to fill and return
298
+ * @returns details d of the line-plane intersection `d.point`:
299
+ * * `d.isValid()` returns true if and only if the line intersects the plane.
300
+ * * `d.code` indicates where the intersection lies with respect to the polygon.
301
+ * * `d.a` is the ray intersection parameter. If `d.a` >= 0, the ray intersects the plane of the polygon.
302
+ * * `d.edgeIndex` and `d.edgeParam` specify the location of the closest point on the polygon to the intersection, within `distTol`.
303
+ */
304
+ static intersectRay3d(polygon: Point3d[] | IndexedXYZCollection, ray: Ray3d, tolerance?: number, result?: PolygonLocationDetail): PolygonLocationDetail;
305
+ /** Compute the intersection of a line (parameterized as a line segment) with the plane of this polygon.
306
+ * @param polygon points of the polygon, closure point optional
307
+ * @param point0 start point of segment on line to intersect
308
+ * @param point1 end point of segment on line to intersect
309
+ * @param tolerance optional distance tolerance to determine point-vertex and point-edge coincidence.
310
+ * @param result optional pre-allocated object to fill and return
311
+ * @returns details d of the line-plane intersection `d.point`:
312
+ * * `d.isValid()` returns true if and only if the line intersects the plane.
313
+ * * `d.code` indicates where the intersection lies with respect to the polygon.
314
+ * * `d.a` is the segment intersection parameter. If `d.a` is in [0,1], the segment intersects the plane of the polygon.
315
+ * * `d.edgeIndex` and `d.edgeParam` specify the location of the closest point on the polygon to the intersection, within `distTol`.
316
+ * @see intersectRay3d
317
+ */
318
+ static intersectSegment(polygon: Point3d[] | IndexedXYZCollection, point0: Point3d, point1: Point3d, tolerance?: number, result?: PolygonLocationDetail): PolygonLocationDetail;
319
+ /** Compute edge data for the barycentric coordinate computation, ignoring all z-coordinates.
320
+ * @param polygon points of the polygon (without closure point)
321
+ * @param edgeStartVertexIndex index of start vertex of the edge (unchecked)
322
+ * @param point point to project to the edge
323
+ * @param edgeOutwardUnitNormal pre-allocated vector to be populated on return with the unit perpendicular to the edge, facing outward, in xy-plane
324
+ * @param tolerance used to clamp outputs
325
+ * @param result optional pre-allocated result
326
+ * @returns x: signed projection distance of `point` to the edge, y: edge parameter of the projection
327
+ */
328
+ private static computeEdgeDataXY;
329
+ /** Compute the barycentric coordinates for a point on either of a pair of adjacent edges of a convex polygon.
330
+ * @param polygon points of the polygon, assumed to be convex. Assumed to have no closure point.
331
+ * @param iPrev start index of previous edge
332
+ * @param prevNormal outward unit normal of previous edge
333
+ * @param prevProj x = signed distance from point to previous edge; y = edge parameter of this projection in [0,1]
334
+ * @param i start index of current edge
335
+ * @param normal outward unit normal of current edge
336
+ * @param proj x = signed distance from point to current edge; y = edge parameter of this projection in [0,1]
337
+ * @param coords pre-allocated barycentric coordinate array to return, assumed to have length at least `polygon.length`
338
+ * @returns barycentric coordinates, or undefined if not on either edge
339
+ */
340
+ private static convexBarycentricCoordinatesOnEdge;
341
+ /** Compute the barycentric coordinates for a point inside a convex polygon.
342
+ * @param polygon points of the polygon, assumed to be convex. Closure point optional.
343
+ * @param point point assumed to be inside or on polygon
344
+ * @param tolerance distance tolerance for point to be considered on a polygon edge
345
+ * @return barycentric coordinates of the interior point, or undefined if invalid polygon or exterior point. Length is same as `polygon.length`.
346
+ * @see BarycentricTriangle.pointToFraction
347
+ */
348
+ static convexBarycentricCoordinates(polygon: Point3d[] | IndexedXYZCollection, point: Point3d, tolerance?: number): number[] | undefined;
239
349
  }
240
350
  /**
241
351
  * `IndexedXYZCollectionPolygonOps` class contains _static_ methods for typical operations on polygons carried as `IndexedXyZCollection`
@@ -1 +1 @@
1
- {"version":3,"file":"PolygonOps.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/PolygonOps.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PolygonOps.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/PolygonOps.ts"],"names":[],"mappings":"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"}