@itwin/core-geometry 3.6.0-dev.8 → 4.0.0-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -1
- package/LICENSE.md +1 -1
- package/lib/cjs/Geometry.d.ts +25 -14
- package/lib/cjs/Geometry.d.ts.map +1 -1
- package/lib/cjs/Geometry.js +25 -14
- package/lib/cjs/Geometry.js.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts +10 -6
- package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js +10 -19
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/cjs/geometry3d/Angle.d.ts +1 -0
- package/lib/cjs/geometry3d/Angle.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Angle.js +1 -0
- package/lib/cjs/geometry3d/Angle.js.map +1 -1
- package/lib/cjs/geometry3d/AngleSweep.d.ts +1 -0
- package/lib/cjs/geometry3d/AngleSweep.d.ts.map +1 -1
- package/lib/cjs/geometry3d/AngleSweep.js +1 -0
- package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.d.ts +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.js +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.d.ts +221 -159
- package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.js +365 -249
- package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
- package/lib/cjs/geometry3d/OrderedRotationAngles.d.ts +71 -14
- package/lib/cjs/geometry3d/OrderedRotationAngles.d.ts.map +1 -1
- package/lib/cjs/geometry3d/OrderedRotationAngles.js +204 -114
- package/lib/cjs/geometry3d/OrderedRotationAngles.js.map +1 -1
- package/lib/cjs/geometry3d/Point2dVector2d.d.ts +1 -0
- package/lib/cjs/geometry3d/Point2dVector2d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Point2dVector2d.js +1 -0
- package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.d.ts +4 -3
- package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.js +6 -5
- package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/cjs/geometry3d/YawPitchRollAngles.d.ts +49 -25
- package/lib/cjs/geometry3d/YawPitchRollAngles.d.ts.map +1 -1
- package/lib/cjs/geometry3d/YawPitchRollAngles.js +146 -50
- package/lib/cjs/geometry3d/YawPitchRollAngles.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.d.ts +4 -4
- package/lib/cjs/polyface/PolyfaceBuilder.js +4 -4
- package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.d.ts +28 -0
- package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.js +79 -0
- package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/cjs/serialization/IModelJsonSchema.d.ts +1 -1
- package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
- package/lib/esm/Geometry.d.ts +25 -14
- package/lib/esm/Geometry.d.ts.map +1 -1
- package/lib/esm/Geometry.js +25 -14
- package/lib/esm/Geometry.js.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts +10 -6
- package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.js +10 -19
- package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/esm/geometry3d/Angle.d.ts +1 -0
- package/lib/esm/geometry3d/Angle.d.ts.map +1 -1
- package/lib/esm/geometry3d/Angle.js +1 -0
- package/lib/esm/geometry3d/Angle.js.map +1 -1
- package/lib/esm/geometry3d/AngleSweep.d.ts +1 -0
- package/lib/esm/geometry3d/AngleSweep.d.ts.map +1 -1
- package/lib/esm/geometry3d/AngleSweep.js +1 -0
- package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.d.ts +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.js +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.d.ts +221 -159
- package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.js +365 -249
- package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
- package/lib/esm/geometry3d/OrderedRotationAngles.d.ts +71 -14
- package/lib/esm/geometry3d/OrderedRotationAngles.d.ts.map +1 -1
- package/lib/esm/geometry3d/OrderedRotationAngles.js +205 -115
- package/lib/esm/geometry3d/OrderedRotationAngles.js.map +1 -1
- package/lib/esm/geometry3d/Point2dVector2d.d.ts +1 -0
- package/lib/esm/geometry3d/Point2dVector2d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Point2dVector2d.js +1 -0
- package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.d.ts +4 -3
- package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.js +6 -5
- package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/esm/geometry3d/YawPitchRollAngles.d.ts +49 -25
- package/lib/esm/geometry3d/YawPitchRollAngles.d.ts.map +1 -1
- package/lib/esm/geometry3d/YawPitchRollAngles.js +146 -50
- package/lib/esm/geometry3d/YawPitchRollAngles.js.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.d.ts +4 -4
- package/lib/esm/polyface/PolyfaceBuilder.js +4 -4
- package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.d.ts +28 -0
- package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.js +79 -0
- package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/esm/serialization/IModelJsonSchema.d.ts +1 -1
- package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
- package/package.json +4 -4
|
@@ -97,6 +97,34 @@ export declare class PolyfaceQuery {
|
|
|
97
97
|
* * There is no test for closure. Use `PolyfaceQuery.isPolyfaceClosedByEdgePairing(polyface)` to test for closure.
|
|
98
98
|
*/
|
|
99
99
|
static computePrincipalVolumeMoments(source: Polyface): MomentData | undefined;
|
|
100
|
+
/**
|
|
101
|
+
* Test for convex volume by dihedral angle tests on all edges.
|
|
102
|
+
* * This tests if all dihedral angles are positive.
|
|
103
|
+
* * In a closed solid, this is a strong test for overall convexity.
|
|
104
|
+
* * With `ignoreBoundaries` true, this may be a useful test when all the facets are in a single edge-connected component, such as a pyramid with no underside.
|
|
105
|
+
* * It is not a correct test if there are multiple, disjoint components.
|
|
106
|
+
* * Take the above-mentioned pyramid with no underside.
|
|
107
|
+
* * Within the same mesh, have a second pyramid placed to the side, still facing upward.
|
|
108
|
+
* * The angles will pass the dihedral convexity test, but the composite thing surely is not convex.
|
|
109
|
+
* @param source mesh to examine
|
|
110
|
+
* @param ignoreBoundaries if true, ignore simple boundary edges, i.e. allow unclosed meshes.
|
|
111
|
+
* @returns true if the mesh is closed and has all dihedral angles (angle across edge) positive
|
|
112
|
+
*/
|
|
113
|
+
static isConvexByDihedralAngleCount(source: Polyface, ignoreBoundaries?: boolean): boolean;
|
|
114
|
+
/**
|
|
115
|
+
* Compute a number summarizing the dihedral angles in the mesh.
|
|
116
|
+
* @see [[isConvexByDihedralAngleCount]] for comments about ignoreBoundaries===true when there are multiple connected components.
|
|
117
|
+
* @param source mesh to examine
|
|
118
|
+
* @param ignoreBoundaries if true, ignore simple boundary edges, i.e. allow unclosed meshes.
|
|
119
|
+
* @returns a number summarizing the dihedral angles in the mesh.
|
|
120
|
+
* * Return 1 if all angles are positive or planar. The mesh is probably convex with outward normals.
|
|
121
|
+
* * Return -1 if all angles are negative or planar. The mesh is probably convex with inward normals.
|
|
122
|
+
* * Return 0 if
|
|
123
|
+
* * angles area mixed
|
|
124
|
+
* * any edge has other than 1 incident facet or more than 2 incident facets.
|
|
125
|
+
* * (but null edges are permitted -- These occur naturally at edges of quads at north or south pole)
|
|
126
|
+
*/
|
|
127
|
+
static dihedralAngleSummary(source: Polyface, ignoreBoundaries?: boolean): number;
|
|
100
128
|
/**
|
|
101
129
|
* Test if the facets in `source` occur in perfectly mated pairs, as is required for a closed manifold volume.
|
|
102
130
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PolyfaceQuery.d.ts","sourceRoot":"","sources":["../../../src/polyface/PolyfaceQuery.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAGxE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAGrC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAE5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,4BAA4B,EAAE,MAAM,4CAA4C,CAAC;AAC1F,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAGlE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAOtD,OAAO,EAAE,kBAAkB,EAAgB,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAK7F,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAExE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"PolyfaceQuery.d.ts","sourceRoot":"","sources":["../../../src/polyface/PolyfaceQuery.ts"],"names":[],"mappings":"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"}
|
|
@@ -236,6 +236,85 @@ export class PolyfaceQuery {
|
|
|
236
236
|
const inertiaProducts = PolyfaceQuery.sumFacetSecondVolumeMomentProducts(source, origin);
|
|
237
237
|
return MomentData.inertiaProductsToPrincipalAxes(origin, inertiaProducts);
|
|
238
238
|
}
|
|
239
|
+
/**
|
|
240
|
+
* Test for convex volume by dihedral angle tests on all edges.
|
|
241
|
+
* * This tests if all dihedral angles are positive.
|
|
242
|
+
* * In a closed solid, this is a strong test for overall convexity.
|
|
243
|
+
* * With `ignoreBoundaries` true, this may be a useful test when all the facets are in a single edge-connected component, such as a pyramid with no underside.
|
|
244
|
+
* * It is not a correct test if there are multiple, disjoint components.
|
|
245
|
+
* * Take the above-mentioned pyramid with no underside.
|
|
246
|
+
* * Within the same mesh, have a second pyramid placed to the side, still facing upward.
|
|
247
|
+
* * The angles will pass the dihedral convexity test, but the composite thing surely is not convex.
|
|
248
|
+
* @param source mesh to examine
|
|
249
|
+
* @param ignoreBoundaries if true, ignore simple boundary edges, i.e. allow unclosed meshes.
|
|
250
|
+
* @returns true if the mesh is closed and has all dihedral angles (angle across edge) positive
|
|
251
|
+
*/
|
|
252
|
+
static isConvexByDihedralAngleCount(source, ignoreBoundaries = false) {
|
|
253
|
+
return this.dihedralAngleSummary(source, ignoreBoundaries) > 0;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Compute a number summarizing the dihedral angles in the mesh.
|
|
257
|
+
* @see [[isConvexByDihedralAngleCount]] for comments about ignoreBoundaries===true when there are multiple connected components.
|
|
258
|
+
* @param source mesh to examine
|
|
259
|
+
* @param ignoreBoundaries if true, ignore simple boundary edges, i.e. allow unclosed meshes.
|
|
260
|
+
* @returns a number summarizing the dihedral angles in the mesh.
|
|
261
|
+
* * Return 1 if all angles are positive or planar. The mesh is probably convex with outward normals.
|
|
262
|
+
* * Return -1 if all angles are negative or planar. The mesh is probably convex with inward normals.
|
|
263
|
+
* * Return 0 if
|
|
264
|
+
* * angles area mixed
|
|
265
|
+
* * any edge has other than 1 incident facet or more than 2 incident facets.
|
|
266
|
+
* * (but null edges are permitted -- These occur naturally at edges of quads at north or south pole)
|
|
267
|
+
*/
|
|
268
|
+
static dihedralAngleSummary(source, ignoreBoundaries = false) {
|
|
269
|
+
const edges = new IndexedEdgeMatcher();
|
|
270
|
+
const visitor = source.createVisitor(1);
|
|
271
|
+
visitor.reset();
|
|
272
|
+
const centroidNormal = [];
|
|
273
|
+
let normalCounter = 0;
|
|
274
|
+
while (visitor.moveToNextFacet()) {
|
|
275
|
+
const numEdges = visitor.pointCount - 1;
|
|
276
|
+
const normal = PolygonOps.centroidAreaNormal(visitor.point);
|
|
277
|
+
if (normal === undefined)
|
|
278
|
+
return 0;
|
|
279
|
+
centroidNormal.push(normal);
|
|
280
|
+
for (let i = 0; i < numEdges; i++) {
|
|
281
|
+
edges.addEdge(visitor.clientPointIndex(i), visitor.clientPointIndex(i + 1), normalCounter);
|
|
282
|
+
}
|
|
283
|
+
normalCounter++;
|
|
284
|
+
}
|
|
285
|
+
const badClusters = [];
|
|
286
|
+
const manifoldClusters = [];
|
|
287
|
+
edges.sortAndCollectClusters(manifoldClusters, ignoreBoundaries ? undefined : badClusters, undefined, badClusters);
|
|
288
|
+
if (badClusters.length > 0)
|
|
289
|
+
return 0;
|
|
290
|
+
let numPositive = 0;
|
|
291
|
+
let numPlanar = 0;
|
|
292
|
+
let numNegative = 0;
|
|
293
|
+
const edgeVector = Vector3d.create();
|
|
294
|
+
for (const cluster of manifoldClusters) {
|
|
295
|
+
const sideA = cluster[0];
|
|
296
|
+
const sideB = cluster[1];
|
|
297
|
+
if (sideA instanceof SortableEdge
|
|
298
|
+
&& sideB instanceof SortableEdge
|
|
299
|
+
&& source.data.point.vectorIndexIndex(sideA.vertexIndexA, sideA.vertexIndexB, edgeVector)) {
|
|
300
|
+
const dihedralAngle = centroidNormal[sideA.facetIndex].direction.signedAngleTo(centroidNormal[sideB.facetIndex].direction, edgeVector);
|
|
301
|
+
if (dihedralAngle.isAlmostZero)
|
|
302
|
+
numPlanar++;
|
|
303
|
+
else if (dihedralAngle.radians > 0.0)
|
|
304
|
+
numPositive++;
|
|
305
|
+
else
|
|
306
|
+
numNegative++;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
if (numPositive > 0 && numNegative === 0)
|
|
310
|
+
return 1;
|
|
311
|
+
if (numNegative > 0 && numPositive === 0)
|
|
312
|
+
return -1;
|
|
313
|
+
// problem case: if all edges have zero dihedral angle, record it as convex.
|
|
314
|
+
if (numPlanar > 0 && numPositive === 0 && numNegative === 0)
|
|
315
|
+
return 1;
|
|
316
|
+
return 0;
|
|
317
|
+
}
|
|
239
318
|
/**
|
|
240
319
|
* Test if the facets in `source` occur in perfectly mated pairs, as is required for a closed manifold volume.
|
|
241
320
|
*/
|