@itwin/core-geometry 3.2.0-dev.7 → 3.2.0-dev.72

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 (76) hide show
  1. package/CHANGELOG.md +38 -1
  2. package/lib/cjs/geometry3d/Angle.d.ts.map +1 -1
  3. package/lib/cjs/geometry3d/Angle.js.map +1 -1
  4. package/lib/cjs/numerics/ClusterableArray.d.ts +29 -2
  5. package/lib/cjs/numerics/ClusterableArray.d.ts.map +1 -1
  6. package/lib/cjs/numerics/ClusterableArray.js +54 -2
  7. package/lib/cjs/numerics/ClusterableArray.js.map +1 -1
  8. package/lib/cjs/polyface/IndexedEdgeMatcher.d.ts.map +1 -1
  9. package/lib/cjs/polyface/IndexedEdgeMatcher.js +0 -3
  10. package/lib/cjs/polyface/IndexedEdgeMatcher.js.map +1 -1
  11. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js +1 -1
  12. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  13. package/lib/cjs/polyface/Polyface.d.ts +4 -4
  14. package/lib/cjs/polyface/Polyface.d.ts.map +1 -1
  15. package/lib/cjs/polyface/Polyface.js +30 -44
  16. package/lib/cjs/polyface/Polyface.js.map +1 -1
  17. package/lib/cjs/polyface/PolyfaceBuilder.d.ts +58 -17
  18. package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
  19. package/lib/cjs/polyface/PolyfaceBuilder.js +235 -47
  20. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  21. package/lib/cjs/polyface/PolyfaceData.d.ts +3 -3
  22. package/lib/cjs/polyface/PolyfaceData.d.ts.map +1 -1
  23. package/lib/cjs/polyface/PolyfaceData.js +8 -3
  24. package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
  25. package/lib/cjs/polyface/PolyfaceQuery.d.ts +6 -4
  26. package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
  27. package/lib/cjs/polyface/PolyfaceQuery.js +20 -7
  28. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  29. package/lib/cjs/serialization/BGFBAccessors.d.ts +2 -2
  30. package/lib/cjs/serialization/BGFBAccessors.d.ts.map +1 -1
  31. package/lib/cjs/serialization/BGFBAccessors.js +2 -2
  32. package/lib/cjs/serialization/BGFBAccessors.js.map +1 -1
  33. package/lib/cjs/serialization/BGFBReader.d.ts.map +1 -1
  34. package/lib/cjs/serialization/BGFBReader.js +0 -1
  35. package/lib/cjs/serialization/BGFBReader.js.map +1 -1
  36. package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
  37. package/lib/cjs/serialization/GeometrySamples.js +4 -3
  38. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  39. package/lib/esm/geometry3d/Angle.d.ts.map +1 -1
  40. package/lib/esm/geometry3d/Angle.js.map +1 -1
  41. package/lib/esm/numerics/ClusterableArray.d.ts +29 -2
  42. package/lib/esm/numerics/ClusterableArray.d.ts.map +1 -1
  43. package/lib/esm/numerics/ClusterableArray.js +54 -2
  44. package/lib/esm/numerics/ClusterableArray.js.map +1 -1
  45. package/lib/esm/polyface/IndexedEdgeMatcher.d.ts.map +1 -1
  46. package/lib/esm/polyface/IndexedEdgeMatcher.js +0 -3
  47. package/lib/esm/polyface/IndexedEdgeMatcher.js.map +1 -1
  48. package/lib/esm/polyface/IndexedPolyfaceVisitor.js +1 -1
  49. package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  50. package/lib/esm/polyface/Polyface.d.ts +4 -4
  51. package/lib/esm/polyface/Polyface.d.ts.map +1 -1
  52. package/lib/esm/polyface/Polyface.js +30 -44
  53. package/lib/esm/polyface/Polyface.js.map +1 -1
  54. package/lib/esm/polyface/PolyfaceBuilder.d.ts +58 -17
  55. package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
  56. package/lib/esm/polyface/PolyfaceBuilder.js +235 -47
  57. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  58. package/lib/esm/polyface/PolyfaceData.d.ts +3 -3
  59. package/lib/esm/polyface/PolyfaceData.d.ts.map +1 -1
  60. package/lib/esm/polyface/PolyfaceData.js +8 -3
  61. package/lib/esm/polyface/PolyfaceData.js.map +1 -1
  62. package/lib/esm/polyface/PolyfaceQuery.d.ts +6 -4
  63. package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
  64. package/lib/esm/polyface/PolyfaceQuery.js +20 -7
  65. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  66. package/lib/esm/serialization/BGFBAccessors.d.ts +2 -2
  67. package/lib/esm/serialization/BGFBAccessors.d.ts.map +1 -1
  68. package/lib/esm/serialization/BGFBAccessors.js +2 -2
  69. package/lib/esm/serialization/BGFBAccessors.js.map +1 -1
  70. package/lib/esm/serialization/BGFBReader.d.ts.map +1 -1
  71. package/lib/esm/serialization/BGFBReader.js +0 -1
  72. package/lib/esm/serialization/BGFBReader.js.map +1 -1
  73. package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
  74. package/lib/esm/serialization/GeometrySamples.js +4 -3
  75. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  76. package/package.json +4 -5
@@ -1 +1 @@
1
- {"version":3,"file":"Angle.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/Angle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Angle.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/Angle.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,eAAe,EAAY,UAAU,EAAE,MAAM,aAAa,CAAC;AAEhF;;;;;GAKG;AACH,qBAAa,KAAM,YAAW,eAAe;IAC3C,+DAA+D;IAC/D,gBAAuB,cAAc,sBAA+B;IACpE,+DAA+D;IAC/D,gBAAuB,cAAc,sBAA+B;IACpE,8DAA8D;IAC9D,gBAAuB,SAAS,qBAA+B;IAC/D,+DAA+D;IAC/D,gBAAuB,UAAU,qBAA+B;IAChE,qDAAqD;IACrD,gBAAuB,gBAAgB,SAAiC;IACxE,qDAAqD;IACrD,gBAAuB,gBAAgB,SAAiC;IACxE,gEAAgE;IAChE,gBAAuB,eAAe,uBAAsC;IAC5E,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO;IACP,gDAAgD;IACzC,KAAK,IAAI,KAAK;IACrB,8CAA8C;IACvC,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC;IAE/B;;;OAGG;WACW,aAAa,CAAC,OAAO,EAAE,MAAM;IAC3C;;;OAGG;WACW,aAAa,CAAC,OAAO,EAAE,MAAM;IAC3C;;;OAGG;WACW,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK;IAG9E;;;OAGG;IACI,WAAW,CAAC,KAAK,EAAE,MAAM;IAEhC;;;OAGG;IACI,UAAU,CAAC,OAAO,EAAE,MAAM;IACjC;;;OAGG;IACI,UAAU,CAAC,OAAO,EAAE,MAAM;IACjC,yCAAyC;WAC3B,SAAS;IACvB;;;;;OAKG;WACW,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,KAAK;IACxE;;;OAGG;IACI,OAAO,CAAC,KAAK,EAAE,KAAK;IAC3B;;;;;OAKG;WACW,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,KAAK;IAK5E;;;;;;;OAOG;IACI,WAAW,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,iBAAiB,CAAC,EAAE,MAAM;IAgBhE,+DAA+D;IACxD,MAAM,IAAI,UAAU;IAC3B,yEAAyE;IAClE,aAAa,IAAI,UAAU;IAClC,6CAA6C;IAC7C,IAAW,OAAO,IAAI,MAAM,CAA0B;IACtD,6CAA6C;IAC7C,IAAW,OAAO,IAAI,MAAM,CAAgG;IAC5H;;;OAGG;WACW,gBAAgB,CAAC,OAAO,EAAE,MAAM;IAC9C;;;OAGG;WACW,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAiBvD;;OAEG;IACI,GAAG,IAAI,MAAM;IACpB;;OAEG;IACI,GAAG,IAAI,MAAM;IACpB;;OAEG;IACI,GAAG,IAAI,MAAM;IACpB,qEAAqE;WACvD,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAG3D,sDAAsD;WACxC,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAG3D,0CAA0C;IAC1C,IAAW,YAAY,IAAI,OAAO,CAAqD;IAEvF,+DAA+D;IAC/D,IAAW,YAAY,IAAI,OAAO,CAAqD;IACvF,yDAAyD;WAC3C,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAe1D,mDAAmD;WACrC,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAc7D,yDAAyD;WAC3C,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAe1D,0DAA0D;WAC5C,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAcjE,mEAAmE;WACrD,IAAI;IAClB,yCAAyC;IACzC,IAAW,WAAW,YAAiC;IACvD,uFAAuF;IACvF,IAAW,YAAY,YAAkE;IACzF,wGAAwG;IACxG,IAAW,wBAAwB,YAA4D;IAE/F,gEAAgE;WAClD,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK;IACjE,mEAAmE;WACrD,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK;IAClE;;;;OAIG;WACW,oCAAoC,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAY/F;;OAEG;IACI,6BAA6B,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAG3D;;OAEG;IACI,0BAA0B,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IACxD;;;OAGG;IACI,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAC3C;;OAEG;WACW,iCAAiC,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAC5F;;;;;OAKG;WACW,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAKzF;;;;OAIG;WACW,+BAA+B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU;IA+BzF,8EAA8E;WAChE,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,MAAgB,GAAG,MAAM;IAYlF;;;;;OAKG;WACW,gCAAgC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,OAAc,GAAG,UAAU;IAOlI;;;;;;;;;;OAUG;WACW,wBAAwB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM;IAMtH;;;OAGG;IACI,uBAAuB,CAAC,QAAQ,EAAE,MAAM;CAQhD"}
@@ -1 +1 @@
1
- {"version":3,"file":"Angle.js","sourceRoot":"","sources":["../../../src/geometry3d/Angle.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/** @packageDocumentation\r\n * @module CartesianGeometry\r\n */\r\n\r\nimport { AngleProps, BeJSONFunctions, Geometry, TrigValues } from \"../Geometry\";\r\n\r\n/**\r\n * An `Angle` carries the numeric value of an angle, with methods to allow (require!) callers to be clear about whether their angle is degrees or radians.\r\n * * The numeric value is private, and callers should not know or care whether it is in degrees or radians.\r\n * * The various access method are named so that callers can specify whether untyped numbers passed in or out are degrees or radians.\r\n * @public\r\n */\r\nexport class Angle implements BeJSONFunctions {\r\n /** maximal accuracy value of pi/4 ( 45 degrees), in radians */\r\n public static readonly piOver4Radians = 7.85398163397448280000e-001;\r\n /** maximal accuracy value of pi/2 ( 90 degrees), in radians */\r\n public static readonly piOver2Radians = 1.57079632679489660000e+000;\r\n /** maximal accuracy value of pi ( 180 degrees), in radians */\r\n public static readonly piRadians = 3.14159265358979310000e+000;\r\n /** maximal accuracy value of 2*pi (360 degrees), in radians */\r\n public static readonly pi2Radians = 6.28318530717958620000e+000;\r\n /** scale factor for converting radians to degrees */\r\n public static readonly degreesPerRadian = (45.0 / Angle.piOver4Radians);\r\n /** scale factor for converting degrees to radians */\r\n public static readonly radiansPerDegree = (Angle.piOver4Radians / 45.0);\r\n /** maximal accuracy value of pi/12 ( 15 degrees), in radians */\r\n public static readonly piOver12Radians = 0.26179938779914943653855361527329;\r\n private _radians: number;\r\n private _degrees?: number;\r\n private constructor(radians = 0, degrees?: number) { this._radians = radians; this._degrees = degrees; }\r\n /** Return a new angle with the same content. */\r\n public clone(): Angle { return new Angle(this._radians, this._degrees); }\r\n /** Freeze this instance so it is read-only */\r\n public freeze(): Readonly<this> { return Object.freeze(this); }\r\n\r\n /**\r\n * Return a new Angle object for angle given in degrees.\r\n * @param degrees angle in degrees\r\n */\r\n public static createDegrees(degrees: number) { return new Angle(Angle.degreesToRadians(degrees), degrees); }\r\n /**\r\n * Return a (new) Angle object for a value given in radians.\r\n * @param radians angle in radians\r\n */\r\n public static createRadians(radians: number) { return new Angle(radians); }\r\n /**\r\n * Return a (new) Angle object that is interpolated between two inputs\r\n * @param radians angle in radians\r\n */\r\n public static createInterpolate(angle0: Angle, fraction: number, angle1: Angle) {\r\n return new Angle(Geometry.interpolate(angle0.radians, fraction, angle1.radians));\r\n }\r\n /**\r\n * Return a (new) Angle object, with angle scaled from existing angle.\r\n * @param scale scale factor to apply to angle.\r\n */\r\n public cloneScaled(scale: number) { return new Angle(this.radians * scale); }\r\n\r\n /**\r\n * Set this angle to a value given in radians.\r\n * @param radians angle given in radians\r\n */\r\n public setRadians(radians: number) { this._radians = radians; this._degrees = undefined; }\r\n /**\r\n * Set this angle to a value given in degrees.\r\n * @param degrees angle given in degrees.\r\n */\r\n public setDegrees(degrees: number) { this._radians = Angle.degreesToRadians(degrees); this._degrees = degrees; }\r\n /** Create an angle for a full circle. */\r\n public static create360() { return new Angle(Math.PI * 2.0, 360.0); }\r\n /**\r\n * @return a (strongly typed) Angle whose tangent is `numerator/denominator`, using the signs of both in determining the (otherwise ambiguous)\r\n * quadrant.\r\n * @param numerator numerator for tangent\r\n * @param denominator denominator for tangent\r\n */\r\n public static createAtan2(numerator: number, denominator: number): Angle { return new Angle(Math.atan2(numerator, denominator)); }\r\n /**\r\n * Copy all contents of `other` to this Angle.\r\n * @param other source data\r\n */\r\n public setFrom(other: Angle) { this._radians = other._radians; this._degrees = other._degrees; }\r\n /**\r\n * Create an Angle from a JSON object\r\n * @param json object from JSON.parse. If a number, value is in *DEGREES*\r\n * @param defaultValRadians if json is undefined, default value in radians.\r\n * @return a new Angle\r\n */\r\n public static fromJSON(json?: AngleProps, defaultValRadians?: number): Angle {\r\n const val = new Angle();\r\n val.setFromJSON(json, defaultValRadians);\r\n return val;\r\n }\r\n /**\r\n * set an Angle from a JSON object\r\n * * A simple number is degrees.\r\n * * specified `json.degrees` or `json._degrees` is degree value.\r\n * * specified `son.radians` or `json._radians` is radians value.\r\n * @param json object from JSON.parse. If a number, value is in *DEGREES*\r\n * @param defaultValRadians if json is undefined, default value in radians.\r\n */\r\n public setFromJSON(json?: AngleProps, defaultValRadians?: number) {\r\n this._radians = defaultValRadians ? defaultValRadians : 0;\r\n if (!json)\r\n return;\r\n if (typeof json === \"number\") {\r\n this.setDegrees(json);\r\n } else if (typeof (json as any).degrees === \"number\") {\r\n this.setDegrees((json as any).degrees);\r\n } else if (typeof (json as any)._degrees === \"number\") {\r\n this.setDegrees((json as any)._degrees);\r\n } else if (typeof (json as any).radians === \"number\") {\r\n this.setRadians((json as any).radians);\r\n } else if (typeof (json as any)._radians === \"number\") {\r\n this.setRadians((json as any)._radians);\r\n }\r\n }\r\n /** Convert an Angle to a JSON object as a number in degrees */\r\n public toJSON(): AngleProps { return this.degrees; }\r\n /** Return a json object with radians keyword, e.g. `{ radians: 0.10}` */\r\n public toJSONRadians(): AngleProps { return { radians: this.radians }; }\r\n /** Return the angle measured in radians. */\r\n public get radians(): number { return this._radians; }\r\n /** Return the angle measured in degrees. */\r\n public get degrees(): number { return this._degrees !== undefined ? this._degrees : Angle.radiansToDegrees(this._radians); }\r\n /**\r\n * Convert an angle in degrees to radians.\r\n * @param degrees angle in degrees\r\n */\r\n public static degreesToRadians(degrees: number) { return degrees * Math.PI / 180; }\r\n /**\r\n * Convert an angle in radians to degrees.\r\n * @param degrees angle in radians\r\n */\r\n public static radiansToDegrees(radians: number): number {\r\n if (radians < 0)\r\n return -Angle.radiansToDegrees(-radians);\r\n // Now radians is positive ...\r\n const pi = Math.PI;\r\n const factor = 180.0 / pi;\r\n if (radians <= 0.25 * pi)\r\n return factor * radians;\r\n if (radians < 0.75 * pi)\r\n return 90.0 + 180 * ((radians - 0.5 * pi) / pi);\r\n if (radians <= 1.25 * pi)\r\n return 180.0 + 180 * ((radians - pi) / pi);\r\n if (radians <= 1.75 * pi)\r\n return 270.0 + 180 * ((radians - 1.5 * pi) / pi);\r\n // all larger radians reference from 360 degrees (2PI)\r\n return 360.0 + 180 * ((radians - 2.0 * pi) / pi);\r\n }\r\n /**\r\n * Return the cosine of this Angle object's angle.\r\n */\r\n public cos(): number { return Math.cos(this._radians); }\r\n /**\r\n * Return the sine of this Angle object's angle.\r\n */\r\n public sin(): number { return Math.sin(this._radians); }\r\n /**\r\n * Return the tangent of this Angle object's angle.\r\n */\r\n public tan(): number { return Math.tan(this._radians); }\r\n /** Test if a radians (absolute) value is nearly 2PI or larger (!) */\r\n public static isFullCircleRadians(radians: number): boolean {\r\n return Math.abs(radians) >= Geometry.fullCircleRadiansMinusSmallAngle;\r\n }\r\n /** Test if the radians value is a complete circle */\r\n public static isHalfCircleRadians(radians: number): boolean {\r\n return Math.abs(Math.abs(radians) - Math.PI) <= Geometry.smallAngleRadians;\r\n }\r\n /** test if the angle is aa full circle */\r\n public get isFullCircle(): boolean { return Angle.isFullCircleRadians(this._radians); }\r\n\r\n /** test if the angle is a half circle (in either direction) */\r\n public get isHalfCircle(): boolean { return Angle.isHalfCircleRadians(this._radians); }\r\n /** Adjust a radians value so it is positive in 0..360 */\r\n public static adjustDegrees0To360(degrees: number): number {\r\n if (degrees >= 0) {\r\n const period = 360.0;\r\n if (degrees < period)\r\n return degrees;\r\n const numPeriods = Math.floor(degrees / period);\r\n return degrees - numPeriods * period;\r\n } else if (degrees < 0) {\r\n // negative angle ...\r\n const radians1 = Angle.adjustDegrees0To360(-degrees);\r\n return 360.0 - radians1;\r\n }\r\n // fall through for Nan (disaster) !!!\r\n return 0;\r\n }\r\n /** Adjust a radians value so it is in -180..180 */\r\n public static adjustDegreesSigned180(degrees: number): number {\r\n if (Math.abs(degrees) <= 180.0)\r\n return degrees;\r\n if (degrees >= 0) {\r\n const period = 360.0;\r\n const numPeriods = 1 + Math.floor((degrees - 180.0) / period);\r\n return degrees - numPeriods * period;\r\n } else if (degrees < 0) {\r\n // negative angle ...\r\n return -Angle.adjustDegreesSigned180(-degrees);\r\n }\r\n // fall through for NaN disaster.\r\n return 0;\r\n }\r\n /** Adjust a radians value so it is positive in 0..2Pi */\r\n public static adjustRadians0To2Pi(radians: number): number {\r\n if (radians >= 0) {\r\n const period = Math.PI * 2.0;\r\n if (radians < period)\r\n return radians;\r\n const numPeriods = Math.floor(radians / period);\r\n return radians - numPeriods * period;\r\n } else if (radians < 0) {\r\n // negative angle ...\r\n const radians1 = Angle.adjustRadians0To2Pi(-radians);\r\n return Math.PI * 2.0 - radians1;\r\n }\r\n // fall through for NaN disaster.\r\n return 0;\r\n }\r\n /** Adjust a radians value so it is positive in -PI..PI */\r\n public static adjustRadiansMinusPiPlusPi(radians: number): number {\r\n if (Math.abs(radians) <= Math.PI)\r\n return radians;\r\n if (radians >= 0) {\r\n const period = Math.PI * 2.0;\r\n const numPeriods = 1 + Math.floor((radians - Math.PI) / period);\r\n return radians - numPeriods * period;\r\n } else if (radians < 0) {\r\n // negative angle ...\r\n return -Angle.adjustRadiansMinusPiPlusPi(-radians);\r\n }\r\n // fall through for NaN disaster.\r\n return 0;\r\n }\r\n /** return a (newly allocated) Angle object with value 0 radians */\r\n public static zero() { return new Angle(0); }\r\n /** Test if the angle is exactly zero. */\r\n public get isExactZero() { return this.radians === 0; }\r\n /** Test if the angle is almost zero (within tolerance `Geometry.smallAngleRadians`) */\r\n public get isAlmostZero() { return Math.abs(this.radians) < Geometry.smallAngleRadians; }\r\n /** Test if the angle is almost a north or south pole (within tolerance `Geometry.smallAngleRadians`) */\r\n public get isAlmostNorthOrSouthPole() { return Angle.isHalfCircleRadians(this.radians * 2.0); }\r\n\r\n /** Create an angle object with degrees adjusted into 0..360. */\r\n public static createDegreesAdjustPositive(degrees: number): Angle { return Angle.createDegrees(Angle.adjustDegrees0To360(degrees)); }\r\n /** Create an angle object with degrees adjusted into -180..180. */\r\n public static createDegreesAdjustSigned180(degrees: number): Angle { return Angle.createDegrees(Angle.adjustDegreesSigned180(degrees)); }\r\n /**\r\n * Test if two radians values are equivalent, allowing shift by full circle (i.e. by a multiple of `2*PI`)\r\n * @param radiansA first radians value\r\n * @param radiansB second radians value\r\n */\r\n public static isAlmostEqualRadiansAllowPeriodShift(radiansA: number, radiansB: number): boolean {\r\n // try to get simple conclusions with un-shifted radians ...\r\n const delta = Math.abs(radiansA - radiansB);\r\n if (delta <= Geometry.smallAngleRadians)\r\n return true;\r\n const period = Math.PI * 2.0;\r\n if (Math.abs(delta - period) <= Geometry.smallAngleRadians)\r\n return true;\r\n const numPeriod = Math.round(delta / period);\r\n const delta1 = delta - numPeriod * period;\r\n return Math.abs(delta1) <= Geometry.smallAngleRadians;\r\n }\r\n /**\r\n * Test if this angle and other are equivalent, allowing shift by full circle (i.e. by a multiple of 360 degrees)\r\n */\r\n public isAlmostEqualAllowPeriodShift(other: Angle): boolean {\r\n return Angle.isAlmostEqualRadiansAllowPeriodShift(this._radians, other._radians);\r\n }\r\n /**\r\n * Test if two this angle and other are almost equal, NOT allowing shift by full circle multiples of 360 degrees.\r\n */\r\n public isAlmostEqualNoPeriodShift(other: Angle): boolean { return Math.abs(this._radians - other._radians) < Geometry.smallAngleRadians; }\r\n /**\r\n * Test if two angle (in radians) almost equal, NOT allowing shift by full circle multiples of `2 * PI`.\r\n * * (Same test as isAlmostEqualRadiansNoPeriodShift)\r\n */\r\n public isAlmostEqual(other: Angle): boolean { return this.isAlmostEqualNoPeriodShift(other); }\r\n /**\r\n * Test if two angle (in radians) almost equal, NOT allowing shift by full circle multiples of `2 * PI`.\r\n */\r\n public static isAlmostEqualRadiansNoPeriodShift(radiansA: number, radiansB: number): boolean { return Math.abs(radiansA - radiansB) < Geometry.smallAngleRadians; }\r\n /**\r\n * Test if dot product values indicate non-zero length perpendicular vectors.\r\n * @param dotUU dot product of vectorU with itself\r\n * @param dotVV dot product of vectorV with itself\r\n * @param dotUV dot product of vectorU with vectorV\r\n */\r\n public static isPerpendicularDotSet(dotUU: number, dotVV: number, dotUV: number) {\r\n return dotUU > Geometry.smallMetricDistanceSquared\r\n && dotVV > Geometry.smallMetricDistanceSquared\r\n && dotUV * dotUV <= Geometry.smallAngleRadiansSquared * dotUU * dotVV;\r\n }\r\n /**\r\n * Return cosine, sine, and radians for the half angle of a cosine,sine pair.\r\n * @param rCos2A cosine value (scaled by radius) for initial angle.\r\n * @param rSin2A sine value (scaled by radius) for final angle.\r\n */\r\n public static trigValuesToHalfAngleTrigValues(rCos2A: number, rSin2A: number): TrigValues {\r\n const r = Geometry.hypotenuseXY(rCos2A, rSin2A);\r\n if (r < Geometry.smallMetricDistance) {\r\n return { c: 1.0, s: 0.0, radians: 0.0 };\r\n } else {\r\n /* If the caller really gave you sine and cosine values, r should be 1. However,*/\r\n /* to allow scaled values -- e.g. the x and y components of any vector -- we normalize*/\r\n /* right here. This adds an extra sqrt and 2 divides to the whole process, but improves*/\r\n /* both the usefulness and robustness of the computation.*/\r\n let cosA;\r\n let sinA = 0.0;\r\n const cos2A = rCos2A / r;\r\n const sin2A = rSin2A / r;\r\n if (cos2A >= 0.0) {\r\n /* Original angle in NE and SE quadrants. Half angle in same quadrant */\r\n cosA = Math.sqrt(0.5 * (1.0 + cos2A));\r\n sinA = sin2A / (2.0 * (cosA));\r\n } else {\r\n if (sin2A > 0.0) {\r\n /* Original angle in NW quadrant. Half angle in NE quadrant */\r\n sinA = Math.sqrt(0.5 * (1.0 - cos2A));\r\n } else {\r\n /* Original angle in SW quadrant. Half angle in SE quadrant*/\r\n /* cosA comes out positive because both sines are negative. */\r\n sinA = -Math.sqrt(0.5 * (1.0 - cos2A));\r\n }\r\n cosA = sin2A / (2.0 * (sinA));\r\n }\r\n return { c: cosA, s: sinA, radians: Math.atan2(sinA, cosA) };\r\n }\r\n }\r\n /** If value is close to -1, -0.5, 0, 0.5, 1, adjust it to the exact value. */\r\n public static cleanupTrigValue(value: number, tolerance: number = 1.0e-15): number {\r\n const absValue = Math.abs(value);\r\n if (absValue <= tolerance)\r\n return 0;\r\n let a = Math.abs(absValue - 0.5);\r\n if (a <= tolerance)\r\n return value < 0.0 ? -0.5 : 0.5;\r\n a = Math.abs(absValue - 1.0);\r\n if (a <= tolerance)\r\n return value < 0.0 ? -1.0 : 1.0;\r\n return value;\r\n }\r\n /**\r\n * Return the half angle cosine, sine, and radians for given dot products between vectors.\r\n * @param dotUU dot product of vectorU with itself\r\n * @param dotVV dot product of vectorV with itself\r\n * @param dotUV dot product of vectorU with vectorV\r\n */\r\n public static dotProductsToHalfAngleTrigValues(dotUU: number, dotVV: number, dotUV: number, favorZero: boolean = true): TrigValues {\r\n const rCos = dotUU - dotVV;\r\n const rSin = 2.0 * dotUV;\r\n if (favorZero && Math.abs(rSin) < Geometry.smallAngleRadians * (Math.abs(dotUU) + Math.abs(dotVV)))\r\n return { c: 1.0, s: 0.0, radians: 0.0 };\r\n return Angle.trigValuesToHalfAngleTrigValues(rCos, rSin);\r\n }\r\n /**\r\n * * Returns the angle between two vectors, with the vectors given as xyz components\r\n * * The returned angle is between 0 and PI\r\n *\r\n * @param ux x component of vector u\r\n * @param uy y component of vector u\r\n * @param uz z component of vector u\r\n * @param vx x component of vector v\r\n * @param vy y component of vector v\r\n * @param vz z component of vector v\r\n */\r\n public static radiansBetweenVectorsXYZ(ux: number, uy: number, uz: number, vx: number, vy: number, vz: number): number {\r\n // const uu = ux * ux + uy * uy + uz * uz;\r\n const uDotV = ux * vx + uy * vy + uz * vz; // magU magV cos(theta)\r\n // const vv = vx * vx + vy * vy + vz * vz;\r\n return Math.atan2(Geometry.crossProductMagnitude(ux, uy, uz, vx, vy, vz), uDotV);\r\n }\r\n /**\r\n * Add a multiple of a full circle angle (360 degrees, 2PI) in place.\r\n * @param multiple multiplier factor\r\n */\r\n public addMultipleOf2PiInPlace(multiple: number) {\r\n if (this._degrees !== undefined) {\r\n this._degrees += multiple * 360.0;\r\n this._radians = Angle.degreesToRadians(this._degrees);\r\n } else {\r\n this._radians += multiple * Angle.pi2Radians;\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"Angle.js","sourceRoot":"","sources":["../../../src/geometry3d/Angle.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/** @packageDocumentation\r\n * @module CartesianGeometry\r\n */\r\n\r\nimport { AngleProps, BeJSONFunctions, Geometry, TrigValues } from \"../Geometry\";\r\n\r\n/**\r\n * An `Angle` carries the numeric value of an angle, with methods to allow (require!) callers to be clear about whether their angle is degrees or radians.\r\n * * The numeric value is private, and callers should not know or care whether it is in degrees or radians.\r\n * * The various access method are named so that callers can specify whether untyped numbers passed in or out are degrees or radians.\r\n * @public\r\n */\r\nexport class Angle implements BeJSONFunctions {\r\n /** maximal accuracy value of pi/4 ( 45 degrees), in radians */\r\n public static readonly piOver4Radians = 7.85398163397448280000e-001;\r\n /** maximal accuracy value of pi/2 ( 90 degrees), in radians */\r\n public static readonly piOver2Radians = 1.57079632679489660000e+000;\r\n /** maximal accuracy value of pi ( 180 degrees), in radians */\r\n public static readonly piRadians = 3.14159265358979310000e+000;\r\n /** maximal accuracy value of 2*pi (360 degrees), in radians */\r\n public static readonly pi2Radians = 6.28318530717958620000e+000;\r\n /** scale factor for converting radians to degrees */\r\n public static readonly degreesPerRadian = (45.0 / Angle.piOver4Radians);\r\n /** scale factor for converting degrees to radians */\r\n public static readonly radiansPerDegree = (Angle.piOver4Radians / 45.0);\r\n /** maximal accuracy value of pi/12 ( 15 degrees), in radians */\r\n public static readonly piOver12Radians = 0.26179938779914943653855361527329;\r\n private _radians: number;\r\n private _degrees?: number;\r\n private constructor(radians = 0, degrees?: number) { this._radians = radians; this._degrees = degrees; }\r\n /** Return a new angle with the same content. */\r\n public clone(): Angle { return new Angle(this._radians, this._degrees); }\r\n /** Freeze this instance so it is read-only */\r\n public freeze(): Readonly<this> { return Object.freeze(this); }\r\n\r\n /**\r\n * Return a new Angle object for angle given in degrees.\r\n * @param degrees angle in degrees\r\n */\r\n public static createDegrees(degrees: number) { return new Angle(Angle.degreesToRadians(degrees), degrees); }\r\n /**\r\n * Return a (new) Angle object for a value given in radians.\r\n * @param radians angle in radians\r\n */\r\n public static createRadians(radians: number) { return new Angle(radians); }\r\n /**\r\n * Return a (new) Angle object that is interpolated between two inputs\r\n * @param radians angle in radians\r\n */\r\n public static createInterpolate(angle0: Angle, fraction: number, angle1: Angle) {\r\n return new Angle(Geometry.interpolate(angle0.radians, fraction, angle1.radians));\r\n }\r\n /**\r\n * Return a (new) Angle object, with angle scaled from existing angle.\r\n * @param scale scale factor to apply to angle.\r\n */\r\n public cloneScaled(scale: number) { return new Angle(this.radians * scale); }\r\n\r\n /**\r\n * Set this angle to a value given in radians.\r\n * @param radians angle given in radians\r\n */\r\n public setRadians(radians: number) { this._radians = radians; this._degrees = undefined; }\r\n /**\r\n * Set this angle to a value given in degrees.\r\n * @param degrees angle given in degrees.\r\n */\r\n public setDegrees(degrees: number) { this._radians = Angle.degreesToRadians(degrees); this._degrees = degrees; }\r\n /** Create an angle for a full circle. */\r\n public static create360() { return new Angle(Math.PI * 2.0, 360.0); }\r\n /**\r\n * @return a (strongly typed) Angle whose tangent is `numerator/denominator`, using the signs of both in determining the (otherwise ambiguous)\r\n * quadrant.\r\n * @param numerator numerator for tangent\r\n * @param denominator denominator for tangent\r\n */\r\n public static createAtan2(numerator: number, denominator: number): Angle { return new Angle(Math.atan2(numerator, denominator)); }\r\n /**\r\n * Copy all contents of `other` to this Angle.\r\n * @param other source data\r\n */\r\n public setFrom(other: Angle) { this._radians = other._radians; this._degrees = other._degrees; }\r\n /**\r\n * Create an Angle from a JSON object\r\n * @param json object from JSON.parse. If a number, value is in *DEGREES*\r\n * @param defaultValRadians if json is undefined, default value in radians.\r\n * @return a new Angle\r\n */\r\n public static fromJSON(json?: AngleProps, defaultValRadians?: number): Angle {\r\n const val = new Angle();\r\n val.setFromJSON(json, defaultValRadians);\r\n return val;\r\n }\r\n /**\r\n * set an Angle from a JSON object\r\n * * A simple number is degrees.\r\n * * specified `json.degrees` or `json._degrees` is degree value.\r\n * * specified `son.radians` or `json._radians` is radians value.\r\n * @param json object from JSON.parse. If a number, value is in *DEGREES*\r\n * @param defaultValRadians if json is undefined, default value in radians.\r\n */\r\n public setFromJSON(json?: AngleProps, defaultValRadians?: number) {\r\n this._radians = defaultValRadians ? defaultValRadians : 0;\r\n if (!json)\r\n return;\r\n if (typeof json === \"number\") {\r\n this.setDegrees(json);\r\n } else if (typeof (json as any).degrees === \"number\") {\r\n this.setDegrees((json as any).degrees);\r\n } else if (typeof (json as any)._degrees === \"number\") {\r\n this.setDegrees((json as any)._degrees);\r\n } else if (typeof (json as any).radians === \"number\") {\r\n this.setRadians((json as any).radians);\r\n } else if (typeof (json as any)._radians === \"number\") {\r\n this.setRadians((json as any)._radians);\r\n }\r\n }\r\n /** Convert an Angle to a JSON object as a number in degrees */\r\n public toJSON(): AngleProps { return this.degrees; }\r\n /** Return a json object with radians keyword, e.g. `{ radians: 0.10}` */\r\n public toJSONRadians(): AngleProps { return { radians: this.radians }; }\r\n /** Return the angle measured in radians. */\r\n public get radians(): number { return this._radians; }\r\n /** Return the angle measured in degrees. */\r\n public get degrees(): number { return this._degrees !== undefined ? this._degrees : Angle.radiansToDegrees(this._radians); }\r\n /**\r\n * Convert an angle in degrees to radians.\r\n * @param degrees angle in degrees\r\n */\r\n public static degreesToRadians(degrees: number) { return degrees * Math.PI / 180; }\r\n /**\r\n * Convert an angle in radians to degrees.\r\n * @param degrees angle in radians\r\n */\r\n public static radiansToDegrees(radians: number): number {\r\n if (radians < 0)\r\n return -Angle.radiansToDegrees(-radians);\r\n // Now radians is positive ...\r\n const pi = Math.PI;\r\n const factor = 180.0 / pi;\r\n if (radians <= 0.25 * pi)\r\n return factor * radians;\r\n if (radians < 0.75 * pi)\r\n return 90.0 + 180 * ((radians - 0.5 * pi) / pi);\r\n if (radians <= 1.25 * pi)\r\n return 180.0 + 180 * ((radians - pi) / pi);\r\n if (radians <= 1.75 * pi)\r\n return 270.0 + 180 * ((radians - 1.5 * pi) / pi);\r\n // all larger radians reference from 360 degrees (2PI)\r\n return 360.0 + 180 * ((radians - 2.0 * pi) / pi);\r\n }\r\n /**\r\n * Return the cosine of this Angle object's angle.\r\n */\r\n public cos(): number { return Math.cos(this._radians); }\r\n /**\r\n * Return the sine of this Angle object's angle.\r\n */\r\n public sin(): number { return Math.sin(this._radians); }\r\n /**\r\n * Return the tangent of this Angle object's angle.\r\n */\r\n public tan(): number { return Math.tan(this._radians); }\r\n /** Test if a radians (absolute) value is nearly 2PI or larger (!) */\r\n public static isFullCircleRadians(radians: number): boolean {\r\n return Math.abs(radians) >= Geometry.fullCircleRadiansMinusSmallAngle;\r\n }\r\n /** Test if the radians value is a complete circle */\r\n public static isHalfCircleRadians(radians: number): boolean {\r\n return Math.abs(Math.abs(radians) - Math.PI) <= Geometry.smallAngleRadians;\r\n }\r\n /** test if the angle is aa full circle */\r\n public get isFullCircle(): boolean { return Angle.isFullCircleRadians(this._radians); }\r\n\r\n /** test if the angle is a half circle (in either direction) */\r\n public get isHalfCircle(): boolean { return Angle.isHalfCircleRadians(this._radians); }\r\n /** Adjust a radians value so it is positive in 0..360 */\r\n public static adjustDegrees0To360(degrees: number): number {\r\n if (degrees >= 0) {\r\n const period = 360.0;\r\n if (degrees < period)\r\n return degrees;\r\n const numPeriods = Math.floor(degrees / period);\r\n return degrees - numPeriods * period;\r\n } else if (degrees < 0) {\r\n // negative angle ...\r\n const radians1 = Angle.adjustDegrees0To360(-degrees);\r\n return 360.0 - radians1;\r\n }\r\n // fall through for Nan (disaster) !!!\r\n return 0;\r\n }\r\n /** Adjust a radians value so it is in -180..180 */\r\n public static adjustDegreesSigned180(degrees: number): number {\r\n if (Math.abs(degrees) <= 180.0)\r\n return degrees;\r\n if (degrees >= 0) {\r\n const period = 360.0;\r\n const numPeriods = 1 + Math.floor((degrees - 180.0) / period);\r\n return degrees - numPeriods * period;\r\n } else if (degrees < 0) {\r\n // negative angle ...\r\n return -Angle.adjustDegreesSigned180(-degrees);\r\n }\r\n // fall through for NaN disaster.\r\n return 0;\r\n }\r\n /** Adjust a radians value so it is positive in 0..2Pi */\r\n public static adjustRadians0To2Pi(radians: number): number {\r\n if (radians >= 0) {\r\n const period = Math.PI * 2.0;\r\n if (radians < period)\r\n return radians;\r\n const numPeriods = Math.floor(radians / period);\r\n return radians - numPeriods * period;\r\n } else if (radians < 0) {\r\n // negative angle ...\r\n const radians1 = Angle.adjustRadians0To2Pi(-radians);\r\n return Math.PI * 2.0 - radians1;\r\n }\r\n // fall through for NaN disaster.\r\n return 0;\r\n }\r\n /** Adjust a radians value so it is positive in -PI..PI */\r\n public static adjustRadiansMinusPiPlusPi(radians: number): number {\r\n if (Math.abs(radians) <= Math.PI)\r\n return radians;\r\n if (radians >= 0) {\r\n const period = Math.PI * 2.0;\r\n const numPeriods = 1 + Math.floor((radians - Math.PI) / period);\r\n return radians - numPeriods * period;\r\n } else if (radians < 0) {\r\n // negative angle ...\r\n return -Angle.adjustRadiansMinusPiPlusPi(-radians);\r\n }\r\n // fall through for NaN disaster.\r\n return 0;\r\n }\r\n /** return a (newly allocated) Angle object with value 0 radians */\r\n public static zero() { return new Angle(0); }\r\n /** Test if the angle is exactly zero. */\r\n public get isExactZero() { return this.radians === 0; }\r\n /** Test if the angle is almost zero (within tolerance `Geometry.smallAngleRadians`) */\r\n public get isAlmostZero() { return Math.abs(this.radians) < Geometry.smallAngleRadians; }\r\n /** Test if the angle is almost a north or south pole (within tolerance `Geometry.smallAngleRadians`) */\r\n public get isAlmostNorthOrSouthPole() { return Angle.isHalfCircleRadians(this.radians * 2.0); }\r\n\r\n /** Create an angle object with degrees adjusted into 0..360. */\r\n public static createDegreesAdjustPositive(degrees: number): Angle { return Angle.createDegrees(Angle.adjustDegrees0To360(degrees)); }\r\n /** Create an angle object with degrees adjusted into -180..180. */\r\n public static createDegreesAdjustSigned180(degrees: number): Angle { return Angle.createDegrees(Angle.adjustDegreesSigned180(degrees)); }\r\n /**\r\n * Test if two radians values are equivalent, allowing shift by full circle (i.e. by a multiple of `2*PI`)\r\n * @param radiansA first radians value\r\n * @param radiansB second radians value\r\n */\r\n public static isAlmostEqualRadiansAllowPeriodShift(radiansA: number, radiansB: number): boolean {\r\n // try to get simple conclusions with un-shifted radians ...\r\n const delta = Math.abs(radiansA - radiansB);\r\n if (delta <= Geometry.smallAngleRadians)\r\n return true;\r\n const period = Math.PI * 2.0;\r\n if (Math.abs(delta - period) <= Geometry.smallAngleRadians)\r\n return true;\r\n const numPeriod = Math.round(delta / period);\r\n const delta1 = delta - numPeriod * period;\r\n return Math.abs(delta1) <= Geometry.smallAngleRadians;\r\n }\r\n /**\r\n * Test if this angle and other are equivalent, allowing shift by full circle (i.e. by a multiple of 360 degrees)\r\n */\r\n public isAlmostEqualAllowPeriodShift(other: Angle): boolean {\r\n return Angle.isAlmostEqualRadiansAllowPeriodShift(this._radians, other._radians);\r\n }\r\n /**\r\n * Test if two this angle and other are almost equal, NOT allowing shift by full circle multiples of 360 degrees.\r\n */\r\n public isAlmostEqualNoPeriodShift(other: Angle): boolean { return Math.abs(this._radians - other._radians) < Geometry.smallAngleRadians; }\r\n /**\r\n * Test if two angle (in radians) almost equal, NOT allowing shift by full circle multiples of `2 * PI`.\r\n * * (Same test as isAlmostEqualRadiansNoPeriodShift)\r\n */\r\n public isAlmostEqual(other: Angle): boolean { return this.isAlmostEqualNoPeriodShift(other); }\r\n /**\r\n * Test if two angle (in radians) almost equal, NOT allowing shift by full circle multiples of `2 * PI`.\r\n */\r\n public static isAlmostEqualRadiansNoPeriodShift(radiansA: number, radiansB: number): boolean { return Math.abs(radiansA - radiansB) < Geometry.smallAngleRadians; }\r\n /**\r\n * Test if dot product values indicate non-zero length perpendicular vectors.\r\n * @param dotUU dot product of vectorU with itself\r\n * @param dotVV dot product of vectorV with itself\r\n * @param dotUV dot product of vectorU with vectorV\r\n */\r\n public static isPerpendicularDotSet(dotUU: number, dotVV: number, dotUV: number): boolean {\r\n return dotUU > Geometry.smallMetricDistanceSquared\r\n && dotVV > Geometry.smallMetricDistanceSquared\r\n && dotUV * dotUV <= Geometry.smallAngleRadiansSquared * dotUU * dotVV;\r\n }\r\n /**\r\n * Return cosine, sine, and radians for the half angle of a cosine,sine pair.\r\n * @param rCos2A cosine value (scaled by radius) for initial angle.\r\n * @param rSin2A sine value (scaled by radius) for final angle.\r\n */\r\n public static trigValuesToHalfAngleTrigValues(rCos2A: number, rSin2A: number): TrigValues {\r\n const r = Geometry.hypotenuseXY(rCos2A, rSin2A);\r\n if (r < Geometry.smallMetricDistance) {\r\n return { c: 1.0, s: 0.0, radians: 0.0 };\r\n } else {\r\n /* If the caller really gave you sine and cosine values, r should be 1. However,*/\r\n /* to allow scaled values -- e.g. the x and y components of any vector -- we normalize*/\r\n /* right here. This adds an extra sqrt and 2 divides to the whole process, but improves*/\r\n /* both the usefulness and robustness of the computation.*/\r\n let cosA;\r\n let sinA = 0.0;\r\n const cos2A = rCos2A / r;\r\n const sin2A = rSin2A / r;\r\n if (cos2A >= 0.0) {\r\n /* Original angle in NE and SE quadrants. Half angle in same quadrant */\r\n cosA = Math.sqrt(0.5 * (1.0 + cos2A));\r\n sinA = sin2A / (2.0 * (cosA));\r\n } else {\r\n if (sin2A > 0.0) {\r\n /* Original angle in NW quadrant. Half angle in NE quadrant */\r\n sinA = Math.sqrt(0.5 * (1.0 - cos2A));\r\n } else {\r\n /* Original angle in SW quadrant. Half angle in SE quadrant*/\r\n /* cosA comes out positive because both sines are negative. */\r\n sinA = -Math.sqrt(0.5 * (1.0 - cos2A));\r\n }\r\n cosA = sin2A / (2.0 * (sinA));\r\n }\r\n return { c: cosA, s: sinA, radians: Math.atan2(sinA, cosA) };\r\n }\r\n }\r\n /** If value is close to -1, -0.5, 0, 0.5, 1, adjust it to the exact value. */\r\n public static cleanupTrigValue(value: number, tolerance: number = 1.0e-15): number {\r\n const absValue = Math.abs(value);\r\n if (absValue <= tolerance)\r\n return 0;\r\n let a = Math.abs(absValue - 0.5);\r\n if (a <= tolerance)\r\n return value < 0.0 ? -0.5 : 0.5;\r\n a = Math.abs(absValue - 1.0);\r\n if (a <= tolerance)\r\n return value < 0.0 ? -1.0 : 1.0;\r\n return value;\r\n }\r\n /**\r\n * Return the half angle cosine, sine, and radians for given dot products between vectors.\r\n * @param dotUU dot product of vectorU with itself\r\n * @param dotVV dot product of vectorV with itself\r\n * @param dotUV dot product of vectorU with vectorV\r\n */\r\n public static dotProductsToHalfAngleTrigValues(dotUU: number, dotVV: number, dotUV: number, favorZero: boolean = true): TrigValues {\r\n const rCos = dotUU - dotVV;\r\n const rSin = 2.0 * dotUV;\r\n if (favorZero && Math.abs(rSin) < Geometry.smallAngleRadians * (Math.abs(dotUU) + Math.abs(dotVV)))\r\n return { c: 1.0, s: 0.0, radians: 0.0 };\r\n return Angle.trigValuesToHalfAngleTrigValues(rCos, rSin);\r\n }\r\n /**\r\n * * Returns the angle between two vectors, with the vectors given as xyz components\r\n * * The returned angle is between 0 and PI\r\n *\r\n * @param ux x component of vector u\r\n * @param uy y component of vector u\r\n * @param uz z component of vector u\r\n * @param vx x component of vector v\r\n * @param vy y component of vector v\r\n * @param vz z component of vector v\r\n */\r\n public static radiansBetweenVectorsXYZ(ux: number, uy: number, uz: number, vx: number, vy: number, vz: number): number {\r\n // const uu = ux * ux + uy * uy + uz * uz;\r\n const uDotV = ux * vx + uy * vy + uz * vz; // magU magV cos(theta)\r\n // const vv = vx * vx + vy * vy + vz * vz;\r\n return Math.atan2(Geometry.crossProductMagnitude(ux, uy, uz, vx, vy, vz), uDotV);\r\n }\r\n /**\r\n * Add a multiple of a full circle angle (360 degrees, 2PI) in place.\r\n * @param multiple multiplier factor\r\n */\r\n public addMultipleOf2PiInPlace(multiple: number) {\r\n if (this._degrees !== undefined) {\r\n this._degrees += multiple * 360.0;\r\n this._radians = Angle.degreesToRadians(this._degrees);\r\n } else {\r\n this._radians += multiple * Angle.pi2Radians;\r\n }\r\n }\r\n}\r\n"]}
@@ -24,10 +24,10 @@ export declare class ClusterableArray extends GrowableBlockedArray {
24
24
  * @param data array of numDataPerBlock values.
25
25
  */
26
26
  addBlock(data: number[]): void;
27
- /** add a block with directly 2 to 5 listed content parameters.
27
+ /** add a block directly with 1 to 5 listed content parameters.
28
28
  * This assumes numDataPerPoint is sufficient for the parameters provided.
29
29
  */
30
- addDirect(x0: number, x1: number, x2?: number, x3?: number, x4?: number): void;
30
+ addDirect(x0: number, x1?: number, x2?: number, x3?: number, x4?: number): void;
31
31
  /** add a block directly from a Point2d with 0 to 3 extras
32
32
  * This assumes numDataPerPoint is sufficient for the parameters provided.
33
33
  */
@@ -98,6 +98,11 @@ export declare class ClusterableArray extends GrowableBlockedArray {
98
98
  * @param data points to cluster.
99
99
  */
100
100
  static clusterPoint3dArray(data: Point3d[], tolerance?: number): PackedPointsWithIndex;
101
+ /**
102
+ * Returns number array with indices mapping old to new.
103
+ * @param data numbers to cluster.
104
+ */
105
+ static clusterNumberArray(data: number[], tolerance?: number): PackedNumbersWithIndex;
101
106
  /**
102
107
  * Returns packed points with indices mapping old to new.
103
108
  * @param data points to cluster.
@@ -158,5 +163,27 @@ declare class PackedPoint2dsWithIndex {
158
163
  */
159
164
  updateIndices(indices: number[]): boolean;
160
165
  }
166
+ /**
167
+ * @internal
168
+ */
169
+ declare class PackedNumbersWithIndex {
170
+ /** Array of numbers */
171
+ packedNumbers: number[];
172
+ /** mapping from old point index to new point index. */
173
+ oldToNew: Uint32Array;
174
+ /** integer value for unknown index. */
175
+ static readonly invalidIndex = 4294967295;
176
+ /** construct a PackedNumbers object with
177
+ * * empty packedNumbers array
178
+ * * oldToNew indices all initialized to PackedNumbers.invalidIndex
179
+ */
180
+ constructor(numOldIndexEntry: number);
181
+ /**
182
+ * Use the oldToNew array to update an array of "old" indices.
183
+ * @param indices array of indices into prepacked array.
184
+ * @returns true if all input indices were valid for the oldToNew array.
185
+ */
186
+ updateIndices(indices: number[]): boolean;
187
+ }
161
188
  export {};
162
189
  //# sourceMappingURL=ClusterableArray.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ClusterableArray.d.ts","sourceRoot":"","sources":["../../../src/numerics/ClusterableArray.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAExD;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,oBAAoB;IAKxD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAU;IAC/C,6CAA6C;WAC/B,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAKxD,OAAO,CAAC,sBAAsB,CAAS;IACvC,OAAO,CAAC,qBAAqB,CAAS;IACtC;;;;OAIG;gBACgB,qBAAqB,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM;IAK5G;;OAEG;IACa,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE;IAMvC;;OAEG;IACI,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM;IAS9E;;OAEG;IACI,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM;IAYjE;;OAEG;IACI,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM;IAYlE,6CAA6C;IACtC,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO;IAIhE,8CAA8C;IACvC,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO;IAIhE,uCAAuC;IAChC,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAI1D,iCAAiC;IAC1B,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAKrD,oCAAoC;IAC7B,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKvE,+EAA+E;IAC/E,gBAAuB,iBAAiB,cAAc;IACtD,mDAAmD;WACrC,mBAAmB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IACrD;;;;;;;;;;;OAWG;IACI,qBAAqB,CAAC,gBAAgB,GAAE,MAAqC,GAAG,WAAW;IAsClG;;OAEG;IACI,uBAAuB;IAgB9B;;OAEG;IACI,MAAM,IAAI,GAAG,EAAE;IActB;;;OAGG;IACI,8BAA8B,CAAC,eAAe,EAAE,WAAW,GAAG,WAAW;IAchF;;;OAGG;IACI,8BAA8B,CAAC,eAAe,EAAE,WAAW,GAAG,WAAW;IAiBhF,uDAAuD;IAChD,aAAa,CAAC,eAAe,EAAE,WAAW,GAAG,MAAM;IAS1D;;OAEG;IACI,gCAAgC,CAAC,eAAe,EAAE,WAAW,GAAG,WAAW;IAkBlF;;;;OAIG;IACI,sBAAsB,CAAC,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM;IA0B5E;;;OAGG;WACW,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,SAAS,GAAE,MAAqC,GACjG,qBAAqB;IAuBvB;;;OAGG;WACW,2BAA2B,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,GAAE,MAAqC,GAAG,uBAAuB;IA2B7I;;;OAGG;WACW,2BAA2B,CAAC,MAAM,EAAE,gBAAgB,EAAE,SAAS,GAAE,MAAqC,GAClH,qBAAqB;CA2BxB;AAeD;;;;;GAKG;AACH,cAAM,qBAAqB;IACzB,uBAAuB;IAChB,YAAY,EAAE,OAAO,EAAE,CAAC;IAC/B,uDAAuD;IAChD,oBAAoB,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC1D,uDAAuD;IAChD,QAAQ,EAAE,WAAW,CAAC;IAC7B,uCAAuC;IACvC,gBAAuB,YAAY,cAAc;IAEjD;;;OAGG;gBACS,gBAAgB,EAAE,MAAM;IAOpC;;;;OAIG;IACI,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO;CAGjD;AAED;;GAEG;AACH,cAAM,uBAAuB;IAC3B,sDAAsD;IAC/C,oBAAoB,EAAE,eAAe,CAAC;IAC7C,uDAAuD;IAChD,QAAQ,EAAE,WAAW,CAAC;IAC7B,uCAAuC;IACvC,gBAAuB,YAAY,cAAc;IAEjD;;;OAGG;gBACS,gBAAgB,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM;IAO7D;;;;OAIG;IACI,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO;CAGjD"}
1
+ {"version":3,"file":"ClusterableArray.d.ts","sourceRoot":"","sources":["../../../src/numerics/ClusterableArray.ts"],"names":[],"mappings":"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"}
@@ -43,13 +43,14 @@ export class ClusterableArray extends GrowableBlockedArray {
43
43
  for (let i = 0; i < n; i++)
44
44
  this._data[i0 + i] = data[i];
45
45
  }
46
- /** add a block with directly 2 to 5 listed content parameters.
46
+ /** add a block directly with 1 to 5 listed content parameters.
47
47
  * This assumes numDataPerPoint is sufficient for the parameters provided.
48
48
  */
49
49
  addDirect(x0, x1, x2, x3, x4) {
50
50
  const i0 = this.newBlockIndex();
51
51
  this._data[i0 + 1] = x0;
52
- this._data[i0 + 2] = x1;
52
+ if (x1 !== undefined)
53
+ this._data[i0 + 2] = x1;
53
54
  if (x2 !== undefined)
54
55
  this._data[i0 + 3] = x2;
55
56
  if (x3 !== undefined)
@@ -334,6 +335,31 @@ export class ClusterableArray extends GrowableBlockedArray {
334
335
  });
335
336
  return result;
336
337
  }
338
+ /**
339
+ * Returns number array with indices mapping old to new.
340
+ * @param data numbers to cluster.
341
+ */
342
+ static clusterNumberArray(data, tolerance = Geometry.smallMetricDistance) {
343
+ const clusterArray = new ClusterableArray(1, 0, data.length);
344
+ data.forEach((x) => { clusterArray.addDirect(x); });
345
+ const order = clusterArray.clusterIndicesLexical(tolerance);
346
+ const result = new PackedNumbersWithIndex(data.length);
347
+ let currentClusterIndex = 0;
348
+ let numThisCluster = 0;
349
+ order.forEach((k) => {
350
+ if (ClusterableArray.isClusterTerminator(k)) {
351
+ currentClusterIndex++;
352
+ numThisCluster = 0;
353
+ }
354
+ else {
355
+ if (numThisCluster === 0)
356
+ result.packedNumbers.push(data[k]);
357
+ result.oldToNew[k] = currentClusterIndex;
358
+ numThisCluster++;
359
+ }
360
+ });
361
+ return result;
362
+ }
337
363
  /**
338
364
  * Returns packed points with indices mapping old to new.
339
365
  * @param data points to cluster.
@@ -474,4 +500,30 @@ class PackedPoint2dsWithIndex {
474
500
  }
475
501
  /** integer value for unknown index. */
476
502
  PackedPoint2dsWithIndex.invalidIndex = 0xFFFFffff;
503
+ /**
504
+ * @internal
505
+ */
506
+ class PackedNumbersWithIndex {
507
+ /** construct a PackedNumbers object with
508
+ * * empty packedNumbers array
509
+ * * oldToNew indices all initialized to PackedNumbers.invalidIndex
510
+ */
511
+ constructor(numOldIndexEntry) {
512
+ this.packedNumbers = [];
513
+ this.oldToNew = new Uint32Array(numOldIndexEntry);
514
+ for (let i = 0; i < numOldIndexEntry; i++) {
515
+ this.oldToNew[i] = PackedPointsWithIndex.invalidIndex;
516
+ }
517
+ }
518
+ /**
519
+ * Use the oldToNew array to update an array of "old" indices.
520
+ * @param indices array of indices into prepacked array.
521
+ * @returns true if all input indices were valid for the oldToNew array.
522
+ */
523
+ updateIndices(indices) {
524
+ return updateIndices(indices, this.oldToNew);
525
+ }
526
+ }
527
+ /** integer value for unknown index. */
528
+ PackedNumbersWithIndex.invalidIndex = 0xFFFFffff;
477
529
  //# sourceMappingURL=ClusterableArray.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ClusterableArray.js","sourceRoot":"","sources":["../../../src/numerics/ClusterableArray.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 Numerics\r\n */\r\n\r\nimport { Geometry } from \"../Geometry\";\r\nimport { GrowableBlockedArray } from \"../geometry3d/GrowableBlockedArray\";\r\nimport { GrowableXYArray } from \"../geometry3d/GrowableXYArray\";\r\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\r\nimport { Point2d } from \"../geometry3d/Point2dVector2d\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\n\r\n/**\r\n * Blocked array with operations to sort and cluster with a tolerance.\r\n * * Primary sorting is along an \"arbitrary\" sort vector.\r\n * @internal\r\n */\r\nexport class ClusterableArray extends GrowableBlockedArray {\r\n // (This is pretty strange)\r\n // The sort vector is (1,c, c*c, ...)\r\n // Setting c = 1 makes it 1,1,1 which may be useful for visual scans during debug.\r\n // c with some non-obvious digits makes it unlikely that there will be multiple points on a perpendicular to the sort vector.\r\n private static readonly _vectorFactor = 0.8732; // use 1.0 to rig easy tests.\r\n /** Return a component of the sort vector. */\r\n public static sortVectorComponent(index: number): number {\r\n let c = 1.0;\r\n for (let i = 1; i < index; i++) c *= ClusterableArray._vectorFactor;\r\n return c;\r\n }\r\n private _numCoordinatePerPoint: number;\r\n private _numExtraDataPerPoint: number;\r\n /**\r\n * @param numCoordinatePerPoint number of coordinates per point\r\n * @param numExtraDataPerPoint of extra data values per point.\r\n * @param initialBlockCapacity predicted number of points. (This does not have to be accurate)\r\n */\r\n public constructor(numCoordinatePerPoint: number, numExtraDataPerPoint: number, initialBlockCapacity: number) {\r\n super(1 + numCoordinatePerPoint + numExtraDataPerPoint, initialBlockCapacity);\r\n this._numExtraDataPerPoint = numExtraDataPerPoint;\r\n this._numCoordinatePerPoint = numCoordinatePerPoint;\r\n }\r\n /** load a block, placing data[i] at block[i+1] to allow sort coordinate first.\r\n * @param data array of numDataPerBlock values.\r\n */\r\n public override addBlock(data: number[]) {\r\n const i0 = this.newBlockIndex() + 1;\r\n const n = Math.min(this.numPerBlock - 1, data.length);\r\n for (let i = 0; i < n; i++)\r\n this._data[i0 + i] = data[i];\r\n }\r\n /** add a block with directly 2 to 5 listed content parameters.\r\n * This assumes numDataPerPoint is sufficient for the parameters provided.\r\n */\r\n public addDirect(x0: number, x1: number, x2?: number, x3?: number, x4?: number) {\r\n const i0 = this.newBlockIndex();\r\n this._data[i0 + 1] = x0;\r\n this._data[i0 + 2] = x1;\r\n if (x2 !== undefined) this._data[i0 + 3] = x2;\r\n if (x3 !== undefined) this._data[i0 + 4] = x3;\r\n if (x4 !== undefined) this._data[i0 + 5] = x4;\r\n }\r\n\r\n /** add a block directly from a Point2d with 0 to 3 extras\r\n * This assumes numDataPerPoint is sufficient for the parameters provided.\r\n */\r\n public addPoint2d(xy: Point2d, a?: number, b?: number, c?: number) {\r\n const i0 = this.newBlockIndex();\r\n this._data[i0 + 1] = xy.x;\r\n this._data[i0 + 2] = xy.y;\r\n if (a !== undefined)\r\n this._data[i0 + 3] = a;\r\n if (b !== undefined)\r\n this._data[i0 + 4] = b;\r\n if (c !== undefined)\r\n this._data[i0 + 5] = c;\r\n }\r\n\r\n /** add a block with directly from a Point2d with 0 to 3 extras\r\n * This assumes numDataPerPoint is sufficient for the parameters provided.\r\n */\r\n public addPoint3d(xyz: Point3d, a?: number, b?: number, c?: number) {\r\n const i0 = this.newBlockIndex();\r\n this._data[i0 + 1] = xyz.x;\r\n this._data[i0 + 2] = xyz.y;\r\n this._data[i0 + 3] = xyz.z;\r\n if (a !== undefined)\r\n this._data[i0 + 4] = a;\r\n if (b !== undefined)\r\n this._data[i0 + 5] = b;\r\n if (c !== undefined)\r\n this._data[i0 + 6] = c;\r\n }\r\n /** Get the xy coordinates by point index. */\r\n public getPoint2d(blockIndex: number, result?: Point2d): Point2d {\r\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\r\n return Point2d.create(this._data[i0 + 1], this._data[i0 + 2], result);\r\n }\r\n /** Get the xyZ coordinates by point index. */\r\n public getPoint3d(blockIndex: number, result?: Point3d): Point3d {\r\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\r\n return Point3d.create(this._data[i0 + 1], this._data[i0 + 2], this._data[i0 + 3], result);\r\n }\r\n /** Return a single extra data value */\r\n public getExtraData(blockIndex: number, i: number): number {\r\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\r\n return this._data[i0 + 1 + this._numCoordinatePerPoint + i];\r\n }\r\n /** Return a single data value */\r\n public getData(blockIndex: number, i: number): number {\r\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\r\n return this._data[i0 + i];\r\n }\r\n\r\n /** Set a single extra data value */\r\n public setExtraData(blockIndex: number, i: number, value: number): void {\r\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\r\n this._data[i0 + 1 + this._numCoordinatePerPoint + i] = value;\r\n }\r\n\r\n /** this value is used as cluster terminator in the Uint232Array of indices. */\r\n public static readonly clusterTerminator = 0xFFffFFff;\r\n /** Test if `x` is the cluster terminator value. */\r\n public static isClusterTerminator(x: number): boolean { return x === ClusterableArray.clusterTerminator; }\r\n /** Return an array giving clusters of blocks with similar coordinates.\r\n *\r\n * * The contents of each block is assumed to be set up so the primary sort coordinate is first.\r\n *\r\n * ** simple coordinate blocks (x,y) or (x,y,z) would work fine but have occasional performance problems because points with same x would generate big blocks of\r\n * candidates for clusters.\r\n * ** The usual solution is to u value which is a dot product along some skew direction and have the blocks contain (u,x,y) or (u,x,y,z) for 2d versus 3d.\r\n * ** apply setupPrimaryClusterSort to prepare that!!!\r\n * * After a simple lexical sort, consecutive blocks that are within tolerance in the 0 component\r\n * are inspected. Within that candidate set, all blocks that are within tolerance for ALL components are clustered.\r\n * * In the output cluster array, clusters are terminated a invalid index. Test for the invalid index with GrowableBlockArray.isClusterTerminator (x)\r\n */\r\n public clusterIndicesLexical(clusterTolerance: number = Geometry.smallMetricDistance): Uint32Array {\r\n // install primary sort key\r\n this.setupPrimaryClusterSort();\r\n // presort by all coordinates ....\r\n const firstSort = this.sortIndicesLexical();\r\n const clusterIndices = new Uint32Array(2 * firstSort.length); // worst case: no duplicates, each index goes in followed by terminator.\r\n let m = 0; // number of cluster indices\r\n const n = this.numBlocks; // and this must match firstSort.length !!\r\n let clusterStartBlockIndex = 0;\r\n let candidateBlockIndex = 0;\r\n let barrierU = 0.0;\r\n let i = 0;\r\n let j = 0;\r\n\r\n const k0 = 1; // beginning of active column for distance\r\n const k1 = 1 + this._numCoordinatePerPoint;\r\n for (i = 0; i < n; i++) {\r\n clusterStartBlockIndex = firstSort[i];\r\n if (!ClusterableArray.isClusterTerminator(clusterStartBlockIndex)) {\r\n // unused block, so it becomes a cluster...\r\n clusterIndices[m++] = clusterStartBlockIndex;\r\n barrierU = this.component(clusterStartBlockIndex, 0) + clusterTolerance;\r\n firstSort[i] = ClusterableArray.clusterTerminator;\r\n for (j = i + 1; j < n; j++) {\r\n candidateBlockIndex = firstSort[j];\r\n if (candidateBlockIndex === ClusterableArray.clusterTerminator) continue; // nearby in sort direction but already in a cluster.\r\n if (this.component(candidateBlockIndex, 0) >= barrierU) break;\r\n if (this.distanceBetweenSubBlocks(clusterStartBlockIndex, candidateBlockIndex, k0, k1) < clusterTolerance) {\r\n clusterIndices[m++] = candidateBlockIndex; // The candidate is in the block\r\n firstSort[j] = ClusterableArray.clusterTerminator; // and it will not be reused as future block base\r\n }\r\n }\r\n clusterIndices[m++] = ClusterableArray.clusterTerminator;\r\n }\r\n }\r\n // Alas, the clusterIndices array has fluff at the end. So it has to be copied.\r\n return clusterIndices.slice(0, m);\r\n }\r\n /** setup (overwrite!!) the \"0\" component with the dot product of numClusterCoordinate later components with a non-axis aligned vector.\r\n * This is normally called before clusterIndicesLexical.\r\n */\r\n public setupPrimaryClusterSort() {\r\n const nb = this.numBlocks;\r\n const nc = this._numCoordinatePerPoint;\r\n const vector = new Float64Array(nc);\r\n vector[0] = 1.0;\r\n for (let c = 1; c < nc; c++) vector[c] = vector[c - 1] * ClusterableArray._vectorFactor;\r\n let k = 0;\r\n let dot = 0.0;\r\n const data = this._data;\r\n for (let b = 0; b < nb; b++) {\r\n k = this.blockIndexToDoubleIndex(b);\r\n dot = 0.0;\r\n for (let c = 0; c < nc; c++) { dot += vector[c] * data[k + 1 + c]; }\r\n data[k] = dot;\r\n }\r\n }\r\n /** Convert the cluster data to an array of tuples with point i in the form\r\n * `[i, primarySortCoordinate, [x,y,..], [extraData0, extraData1, ...]]`\r\n */\r\n public toJSON(): any[] {\r\n const result: any[] = [];\r\n for (let b = 0; b < this.numBlocks; b++) {\r\n let i = this.blockIndexToDoubleIndex(b);\r\n const chunk: any[] = [b, this._data[i++]];\r\n const coordinates = [];\r\n for (let c = 0; c < this._numCoordinatePerPoint; c++)coordinates.push(this._data[i++]);\r\n chunk.push(coordinates);\r\n for (let c = 0; c < this._numExtraDataPerPoint; c++)\r\n chunk.push(this._data[i++]);\r\n result.push(chunk);\r\n }\r\n return result;\r\n }\r\n /**\r\n * Return an array of indices from block index to cluster index.\r\n * @param clusteredBlocks clusters of block indices followed by separators.\r\n */\r\n public createIndexBlockToClusterIndex(clusteredBlocks: Uint32Array): Uint32Array {\r\n const numBlocks = this.numBlocks;\r\n const blockToCluster = new Uint32Array(numBlocks);\r\n blockToCluster.fill(ClusterableArray.clusterTerminator);\r\n let numCluster = 0;\r\n for (const b of clusteredBlocks) {\r\n if (b >= numBlocks) {\r\n numCluster++;\r\n } else {\r\n blockToCluster[b] = numCluster;\r\n }\r\n }\r\n return blockToCluster;\r\n }\r\n /**\r\n * Return an array of indices from block index to index of its cluster's start in the cluster index array.\r\n * @param clusteredBlocks clusters of block indices followed by separators.\r\n */\r\n public createIndexBlockToClusterStart(clusteredBlocks: Uint32Array): Uint32Array {\r\n const n = clusteredBlocks.length;\r\n const numBlocks = this.numBlocks;\r\n const blockToClusterStart = new Uint32Array(numBlocks);\r\n const terminator = ClusterableArray.clusterTerminator;\r\n blockToClusterStart.fill(terminator);\r\n let clusterStart = 0;\r\n for (let i = 0; i < n; i++) {\r\n const k = clusteredBlocks[i];\r\n if (k > numBlocks) {\r\n clusterStart = i + 1;\r\n } else {\r\n blockToClusterStart[k] = clusterStart;\r\n }\r\n }\r\n return blockToClusterStart;\r\n }\r\n /** count the clusters in the clusteredBlocks array. */\r\n public countClusters(clusteredBlocks: Uint32Array): number {\r\n let numClusters = 0;\r\n const terminator = ClusterableArray.clusterTerminator;\r\n for (const b of clusteredBlocks) {\r\n if (b === terminator)\r\n numClusters++;\r\n }\r\n return numClusters;\r\n }\r\n /** create a reverse index: given a cluster index k, clusterToClusterStart[k] is the place\r\n * the cluster's block indices appear in clusterBlocks\r\n */\r\n public createIndexClusterToClusterStart(clusteredBlocks: Uint32Array): Uint32Array {\r\n let numCluster = this.countClusters(clusteredBlocks);\r\n const clusterToClusterStart = new Uint32Array(numCluster);\r\n const terminator = ClusterableArray.clusterTerminator;\r\n clusterToClusterStart.fill(terminator);\r\n const n = clusteredBlocks.length;\r\n let clusterStart = 0;\r\n for (let i = 0; i < n; i++) {\r\n const k = clusteredBlocks[i];\r\n if (k === terminator) {\r\n clusterStart = i + 1;\r\n } else if (i === clusterStart) {\r\n clusterToClusterStart[numCluster++] = clusterStart;\r\n }\r\n }\r\n return clusterToClusterStart;\r\n }\r\n\r\n /**\r\n * Sort terminator-delimited subsets of an array of indices into the table, using a single extraData index as sort key.\r\n * @param blockedIndices [in] indices, organized as blocks of good indices terminated by the clusterTerminator.\r\n * @param extraDataIndex index of the extra data key.\r\n */\r\n public sortSubsetsBySingleKey(blockedIndices: Uint32Array, dataIndex: number) {\r\n const dataOffset = 1 + dataIndex;\r\n let kBegin = 0;\r\n let swap;\r\n let key0, key1;\r\n const numK = blockedIndices.length;\r\n for (let kEnd = 0; kEnd < numK; kEnd++) {\r\n if (blockedIndices[kEnd] === ClusterableArray.clusterTerminator) {\r\n // sort blockedIndices[kBegin ,= k < kEnd].\r\n // (search for minimum remaining, swap . . )\r\n for (let k0 = kBegin; k0 + 1 < kEnd; k0++) {\r\n key0 = this.getWithinBlock(blockedIndices[k0], dataOffset);\r\n for (let k1 = k0 + 1; k1 < kEnd; k1++) {\r\n key1 = this.getWithinBlock(blockedIndices[k1], dataOffset);\r\n if (key1 < key0) {\r\n swap = blockedIndices[k0];\r\n blockedIndices[k0] = blockedIndices[k1];\r\n blockedIndices[k1] = swap;\r\n key0 = key1;\r\n }\r\n }\r\n }\r\n kBegin = kEnd + 1;\r\n }\r\n }\r\n }\r\n /**\r\n * Returns packed points with indices mapping old to new.\r\n * @param data points to cluster.\r\n */\r\n public static clusterPoint3dArray(data: Point3d[], tolerance: number = Geometry.smallMetricDistance):\r\n PackedPointsWithIndex {\r\n const clusterArray = new ClusterableArray(3, 0, data.length);\r\n data.forEach((p: Point3d) => {\r\n clusterArray.addDirect(p.x, p.y, p.z);\r\n });\r\n const order = clusterArray.clusterIndicesLexical(tolerance);\r\n const result = new PackedPointsWithIndex(data.length);\r\n let currentClusterIndex = 0;\r\n let numThisCluster = 0;\r\n order.forEach((k: number) => {\r\n if (ClusterableArray.isClusterTerminator(k)) {\r\n currentClusterIndex++;\r\n numThisCluster = 0;\r\n } else {\r\n if (numThisCluster === 0)\r\n result.packedPoints.push(data[k].clone());\r\n result.oldToNew[k] = currentClusterIndex;\r\n numThisCluster++;\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns packed points with indices mapping old to new.\r\n * @param data points to cluster.\r\n */\r\n public static clusterGrowablePoint2dArray(source: GrowableXYArray, tolerance: number = Geometry.smallMetricDistance): PackedPoint2dsWithIndex {\r\n const clusterArray = new ClusterableArray(2, 0, source.length);\r\n const p = Point2d.create();\r\n const numSourcePoint = source.length;\r\n for (let i = 0; i < numSourcePoint; i++) {\r\n source.getPoint2dAtUncheckedPointIndex(i, p);\r\n clusterArray.addDirect(p.x, p.y);\r\n }\r\n const order = clusterArray.clusterIndicesLexical(tolerance);\r\n const numPackedPoints = clusterArray.countClusters(order);\r\n const result = new PackedPoint2dsWithIndex(source.length, numPackedPoints);\r\n let currentClusterIndex = 0;\r\n let numThisCluster = 0;\r\n order.forEach((k: number) => {\r\n if (ClusterableArray.isClusterTerminator(k)) {\r\n currentClusterIndex++;\r\n numThisCluster = 0;\r\n } else {\r\n if (numThisCluster === 0) // This is the first encounter with a new cluster\r\n result.growablePackedPoints.pushFromGrowableXYArray(source, k);\r\n result.oldToNew[k] = currentClusterIndex;\r\n numThisCluster++;\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns packed points with indices mapping old to new.\r\n * @param data points to cluster.\r\n */\r\n public static clusterGrowablePoint3dArray(source: GrowableXYZArray, tolerance: number = Geometry.smallMetricDistance):\r\n PackedPointsWithIndex {\r\n const clusterArray = new ClusterableArray(3, 0, source.length);\r\n const p = Point3d.create();\r\n const numSourcePoint = source.length;\r\n for (let i = 0; i < numSourcePoint; i++) {\r\n source.getPoint3dAtUncheckedPointIndex(i, p);\r\n clusterArray.addDirect(p.x, p.y, p.z);\r\n }\r\n const order = clusterArray.clusterIndicesLexical(tolerance);\r\n const result = new PackedPointsWithIndex(source.length);\r\n const numPackedPoints = clusterArray.countClusters(order);\r\n result.growablePackedPoints = new GrowableXYZArray(numPackedPoints);\r\n let currentClusterIndex = 0;\r\n let numThisCluster = 0;\r\n order.forEach((k: number) => {\r\n if (ClusterableArray.isClusterTerminator(k)) {\r\n currentClusterIndex++;\r\n numThisCluster = 0;\r\n } else {\r\n if (numThisCluster === 0) // This is the first encounter with a new cluster\r\n result.growablePackedPoints!.pushFromGrowableXYZArray(source, k);\r\n result.oldToNew[k] = currentClusterIndex;\r\n numThisCluster++;\r\n }\r\n });\r\n return result;\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nfunction updateIndices(indices: number[], oldToNew: Uint32Array): boolean {\r\n let numErrors = 0;\r\n indices.forEach((value: number, i: number, data: number[]) => {\r\n if (value < oldToNew.length) {\r\n data[i] = oldToNew[value];\r\n } else numErrors++;\r\n });\r\n return numErrors === 0;\r\n}\r\n\r\n/**\r\n * Data carrier class for\r\n * * packedPoints = an array of Point3d\r\n * * oldToNew = array of indices from some prior Point3d[] to the packed points.\r\n * @internal\r\n */\r\nclass PackedPointsWithIndex {\r\n /** Array of Point3d */\r\n public packedPoints: Point3d[];\r\n /** array of coordinates packed in GrowableXYZArray */\r\n public growablePackedPoints: GrowableXYZArray | undefined;\r\n /** mapping from old point index to new point index. */\r\n public oldToNew: Uint32Array;\r\n /** integer value for unknown index. */\r\n public static readonly invalidIndex = 0xFFFFffff;\r\n\r\n /** construct a PackedPoints object with\r\n * * empty packedPoints array\r\n * * oldToNew indices all initialized to PackedPoints.invalidIndex\r\n */\r\n constructor(numOldIndexEntry: number) {\r\n this.packedPoints = [];\r\n this.oldToNew = new Uint32Array(numOldIndexEntry);\r\n for (let i = 0; i < numOldIndexEntry; i++) {\r\n this.oldToNew[i] = PackedPointsWithIndex.invalidIndex;\r\n }\r\n }\r\n /**\r\n * Use the oldToNew array to update an array of \"old\" indices.\r\n * @param indices array of indices into prepacked array.\r\n * @returns true if all input indices were valid for the oldToNew array.\r\n */\r\n public updateIndices(indices: number[]): boolean {\r\n return updateIndices(indices, this.oldToNew);\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nclass PackedPoint2dsWithIndex {\r\n /** array of coordinates packed in GrowableXYArray */\r\n public growablePackedPoints: GrowableXYArray;\r\n /** mapping from old point index to new point index. */\r\n public oldToNew: Uint32Array;\r\n /** integer value for unknown index. */\r\n public static readonly invalidIndex = 0xFFFFffff;\r\n\r\n /** construct a PackedPoints object with\r\n * * empty packedPoints array\r\n * * oldToNew indices all initialized to PackedPoints.invalidIndex\r\n */\r\n constructor(numOldIndexEntry: number, numPackedPoints: number) {\r\n this.growablePackedPoints = new GrowableXYArray(numPackedPoints);\r\n this.oldToNew = new Uint32Array(numOldIndexEntry);\r\n for (let i = 0; i < numOldIndexEntry; i++) {\r\n this.oldToNew[i] = PackedPoint2dsWithIndex.invalidIndex;\r\n }\r\n }\r\n /**\r\n * Use the oldToNew array to update an array of \"old\" indices.\r\n * @param indices array of indices into prepacked array.\r\n * @returns true if all input indices were valid for the oldToNew array.\r\n */\r\n public updateIndices(indices: number[]): boolean {\r\n return updateIndices(indices, this.oldToNew);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ClusterableArray.js","sourceRoot":"","sources":["../../../src/numerics/ClusterableArray.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 Numerics\r\n */\r\n\r\nimport { Geometry } from \"../Geometry\";\r\nimport { GrowableBlockedArray } from \"../geometry3d/GrowableBlockedArray\";\r\nimport { GrowableXYArray } from \"../geometry3d/GrowableXYArray\";\r\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\r\nimport { Point2d } from \"../geometry3d/Point2dVector2d\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\n\r\n/**\r\n * Blocked array with operations to sort and cluster with a tolerance.\r\n * * Primary sorting is along an \"arbitrary\" sort vector.\r\n * @internal\r\n */\r\nexport class ClusterableArray extends GrowableBlockedArray {\r\n // (This is pretty strange)\r\n // The sort vector is (1,c, c*c, ...)\r\n // Setting c = 1 makes it 1,1,1 which may be useful for visual scans during debug.\r\n // c with some non-obvious digits makes it unlikely that there will be multiple points on a perpendicular to the sort vector.\r\n private static readonly _vectorFactor = 0.8732; // use 1.0 to rig easy tests.\r\n /** Return a component of the sort vector. */\r\n public static sortVectorComponent(index: number): number {\r\n let c = 1.0;\r\n for (let i = 1; i < index; i++) c *= ClusterableArray._vectorFactor;\r\n return c;\r\n }\r\n private _numCoordinatePerPoint: number;\r\n private _numExtraDataPerPoint: number;\r\n /**\r\n * @param numCoordinatePerPoint number of coordinates per point\r\n * @param numExtraDataPerPoint of extra data values per point.\r\n * @param initialBlockCapacity predicted number of points. (This does not have to be accurate)\r\n */\r\n public constructor(numCoordinatePerPoint: number, numExtraDataPerPoint: number, initialBlockCapacity: number) {\r\n super(1 + numCoordinatePerPoint + numExtraDataPerPoint, initialBlockCapacity);\r\n this._numExtraDataPerPoint = numExtraDataPerPoint;\r\n this._numCoordinatePerPoint = numCoordinatePerPoint;\r\n }\r\n /** load a block, placing data[i] at block[i+1] to allow sort coordinate first.\r\n * @param data array of numDataPerBlock values.\r\n */\r\n public override addBlock(data: number[]) {\r\n const i0 = this.newBlockIndex() + 1;\r\n const n = Math.min(this.numPerBlock - 1, data.length);\r\n for (let i = 0; i < n; i++)\r\n this._data[i0 + i] = data[i];\r\n }\r\n /** add a block directly with 1 to 5 listed content parameters.\r\n * This assumes numDataPerPoint is sufficient for the parameters provided.\r\n */\r\n public addDirect(x0: number, x1?: number, x2?: number, x3?: number, x4?: number) {\r\n const i0 = this.newBlockIndex();\r\n this._data[i0 + 1] = x0;\r\n if (x1 !== undefined) this._data[i0 + 2] = x1;\r\n if (x2 !== undefined) this._data[i0 + 3] = x2;\r\n if (x3 !== undefined) this._data[i0 + 4] = x3;\r\n if (x4 !== undefined) this._data[i0 + 5] = x4;\r\n }\r\n\r\n /** add a block directly from a Point2d with 0 to 3 extras\r\n * This assumes numDataPerPoint is sufficient for the parameters provided.\r\n */\r\n public addPoint2d(xy: Point2d, a?: number, b?: number, c?: number) {\r\n const i0 = this.newBlockIndex();\r\n this._data[i0 + 1] = xy.x;\r\n this._data[i0 + 2] = xy.y;\r\n if (a !== undefined)\r\n this._data[i0 + 3] = a;\r\n if (b !== undefined)\r\n this._data[i0 + 4] = b;\r\n if (c !== undefined)\r\n this._data[i0 + 5] = c;\r\n }\r\n\r\n /** add a block with directly from a Point2d with 0 to 3 extras\r\n * This assumes numDataPerPoint is sufficient for the parameters provided.\r\n */\r\n public addPoint3d(xyz: Point3d, a?: number, b?: number, c?: number) {\r\n const i0 = this.newBlockIndex();\r\n this._data[i0 + 1] = xyz.x;\r\n this._data[i0 + 2] = xyz.y;\r\n this._data[i0 + 3] = xyz.z;\r\n if (a !== undefined)\r\n this._data[i0 + 4] = a;\r\n if (b !== undefined)\r\n this._data[i0 + 5] = b;\r\n if (c !== undefined)\r\n this._data[i0 + 6] = c;\r\n }\r\n /** Get the xy coordinates by point index. */\r\n public getPoint2d(blockIndex: number, result?: Point2d): Point2d {\r\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\r\n return Point2d.create(this._data[i0 + 1], this._data[i0 + 2], result);\r\n }\r\n /** Get the xyZ coordinates by point index. */\r\n public getPoint3d(blockIndex: number, result?: Point3d): Point3d {\r\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\r\n return Point3d.create(this._data[i0 + 1], this._data[i0 + 2], this._data[i0 + 3], result);\r\n }\r\n /** Return a single extra data value */\r\n public getExtraData(blockIndex: number, i: number): number {\r\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\r\n return this._data[i0 + 1 + this._numCoordinatePerPoint + i];\r\n }\r\n /** Return a single data value */\r\n public getData(blockIndex: number, i: number): number {\r\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\r\n return this._data[i0 + i];\r\n }\r\n\r\n /** Set a single extra data value */\r\n public setExtraData(blockIndex: number, i: number, value: number): void {\r\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\r\n this._data[i0 + 1 + this._numCoordinatePerPoint + i] = value;\r\n }\r\n\r\n /** this value is used as cluster terminator in the Uint232Array of indices. */\r\n public static readonly clusterTerminator = 0xFFffFFff;\r\n /** Test if `x` is the cluster terminator value. */\r\n public static isClusterTerminator(x: number): boolean { return x === ClusterableArray.clusterTerminator; }\r\n /** Return an array giving clusters of blocks with similar coordinates.\r\n *\r\n * * The contents of each block is assumed to be set up so the primary sort coordinate is first.\r\n *\r\n * ** simple coordinate blocks (x,y) or (x,y,z) would work fine but have occasional performance problems because points with same x would generate big blocks of\r\n * candidates for clusters.\r\n * ** The usual solution is to u value which is a dot product along some skew direction and have the blocks contain (u,x,y) or (u,x,y,z) for 2d versus 3d.\r\n * ** apply setupPrimaryClusterSort to prepare that!!!\r\n * * After a simple lexical sort, consecutive blocks that are within tolerance in the 0 component\r\n * are inspected. Within that candidate set, all blocks that are within tolerance for ALL components are clustered.\r\n * * In the output cluster array, clusters are terminated a invalid index. Test for the invalid index with GrowableBlockArray.isClusterTerminator (x)\r\n */\r\n public clusterIndicesLexical(clusterTolerance: number = Geometry.smallMetricDistance): Uint32Array {\r\n // install primary sort key\r\n this.setupPrimaryClusterSort();\r\n // presort by all coordinates ....\r\n const firstSort = this.sortIndicesLexical();\r\n const clusterIndices = new Uint32Array(2 * firstSort.length); // worst case: no duplicates, each index goes in followed by terminator.\r\n let m = 0; // number of cluster indices\r\n const n = this.numBlocks; // and this must match firstSort.length !!\r\n let clusterStartBlockIndex = 0;\r\n let candidateBlockIndex = 0;\r\n let barrierU = 0.0;\r\n let i = 0;\r\n let j = 0;\r\n\r\n const k0 = 1; // beginning of active column for distance\r\n const k1 = 1 + this._numCoordinatePerPoint;\r\n for (i = 0; i < n; i++) {\r\n clusterStartBlockIndex = firstSort[i];\r\n if (!ClusterableArray.isClusterTerminator(clusterStartBlockIndex)) {\r\n // unused block, so it becomes a cluster...\r\n clusterIndices[m++] = clusterStartBlockIndex;\r\n barrierU = this.component(clusterStartBlockIndex, 0) + clusterTolerance;\r\n firstSort[i] = ClusterableArray.clusterTerminator;\r\n for (j = i + 1; j < n; j++) {\r\n candidateBlockIndex = firstSort[j];\r\n if (candidateBlockIndex === ClusterableArray.clusterTerminator) continue; // nearby in sort direction but already in a cluster.\r\n if (this.component(candidateBlockIndex, 0) >= barrierU) break;\r\n if (this.distanceBetweenSubBlocks(clusterStartBlockIndex, candidateBlockIndex, k0, k1) < clusterTolerance) {\r\n clusterIndices[m++] = candidateBlockIndex; // The candidate is in the block\r\n firstSort[j] = ClusterableArray.clusterTerminator; // and it will not be reused as future block base\r\n }\r\n }\r\n clusterIndices[m++] = ClusterableArray.clusterTerminator;\r\n }\r\n }\r\n // Alas, the clusterIndices array has fluff at the end. So it has to be copied.\r\n return clusterIndices.slice(0, m);\r\n }\r\n /** setup (overwrite!!) the \"0\" component with the dot product of numClusterCoordinate later components with a non-axis aligned vector.\r\n * This is normally called before clusterIndicesLexical.\r\n */\r\n public setupPrimaryClusterSort() {\r\n const nb = this.numBlocks;\r\n const nc = this._numCoordinatePerPoint;\r\n const vector = new Float64Array(nc);\r\n vector[0] = 1.0;\r\n for (let c = 1; c < nc; c++) vector[c] = vector[c - 1] * ClusterableArray._vectorFactor;\r\n let k = 0;\r\n let dot = 0.0;\r\n const data = this._data;\r\n for (let b = 0; b < nb; b++) {\r\n k = this.blockIndexToDoubleIndex(b);\r\n dot = 0.0;\r\n for (let c = 0; c < nc; c++) { dot += vector[c] * data[k + 1 + c]; }\r\n data[k] = dot;\r\n }\r\n }\r\n /** Convert the cluster data to an array of tuples with point i in the form\r\n * `[i, primarySortCoordinate, [x,y,..], [extraData0, extraData1, ...]]`\r\n */\r\n public toJSON(): any[] {\r\n const result: any[] = [];\r\n for (let b = 0; b < this.numBlocks; b++) {\r\n let i = this.blockIndexToDoubleIndex(b);\r\n const chunk: any[] = [b, this._data[i++]];\r\n const coordinates = [];\r\n for (let c = 0; c < this._numCoordinatePerPoint; c++)coordinates.push(this._data[i++]);\r\n chunk.push(coordinates);\r\n for (let c = 0; c < this._numExtraDataPerPoint; c++)\r\n chunk.push(this._data[i++]);\r\n result.push(chunk);\r\n }\r\n return result;\r\n }\r\n /**\r\n * Return an array of indices from block index to cluster index.\r\n * @param clusteredBlocks clusters of block indices followed by separators.\r\n */\r\n public createIndexBlockToClusterIndex(clusteredBlocks: Uint32Array): Uint32Array {\r\n const numBlocks = this.numBlocks;\r\n const blockToCluster = new Uint32Array(numBlocks);\r\n blockToCluster.fill(ClusterableArray.clusterTerminator);\r\n let numCluster = 0;\r\n for (const b of clusteredBlocks) {\r\n if (b >= numBlocks) {\r\n numCluster++;\r\n } else {\r\n blockToCluster[b] = numCluster;\r\n }\r\n }\r\n return blockToCluster;\r\n }\r\n /**\r\n * Return an array of indices from block index to index of its cluster's start in the cluster index array.\r\n * @param clusteredBlocks clusters of block indices followed by separators.\r\n */\r\n public createIndexBlockToClusterStart(clusteredBlocks: Uint32Array): Uint32Array {\r\n const n = clusteredBlocks.length;\r\n const numBlocks = this.numBlocks;\r\n const blockToClusterStart = new Uint32Array(numBlocks);\r\n const terminator = ClusterableArray.clusterTerminator;\r\n blockToClusterStart.fill(terminator);\r\n let clusterStart = 0;\r\n for (let i = 0; i < n; i++) {\r\n const k = clusteredBlocks[i];\r\n if (k > numBlocks) {\r\n clusterStart = i + 1;\r\n } else {\r\n blockToClusterStart[k] = clusterStart;\r\n }\r\n }\r\n return blockToClusterStart;\r\n }\r\n /** count the clusters in the clusteredBlocks array. */\r\n public countClusters(clusteredBlocks: Uint32Array): number {\r\n let numClusters = 0;\r\n const terminator = ClusterableArray.clusterTerminator;\r\n for (const b of clusteredBlocks) {\r\n if (b === terminator)\r\n numClusters++;\r\n }\r\n return numClusters;\r\n }\r\n /** create a reverse index: given a cluster index k, clusterToClusterStart[k] is the place\r\n * the cluster's block indices appear in clusterBlocks\r\n */\r\n public createIndexClusterToClusterStart(clusteredBlocks: Uint32Array): Uint32Array {\r\n let numCluster = this.countClusters(clusteredBlocks);\r\n const clusterToClusterStart = new Uint32Array(numCluster);\r\n const terminator = ClusterableArray.clusterTerminator;\r\n clusterToClusterStart.fill(terminator);\r\n const n = clusteredBlocks.length;\r\n let clusterStart = 0;\r\n for (let i = 0; i < n; i++) {\r\n const k = clusteredBlocks[i];\r\n if (k === terminator) {\r\n clusterStart = i + 1;\r\n } else if (i === clusterStart) {\r\n clusterToClusterStart[numCluster++] = clusterStart;\r\n }\r\n }\r\n return clusterToClusterStart;\r\n }\r\n\r\n /**\r\n * Sort terminator-delimited subsets of an array of indices into the table, using a single extraData index as sort key.\r\n * @param blockedIndices [in] indices, organized as blocks of good indices terminated by the clusterTerminator.\r\n * @param extraDataIndex index of the extra data key.\r\n */\r\n public sortSubsetsBySingleKey(blockedIndices: Uint32Array, dataIndex: number) {\r\n const dataOffset = 1 + dataIndex;\r\n let kBegin = 0;\r\n let swap;\r\n let key0, key1;\r\n const numK = blockedIndices.length;\r\n for (let kEnd = 0; kEnd < numK; kEnd++) {\r\n if (blockedIndices[kEnd] === ClusterableArray.clusterTerminator) {\r\n // sort blockedIndices[kBegin ,= k < kEnd].\r\n // (search for minimum remaining, swap . . )\r\n for (let k0 = kBegin; k0 + 1 < kEnd; k0++) {\r\n key0 = this.getWithinBlock(blockedIndices[k0], dataOffset);\r\n for (let k1 = k0 + 1; k1 < kEnd; k1++) {\r\n key1 = this.getWithinBlock(blockedIndices[k1], dataOffset);\r\n if (key1 < key0) {\r\n swap = blockedIndices[k0];\r\n blockedIndices[k0] = blockedIndices[k1];\r\n blockedIndices[k1] = swap;\r\n key0 = key1;\r\n }\r\n }\r\n }\r\n kBegin = kEnd + 1;\r\n }\r\n }\r\n }\r\n /**\r\n * Returns packed points with indices mapping old to new.\r\n * @param data points to cluster.\r\n */\r\n public static clusterPoint3dArray(data: Point3d[], tolerance: number = Geometry.smallMetricDistance):\r\n PackedPointsWithIndex {\r\n const clusterArray = new ClusterableArray(3, 0, data.length);\r\n data.forEach((p: Point3d) => {\r\n clusterArray.addDirect(p.x, p.y, p.z);\r\n });\r\n const order = clusterArray.clusterIndicesLexical(tolerance);\r\n const result = new PackedPointsWithIndex(data.length);\r\n let currentClusterIndex = 0;\r\n let numThisCluster = 0;\r\n order.forEach((k: number) => {\r\n if (ClusterableArray.isClusterTerminator(k)) {\r\n currentClusterIndex++;\r\n numThisCluster = 0;\r\n } else {\r\n if (numThisCluster === 0)\r\n result.packedPoints.push(data[k].clone());\r\n result.oldToNew[k] = currentClusterIndex;\r\n numThisCluster++;\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns number array with indices mapping old to new.\r\n * @param data numbers to cluster.\r\n */\r\n public static clusterNumberArray(data: number[], tolerance: number = Geometry.smallMetricDistance): PackedNumbersWithIndex {\r\n const clusterArray = new ClusterableArray(1, 0, data.length);\r\n data.forEach((x: number) => {clusterArray.addDirect(x);});\r\n const order = clusterArray.clusterIndicesLexical(tolerance);\r\n const result = new PackedNumbersWithIndex(data.length);\r\n let currentClusterIndex = 0;\r\n let numThisCluster = 0;\r\n order.forEach((k: number) => {\r\n if (ClusterableArray.isClusterTerminator(k)) {\r\n currentClusterIndex++;\r\n numThisCluster = 0;\r\n } else {\r\n if (numThisCluster === 0)\r\n result.packedNumbers.push(data[k]);\r\n result.oldToNew[k] = currentClusterIndex;\r\n numThisCluster++;\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns packed points with indices mapping old to new.\r\n * @param data points to cluster.\r\n */\r\n public static clusterGrowablePoint2dArray(source: GrowableXYArray, tolerance: number = Geometry.smallMetricDistance): PackedPoint2dsWithIndex {\r\n const clusterArray = new ClusterableArray(2, 0, source.length);\r\n const p = Point2d.create();\r\n const numSourcePoint = source.length;\r\n for (let i = 0; i < numSourcePoint; i++) {\r\n source.getPoint2dAtUncheckedPointIndex(i, p);\r\n clusterArray.addDirect(p.x, p.y);\r\n }\r\n const order = clusterArray.clusterIndicesLexical(tolerance);\r\n const numPackedPoints = clusterArray.countClusters(order);\r\n const result = new PackedPoint2dsWithIndex(source.length, numPackedPoints);\r\n let currentClusterIndex = 0;\r\n let numThisCluster = 0;\r\n order.forEach((k: number) => {\r\n if (ClusterableArray.isClusterTerminator(k)) {\r\n currentClusterIndex++;\r\n numThisCluster = 0;\r\n } else {\r\n if (numThisCluster === 0) // This is the first encounter with a new cluster\r\n result.growablePackedPoints.pushFromGrowableXYArray(source, k);\r\n result.oldToNew[k] = currentClusterIndex;\r\n numThisCluster++;\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns packed points with indices mapping old to new.\r\n * @param data points to cluster.\r\n */\r\n public static clusterGrowablePoint3dArray(source: GrowableXYZArray, tolerance: number = Geometry.smallMetricDistance):\r\n PackedPointsWithIndex {\r\n const clusterArray = new ClusterableArray(3, 0, source.length);\r\n const p = Point3d.create();\r\n const numSourcePoint = source.length;\r\n for (let i = 0; i < numSourcePoint; i++) {\r\n source.getPoint3dAtUncheckedPointIndex(i, p);\r\n clusterArray.addDirect(p.x, p.y, p.z);\r\n }\r\n const order = clusterArray.clusterIndicesLexical(tolerance);\r\n const result = new PackedPointsWithIndex(source.length);\r\n const numPackedPoints = clusterArray.countClusters(order);\r\n result.growablePackedPoints = new GrowableXYZArray(numPackedPoints);\r\n let currentClusterIndex = 0;\r\n let numThisCluster = 0;\r\n order.forEach((k: number) => {\r\n if (ClusterableArray.isClusterTerminator(k)) {\r\n currentClusterIndex++;\r\n numThisCluster = 0;\r\n } else {\r\n if (numThisCluster === 0) // This is the first encounter with a new cluster\r\n result.growablePackedPoints!.pushFromGrowableXYZArray(source, k);\r\n result.oldToNew[k] = currentClusterIndex;\r\n numThisCluster++;\r\n }\r\n });\r\n return result;\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nfunction updateIndices(indices: number[], oldToNew: Uint32Array): boolean {\r\n let numErrors = 0;\r\n indices.forEach((value: number, i: number, data: number[]) => {\r\n if (value < oldToNew.length) {\r\n data[i] = oldToNew[value];\r\n } else numErrors++;\r\n });\r\n return numErrors === 0;\r\n}\r\n\r\n/**\r\n * Data carrier class for\r\n * * packedPoints = an array of Point3d\r\n * * oldToNew = array of indices from some prior Point3d[] to the packed points.\r\n * @internal\r\n */\r\nclass PackedPointsWithIndex {\r\n /** Array of Point3d */\r\n public packedPoints: Point3d[];\r\n /** array of coordinates packed in GrowableXYZArray */\r\n public growablePackedPoints: GrowableXYZArray | undefined;\r\n /** mapping from old point index to new point index. */\r\n public oldToNew: Uint32Array;\r\n /** integer value for unknown index. */\r\n public static readonly invalidIndex = 0xFFFFffff;\r\n\r\n /** construct a PackedPoints object with\r\n * * empty packedPoints array\r\n * * oldToNew indices all initialized to PackedPoints.invalidIndex\r\n */\r\n constructor(numOldIndexEntry: number) {\r\n this.packedPoints = [];\r\n this.oldToNew = new Uint32Array(numOldIndexEntry);\r\n for (let i = 0; i < numOldIndexEntry; i++) {\r\n this.oldToNew[i] = PackedPointsWithIndex.invalidIndex;\r\n }\r\n }\r\n /**\r\n * Use the oldToNew array to update an array of \"old\" indices.\r\n * @param indices array of indices into prepacked array.\r\n * @returns true if all input indices were valid for the oldToNew array.\r\n */\r\n public updateIndices(indices: number[]): boolean {\r\n return updateIndices(indices, this.oldToNew);\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nclass PackedPoint2dsWithIndex {\r\n /** array of coordinates packed in GrowableXYArray */\r\n public growablePackedPoints: GrowableXYArray;\r\n /** mapping from old point index to new point index. */\r\n public oldToNew: Uint32Array;\r\n /** integer value for unknown index. */\r\n public static readonly invalidIndex = 0xFFFFffff;\r\n\r\n /** construct a PackedPoints object with\r\n * * empty packedPoints array\r\n * * oldToNew indices all initialized to PackedPoints.invalidIndex\r\n */\r\n constructor(numOldIndexEntry: number, numPackedPoints: number) {\r\n this.growablePackedPoints = new GrowableXYArray(numPackedPoints);\r\n this.oldToNew = new Uint32Array(numOldIndexEntry);\r\n for (let i = 0; i < numOldIndexEntry; i++) {\r\n this.oldToNew[i] = PackedPoint2dsWithIndex.invalidIndex;\r\n }\r\n }\r\n /**\r\n * Use the oldToNew array to update an array of \"old\" indices.\r\n * @param indices array of indices into prepacked array.\r\n * @returns true if all input indices were valid for the oldToNew array.\r\n */\r\n public updateIndices(indices: number[]): boolean {\r\n return updateIndices(indices, this.oldToNew);\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\n class PackedNumbersWithIndex {\r\n /** Array of numbers */\r\n public packedNumbers: number[];\r\n /** mapping from old point index to new point index. */\r\n public oldToNew: Uint32Array;\r\n /** integer value for unknown index. */\r\n public static readonly invalidIndex = 0xFFFFffff;\r\n\r\n /** construct a PackedNumbers object with\r\n * * empty packedNumbers array\r\n * * oldToNew indices all initialized to PackedNumbers.invalidIndex\r\n */\r\n constructor(numOldIndexEntry: number) {\r\n this.packedNumbers = [];\r\n this.oldToNew = new Uint32Array(numOldIndexEntry);\r\n for (let i = 0; i < numOldIndexEntry; i++) {\r\n this.oldToNew[i] = PackedPointsWithIndex.invalidIndex;\r\n }\r\n }\r\n /**\r\n * Use the oldToNew array to update an array of \"old\" indices.\r\n * @param indices array of indices into prepacked array.\r\n * @returns true if all input indices were valid for the oldToNew array.\r\n */\r\n public updateIndices(indices: number[]): boolean {\r\n return updateIndices(indices, this.oldToNew);\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"IndexedEdgeMatcher.d.ts","sourceRoot":"","sources":["../../../src/polyface/IndexedEdgeMatcher.ts"],"names":[],"mappings":"AAKA;;GAEG;AAKH;;;;;;GAMG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAC5C,uEAAuE;IACvE,IAAW,YAAY,IAAI,MAAM,CAAoB;IACrD,wEAAwE;IACxE,IAAW,YAAY,IAAI,MAAM,CAAoB;IACrD,+BAA+B;IAC/B,IAAW,UAAU,IAAI,MAAM,CAAoB;IACnD,4DAA4D;IAC5D,IAAW,SAAS,IAAI,OAAO,CAA8B;IAC7D,uDAAuD;IACvD,IAAW,cAAc,IAAI,MAAM,CAAkD;IACrF,wDAAwD;IACxD,IAAW,eAAe,IAAI,MAAM,CAAkD;IACtF,gGAAgG;WAClF,mBAAmB,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO;IACpF,6GAA6G;WAC/F,qBAAqB,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO;IAGtF;;;;OAIG;WACW,mBAAmB,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,GAAG,MAAM;IAMnF,IAAW,UAAU,IAAI,OAAO,CAAgC;IAChE;;;;;;OAMG;WACW,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,GAAG,MAAM;gBAiBrD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAMhE,MAAM,IAAI,GAAG;WACN,aAAa,CAAC,IAAI,EAAE,mBAAmB,GAAG,GAAG;WAO7C,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,EAAE;CAM7D;AAED,oBAAY,mBAAmB,GAAG,YAAY,GAAG,YAAY,EAAE,CAAC;AAChE;;GAEG;AACH,qBAAa,kBAAkB;IACtB,KAAK,EAAE,YAAY,EAAE,CAAC;;IAK7B;;;;;;OAMG;IACI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY;IAKlF;;;;OAIG;IACI,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,GAAE,OAAc;IASnF,iCAAiC;IAC1B,IAAI;IAGX,+DAA+D;IAC/D,OAAO,CAAC,0BAA0B;IAalC;;;;;;;;;;;OAWG;IACI,sBAAsB,CAAC,aAAa,EAAE,mBAAmB,EAAE,GAAG,SAAS,EAAE,UAAU,EAAE,mBAAmB,EAAE,GAAG,SAAS,EAAE,SAAS,EAAE,mBAAmB,EAAE,GAAG,SAAS,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,GAAG,SAAS;CAyBjO"}
1
+ {"version":3,"file":"IndexedEdgeMatcher.d.ts","sourceRoot":"","sources":["../../../src/polyface/IndexedEdgeMatcher.ts"],"names":[],"mappings":"AAKA;;GAEG;AAEH;;;;;;GAMG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAC5C,uEAAuE;IACvE,IAAW,YAAY,IAAI,MAAM,CAAoB;IACrD,wEAAwE;IACxE,IAAW,YAAY,IAAI,MAAM,CAAoB;IACrD,+BAA+B;IAC/B,IAAW,UAAU,IAAI,MAAM,CAAoB;IACnD,4DAA4D;IAC5D,IAAW,SAAS,IAAI,OAAO,CAA8B;IAC7D,uDAAuD;IACvD,IAAW,cAAc,IAAI,MAAM,CAAkD;IACrF,wDAAwD;IACxD,IAAW,eAAe,IAAI,MAAM,CAAkD;IACtF,gGAAgG;WAClF,mBAAmB,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO;IACpF,6GAA6G;WAC/F,qBAAqB,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO;IAGtF;;;;OAIG;WACW,mBAAmB,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,GAAG,MAAM;IAMnF,IAAW,UAAU,IAAI,OAAO,CAAgC;IAChE;;;;;;OAMG;WACW,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,GAAG,MAAM;gBAiBrD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAMhE,MAAM,IAAI,GAAG;WACN,aAAa,CAAC,IAAI,EAAE,mBAAmB,GAAG,GAAG;WAO7C,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,EAAE;CAM7D;AAED,oBAAY,mBAAmB,GAAG,YAAY,GAAG,YAAY,EAAE,CAAC;AAChE;;GAEG;AACH,qBAAa,kBAAkB;IACtB,KAAK,EAAE,YAAY,EAAE,CAAC;;IAK7B;;;;;;OAMG;IACI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY;IAKlF;;;;OAIG;IACI,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,GAAE,OAAc;IASnF,iCAAiC;IAC1B,IAAI;IAGX,+DAA+D;IAC/D,OAAO,CAAC,0BAA0B;IAalC;;;;;;;;;;;OAWG;IACI,sBAAsB,CAAC,aAAa,EAAE,mBAAmB,EAAE,GAAG,SAAS,EAAE,UAAU,EAAE,mBAAmB,EAAE,GAAG,SAAS,EAAE,SAAS,EAAE,mBAAmB,EAAE,GAAG,SAAS,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,GAAG,SAAS;CAyBjO"}
@@ -5,9 +5,6 @@
5
5
  /** @packageDocumentation
6
6
  * @module Polyface
7
7
  */
8
- // For boundary sorting, an edge exists as a (packed!) Float64Array.
9
- // Fixed entries are:
10
- // 0:
11
8
  /**
12
9
  * * For boundary sorting, an edge is a (packed!) Float64Array.
13
10
  * * Fixed entry positions are:
@@ -1 +1 @@
1
- {"version":3,"file":"IndexedEdgeMatcher.js","sourceRoot":"","sources":["../../../src/polyface/IndexedEdgeMatcher.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 Polyface\r\n */\r\n\r\n// For boundary sorting, an edge exists as a (packed!) Float64Array.\r\n// Fixed entries are:\r\n// 0:\r\n/**\r\n * * For boundary sorting, an edge is a (packed!) Float64Array.\r\n * * Fixed entry positions are:\r\n * * [0] is start vertex index (in CCW order around its facet)\r\n * * [1] is end vertex index (in CCW order around its facet)\r\n * * [2] is facet index.\r\n */\r\nexport class SortableEdge extends Float64Array {\r\n /** Return the vertex index that appears first in the order stored. */\r\n public get vertexIndexA(): number { return this[0]; }\r\n /** Return the vertex index that appears second in the order stored. */\r\n public get vertexIndexB(): number { return this[1]; }\r\n /** Return the facet index. */\r\n public get facetIndex(): number { return this[2]; }\r\n /** return true if vertexIndexA is less than vertexIndexB */\r\n public get isLowHigh(): boolean { return this[0] < this[1]; }\r\n /** Return the vertex index with lower numeric value */\r\n public get lowVertexIndex(): number { return this[0] < this[1] ? this[0] : this[1]; }\r\n /** Return the vertex index with higher numeric value */\r\n public get highVertexIndex(): number { return this[0] > this[1] ? this[0] : this[1]; }\r\n /** Return true if the vertices edgeA and edgeB are the same vertex indices in opposite order */\r\n public static areDirectedPartners(edgeA: SortableEdge, edgeB: SortableEdge): boolean { return edgeA[0] === edgeB[1] && edgeA[1] === edgeB[0]; }\r\n /** Return true if the vertices edgeA and edgeB are the same vertex indices with no consideration of order */\r\n public static areUndirectedPartners(edgeA: SortableEdge, edgeB: SortableEdge): boolean {\r\n return (edgeA[0] === edgeB[0] && edgeA[1] === edgeB[1]) || ((edgeA[0] === edgeB[1] && edgeA[1] === edgeB[0]));\r\n }\r\n /** Return numeric relationship of edgeA and edgeB:\r\n * * 1 if they share start and end in the same order\r\n * * -1 if they share start and end in reversed order\r\n * * 0 otherwise.\r\n */\r\n public static relativeOrientation(edgeA: SortableEdge, edgeB: SortableEdge): number {\r\n if (edgeA[0] === edgeB[0] && edgeA[1] === edgeB[1]) return 1;\r\n if (edgeA[0] === edgeB[1] && edgeA[1] === edgeB[0]) return -1;\r\n return 0;\r\n }\r\n\r\n public get isNullEdge(): boolean { return this[0] === this[1]; }\r\n /**\r\n * lexical comparison of two edges.\r\n * * If the edges have the same vertex pair (in same or opposite order) they will end up adjacent in a sort\r\n * * If the edges have 0 or 1 shared vertex indices, the one with lowest low comes first.\r\n * @param edgeA first edge\r\n * @param edgeB second edge\r\n */\r\n public static lessThan(edgeA: SortableEdge, edgeB: SortableEdge): number {\r\n // primary compare is based on indirect indices\r\n const lowA = edgeA.lowVertexIndex;\r\n const lowB = edgeB.lowVertexIndex;\r\n if (lowA < lowB)\r\n return -1;\r\n if (lowB < lowA)\r\n return 1;\r\n const highA = edgeA.highVertexIndex;\r\n const highB = edgeB.highVertexIndex;\r\n if (highA < highB)\r\n return -1;\r\n if (highB < highA)\r\n return 1;\r\n // undirected indices match ... use directed vertexIndexA\r\n return edgeA.vertexIndexA - edgeB.vertexIndexA;\r\n }\r\n public constructor(vertexA: number, vertexB: number, facetIndex: number) {\r\n super(3);\r\n this[0] = vertexA;\r\n this[1] = vertexB;\r\n this[2] = facetIndex;\r\n }\r\n public toJSON(): any { return [this[0], this[1], this[2]]; }\r\n public static clusterToJSON(data: SortableEdgeCluster): any {\r\n if (data instanceof SortableEdge)\r\n return data.toJSON();\r\n\r\n const result = [];\r\n for (const edge of data) result.push(edge.toJSON());\r\n }\r\n public static clusterArrayToJSON(data: SortableEdgeCluster[]) {\r\n const result = [];\r\n for (const cluster of data)\r\n result.push(SortableEdge.clusterToJSON(cluster));\r\n return result;\r\n }\r\n}\r\n\r\nexport type SortableEdgeCluster = SortableEdge | SortableEdge[];\r\n/**\r\n * An IndexedEdgeMatcher carries an array (`edges`) of edges start & end indices for sorting and subsequent analyses (such as testing for closed mesh)\r\n */\r\nexport class IndexedEdgeMatcher {\r\n public edges: SortableEdge[];\r\n\r\n constructor() {\r\n this.edges = [];\r\n }\r\n /**\r\n * push a new edge.\r\n * @returns the edge (as emplaced at the back of the sortableEdge array)\r\n * @param vertexA start vertex\r\n * @param vertexB end vertex\r\n * @param facetIndex facet index\r\n */\r\n public addEdge(vertexA: number, vertexB: number, facetIndex: number): SortableEdge {\r\n const edge = new SortableEdge(vertexA, vertexB, facetIndex);\r\n this.edges.push(edge);\r\n return edge;\r\n }\r\n /**\r\n * Push edges all around a facet, returning to vertexArray[0]\r\n * @param vertexArray array of vertex indices around facet\r\n * @param facetIndex\r\n */\r\n public addPath(vertexArray: number[], facetIndex: number, closeLoop: boolean = true) {\r\n if (vertexArray.length === 0) return;\r\n const m = vertexArray.length - 1;\r\n for (let i = 0; i < m; i++) {\r\n this.addEdge(vertexArray[i], vertexArray[i + 1], facetIndex);\r\n }\r\n if (closeLoop)\r\n this.addEdge(vertexArray[m], vertexArray[0], facetIndex);\r\n }\r\n /** Sort the edge index array. */\r\n public sort() {\r\n this.edges.sort(SortableEdge.lessThan);\r\n }\r\n /** Create a single or compound SortableEdgeCluster in dest. */\r\n private collectSortableEdgeCluster(index0: number, index1: number, dest: SortableEdgeCluster[] | undefined) {\r\n if (dest !== undefined && index1 > index0) {\r\n if (index1 === index0 + 1) {\r\n dest.push(this.edges[index0]);\r\n } else {\r\n const cluster = [];\r\n for (let i = index0; i < index1; i++)\r\n cluster.push(this.edges[i]);\r\n dest.push(cluster);\r\n }\r\n\r\n }\r\n }\r\n /**\r\n * sort the edges, and look for three categories of paired edges:\r\n * * caller must allocate all result arrays of interest.\r\n * * Any combination of the result arrays may be `undefined`, indicating that category is to be ignored.\r\n * * Any combination of the result arrays may be aliased as the same target, in which case those to categories are merged into the target.\r\n * * For instance, to ignore manifold pairs and collect all others (singleton and other) as a single array `allOther`, create `const allOther = []` as an empty array and call\r\n * `sortAndCollectClusters (undefined, allOther, allOther);`\r\n * @param manifoldPairs optional array to receive pairs of properly mated SortableEdgePairs, i.e. simple interior edges adjacent to two facets in opposing directions.\r\n * @param singletons optional array to receive edges that are simple boundary edges.\r\n * @param nullEdges clusters with null edges (same start and end vertex)\r\n * @param allOtherClusters optional array to receive arrays in which all the edges are partners in an undirected sense but not a simple directed pair.\r\n */\r\n public sortAndCollectClusters(manifoldPairs: SortableEdgeCluster[] | undefined, singletons: SortableEdgeCluster[] | undefined, nullEdges: SortableEdgeCluster[] | undefined, allOtherClusters: SortableEdgeCluster[] | undefined) {\r\n this.sort();\r\n if (manifoldPairs) manifoldPairs.length = 0;\r\n if (singletons) singletons.length = 0;\r\n if (nullEdges) nullEdges.length = 0;\r\n if (allOtherClusters) allOtherClusters.length = 0;\r\n const n = this.edges.length;\r\n let clusterLength;\r\n for (let index0 = 0; index0 < n; index0 += clusterLength) {\r\n const baseEdge = this.edges[index0];\r\n clusterLength = 1;\r\n for (let index1 = index0 + 1; index1 < n && SortableEdge.areUndirectedPartners(baseEdge, this.edges[index1]); index1++) {\r\n clusterLength++;\r\n }\r\n if (this.edges[index0].isNullEdge) {\r\n this.collectSortableEdgeCluster(index0, index0 + clusterLength, nullEdges);\r\n } else if (clusterLength === 2 && SortableEdge.areDirectedPartners(baseEdge, this.edges[index0 + 1])) {\r\n this.collectSortableEdgeCluster(index0, index0 + clusterLength, manifoldPairs);\r\n } else if (clusterLength === 1) {\r\n this.collectSortableEdgeCluster(index0, index0 + 1, singletons);\r\n } else {\r\n this.collectSortableEdgeCluster(index0, index0 + clusterLength, allOtherClusters);\r\n }\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"IndexedEdgeMatcher.js","sourceRoot":"","sources":["../../../src/polyface/IndexedEdgeMatcher.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 Polyface\r\n */\r\n\r\n/**\r\n * * For boundary sorting, an edge is a (packed!) Float64Array.\r\n * * Fixed entry positions are:\r\n * * [0] is start vertex index (in CCW order around its facet)\r\n * * [1] is end vertex index (in CCW order around its facet)\r\n * * [2] is facet index.\r\n */\r\nexport class SortableEdge extends Float64Array {\r\n /** Return the vertex index that appears first in the order stored. */\r\n public get vertexIndexA(): number { return this[0]; }\r\n /** Return the vertex index that appears second in the order stored. */\r\n public get vertexIndexB(): number { return this[1]; }\r\n /** Return the facet index. */\r\n public get facetIndex(): number { return this[2]; }\r\n /** return true if vertexIndexA is less than vertexIndexB */\r\n public get isLowHigh(): boolean { return this[0] < this[1]; }\r\n /** Return the vertex index with lower numeric value */\r\n public get lowVertexIndex(): number { return this[0] < this[1] ? this[0] : this[1]; }\r\n /** Return the vertex index with higher numeric value */\r\n public get highVertexIndex(): number { return this[0] > this[1] ? this[0] : this[1]; }\r\n /** Return true if the vertices edgeA and edgeB are the same vertex indices in opposite order */\r\n public static areDirectedPartners(edgeA: SortableEdge, edgeB: SortableEdge): boolean { return edgeA[0] === edgeB[1] && edgeA[1] === edgeB[0]; }\r\n /** Return true if the vertices edgeA and edgeB are the same vertex indices with no consideration of order */\r\n public static areUndirectedPartners(edgeA: SortableEdge, edgeB: SortableEdge): boolean {\r\n return (edgeA[0] === edgeB[0] && edgeA[1] === edgeB[1]) || ((edgeA[0] === edgeB[1] && edgeA[1] === edgeB[0]));\r\n }\r\n /** Return numeric relationship of edgeA and edgeB:\r\n * * 1 if they share start and end in the same order\r\n * * -1 if they share start and end in reversed order\r\n * * 0 otherwise.\r\n */\r\n public static relativeOrientation(edgeA: SortableEdge, edgeB: SortableEdge): number {\r\n if (edgeA[0] === edgeB[0] && edgeA[1] === edgeB[1]) return 1;\r\n if (edgeA[0] === edgeB[1] && edgeA[1] === edgeB[0]) return -1;\r\n return 0;\r\n }\r\n\r\n public get isNullEdge(): boolean { return this[0] === this[1]; }\r\n /**\r\n * lexical comparison of two edges.\r\n * * If the edges have the same vertex pair (in same or opposite order) they will end up adjacent in a sort\r\n * * If the edges have 0 or 1 shared vertex indices, the one with lowest low comes first.\r\n * @param edgeA first edge\r\n * @param edgeB second edge\r\n */\r\n public static lessThan(edgeA: SortableEdge, edgeB: SortableEdge): number {\r\n // primary compare is based on indirect indices\r\n const lowA = edgeA.lowVertexIndex;\r\n const lowB = edgeB.lowVertexIndex;\r\n if (lowA < lowB)\r\n return -1;\r\n if (lowB < lowA)\r\n return 1;\r\n const highA = edgeA.highVertexIndex;\r\n const highB = edgeB.highVertexIndex;\r\n if (highA < highB)\r\n return -1;\r\n if (highB < highA)\r\n return 1;\r\n // undirected indices match ... use directed vertexIndexA\r\n return edgeA.vertexIndexA - edgeB.vertexIndexA;\r\n }\r\n public constructor(vertexA: number, vertexB: number, facetIndex: number) {\r\n super(3);\r\n this[0] = vertexA;\r\n this[1] = vertexB;\r\n this[2] = facetIndex;\r\n }\r\n public toJSON(): any { return [this[0], this[1], this[2]]; }\r\n public static clusterToJSON(data: SortableEdgeCluster): any {\r\n if (data instanceof SortableEdge)\r\n return data.toJSON();\r\n\r\n const result = [];\r\n for (const edge of data) result.push(edge.toJSON());\r\n }\r\n public static clusterArrayToJSON(data: SortableEdgeCluster[]) {\r\n const result = [];\r\n for (const cluster of data)\r\n result.push(SortableEdge.clusterToJSON(cluster));\r\n return result;\r\n }\r\n}\r\n\r\nexport type SortableEdgeCluster = SortableEdge | SortableEdge[];\r\n/**\r\n * An IndexedEdgeMatcher carries an array (`edges`) of edges start & end indices for sorting and subsequent analyses (such as testing for closed mesh)\r\n */\r\nexport class IndexedEdgeMatcher {\r\n public edges: SortableEdge[];\r\n\r\n constructor() {\r\n this.edges = [];\r\n }\r\n /**\r\n * push a new edge.\r\n * @returns the edge (as emplaced at the back of the sortableEdge array)\r\n * @param vertexA start vertex\r\n * @param vertexB end vertex\r\n * @param facetIndex facet index\r\n */\r\n public addEdge(vertexA: number, vertexB: number, facetIndex: number): SortableEdge {\r\n const edge = new SortableEdge(vertexA, vertexB, facetIndex);\r\n this.edges.push(edge);\r\n return edge;\r\n }\r\n /**\r\n * Push edges all around a facet, returning to vertexArray[0]\r\n * @param vertexArray array of vertex indices around facet\r\n * @param facetIndex\r\n */\r\n public addPath(vertexArray: number[], facetIndex: number, closeLoop: boolean = true) {\r\n if (vertexArray.length === 0) return;\r\n const m = vertexArray.length - 1;\r\n for (let i = 0; i < m; i++) {\r\n this.addEdge(vertexArray[i], vertexArray[i + 1], facetIndex);\r\n }\r\n if (closeLoop)\r\n this.addEdge(vertexArray[m], vertexArray[0], facetIndex);\r\n }\r\n /** Sort the edge index array. */\r\n public sort() {\r\n this.edges.sort(SortableEdge.lessThan);\r\n }\r\n /** Create a single or compound SortableEdgeCluster in dest. */\r\n private collectSortableEdgeCluster(index0: number, index1: number, dest: SortableEdgeCluster[] | undefined) {\r\n if (dest !== undefined && index1 > index0) {\r\n if (index1 === index0 + 1) {\r\n dest.push(this.edges[index0]);\r\n } else {\r\n const cluster = [];\r\n for (let i = index0; i < index1; i++)\r\n cluster.push(this.edges[i]);\r\n dest.push(cluster);\r\n }\r\n\r\n }\r\n }\r\n /**\r\n * sort the edges, and look for three categories of paired edges:\r\n * * caller must allocate all result arrays of interest.\r\n * * Any combination of the result arrays may be `undefined`, indicating that category is to be ignored.\r\n * * Any combination of the result arrays may be aliased as the same target, in which case those to categories are merged into the target.\r\n * * For instance, to ignore manifold pairs and collect all others (singleton and other) as a single array `allOther`, create `const allOther = []` as an empty array and call\r\n * `sortAndCollectClusters (undefined, allOther, allOther);`\r\n * @param manifoldPairs optional array to receive pairs of properly mated SortableEdgePairs, i.e. simple interior edges adjacent to two facets in opposing directions.\r\n * @param singletons optional array to receive edges that are simple boundary edges.\r\n * @param nullEdges clusters with null edges (same start and end vertex)\r\n * @param allOtherClusters optional array to receive arrays in which all the edges are partners in an undirected sense but not a simple directed pair.\r\n */\r\n public sortAndCollectClusters(manifoldPairs: SortableEdgeCluster[] | undefined, singletons: SortableEdgeCluster[] | undefined, nullEdges: SortableEdgeCluster[] | undefined, allOtherClusters: SortableEdgeCluster[] | undefined) {\r\n this.sort();\r\n if (manifoldPairs) manifoldPairs.length = 0;\r\n if (singletons) singletons.length = 0;\r\n if (nullEdges) nullEdges.length = 0;\r\n if (allOtherClusters) allOtherClusters.length = 0;\r\n const n = this.edges.length;\r\n let clusterLength;\r\n for (let index0 = 0; index0 < n; index0 += clusterLength) {\r\n const baseEdge = this.edges[index0];\r\n clusterLength = 1;\r\n for (let index1 = index0 + 1; index1 < n && SortableEdge.areUndirectedPartners(baseEdge, this.edges[index1]); index1++) {\r\n clusterLength++;\r\n }\r\n if (this.edges[index0].isNullEdge) {\r\n this.collectSortableEdgeCluster(index0, index0 + clusterLength, nullEdges);\r\n } else if (clusterLength === 2 && SortableEdge.areDirectedPartners(baseEdge, this.edges[index0 + 1])) {\r\n this.collectSortableEdgeCluster(index0, index0 + clusterLength, manifoldPairs);\r\n } else if (clusterLength === 1) {\r\n this.collectSortableEdgeCluster(index0, index0 + 1, singletons);\r\n } else {\r\n this.collectSortableEdgeCluster(index0, index0 + clusterLength, allOtherClusters);\r\n }\r\n }\r\n }\r\n}\r\n"]}
@@ -201,7 +201,7 @@ export class IndexedPolyfaceSubsetVisitor extends IndexedPolyfaceVisitor {
201
201
  * * The activeFacetIndices array indicates all facets to be visited.
202
202
  */
203
203
  static createSubsetVisitor(polyface, activeFacetIndices, numWrap) {
204
- return new IndexedPolyfaceSubsetVisitor(polyface, activeFacetIndices.slice(), numWrap);
204
+ return new IndexedPolyfaceSubsetVisitor(polyface, activeFacetIndices, numWrap);
205
205
  }
206
206
  /** Advance the iterator to a particular facet in the client polyface */
207
207
  moveToReadIndex(activeIndex) {