@itwin/core-geometry 5.1.0-dev.20 → 5.1.0-dev.25
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/lib/cjs/bspline/BSplineCurve.d.ts.map +1 -1
- package/lib/cjs/bspline/BSplineCurve.js +7 -1
- package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
- package/lib/cjs/clipping/ClipUtils.d.ts.map +1 -1
- package/lib/cjs/clipping/ClipUtils.js +5 -3
- package/lib/cjs/clipping/ClipUtils.js.map +1 -1
- package/lib/cjs/curve/Arc3d.d.ts +1 -1
- package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
- package/lib/cjs/curve/Arc3d.js +1 -1
- package/lib/cjs/curve/Arc3d.js.map +1 -1
- package/lib/cjs/curve/CurveCollection.d.ts +31 -1
- package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
- package/lib/cjs/curve/CurveCollection.js +65 -0
- package/lib/cjs/curve/CurveCollection.js.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.d.ts +24 -24
- package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.js +24 -24
- package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.d.ts +2 -2
- package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
- package/lib/cjs/curve/Query/PlanarSubdivision.d.ts +9 -5
- package/lib/cjs/curve/Query/PlanarSubdivision.d.ts.map +1 -1
- package/lib/cjs/curve/Query/PlanarSubdivision.js +20 -9
- package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/cjs/curve/RegionMomentsXY.d.ts.map +1 -1
- package/lib/cjs/curve/RegionMomentsXY.js +14 -14
- package/lib/cjs/curve/RegionMomentsXY.js.map +1 -1
- package/lib/cjs/curve/RegionOps.d.ts +12 -0
- package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOps.js +23 -3
- package/lib/cjs/curve/RegionOps.js.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts +14 -13
- package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js +46 -29
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +41 -17
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/cjs/geometry3d/AngleSweep.d.ts +10 -6
- package/lib/cjs/geometry3d/AngleSweep.d.ts.map +1 -1
- package/lib/cjs/geometry3d/AngleSweep.js +17 -6
- package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.d.ts +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/cjs/geometry4d/Point4d.d.ts +3 -2
- package/lib/cjs/geometry4d/Point4d.d.ts.map +1 -1
- package/lib/cjs/geometry4d/Point4d.js +9 -2
- package/lib/cjs/geometry4d/Point4d.js.map +1 -1
- package/lib/cjs/numerics/BezierPolynomials.d.ts +2 -0
- package/lib/cjs/numerics/BezierPolynomials.d.ts.map +1 -1
- package/lib/cjs/numerics/BezierPolynomials.js +11 -0
- package/lib/cjs/numerics/BezierPolynomials.js.map +1 -1
- package/lib/cjs/numerics/SmallSystem.d.ts.map +1 -1
- package/lib/cjs/numerics/SmallSystem.js +3 -3
- package/lib/cjs/numerics/SmallSystem.js.map +1 -1
- package/lib/cjs/polyface/IndexedPolyfaceVisitor.js +1 -1
- package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts +1 -0
- package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSearch.js +1 -0
- package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/esm/bspline/BSplineCurve.d.ts.map +1 -1
- package/lib/esm/bspline/BSplineCurve.js +7 -1
- package/lib/esm/bspline/BSplineCurve.js.map +1 -1
- package/lib/esm/clipping/ClipUtils.d.ts.map +1 -1
- package/lib/esm/clipping/ClipUtils.js +5 -3
- package/lib/esm/clipping/ClipUtils.js.map +1 -1
- package/lib/esm/curve/Arc3d.d.ts +1 -1
- package/lib/esm/curve/Arc3d.d.ts.map +1 -1
- package/lib/esm/curve/Arc3d.js +1 -1
- package/lib/esm/curve/Arc3d.js.map +1 -1
- package/lib/esm/curve/CurveCollection.d.ts +31 -1
- package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
- package/lib/esm/curve/CurveCollection.js +65 -0
- package/lib/esm/curve/CurveCollection.js.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.d.ts +24 -24
- package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.js +24 -24
- package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
- package/lib/esm/curve/CurvePrimitive.d.ts +2 -2
- package/lib/esm/curve/CurvePrimitive.js.map +1 -1
- package/lib/esm/curve/Query/PlanarSubdivision.d.ts +9 -5
- package/lib/esm/curve/Query/PlanarSubdivision.d.ts.map +1 -1
- package/lib/esm/curve/Query/PlanarSubdivision.js +20 -9
- package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/esm/curve/RegionMomentsXY.d.ts.map +1 -1
- package/lib/esm/curve/RegionMomentsXY.js +14 -14
- package/lib/esm/curve/RegionMomentsXY.js.map +1 -1
- package/lib/esm/curve/RegionOps.d.ts +12 -0
- package/lib/esm/curve/RegionOps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOps.js +23 -3
- package/lib/esm/curve/RegionOps.js.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts +14 -13
- package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.js +46 -29
- package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +41 -17
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/esm/geometry3d/AngleSweep.d.ts +10 -6
- package/lib/esm/geometry3d/AngleSweep.d.ts.map +1 -1
- package/lib/esm/geometry3d/AngleSweep.js +17 -6
- package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.d.ts +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/esm/geometry4d/Point4d.d.ts +3 -2
- package/lib/esm/geometry4d/Point4d.d.ts.map +1 -1
- package/lib/esm/geometry4d/Point4d.js +9 -2
- package/lib/esm/geometry4d/Point4d.js.map +1 -1
- package/lib/esm/numerics/BezierPolynomials.d.ts +2 -0
- package/lib/esm/numerics/BezierPolynomials.d.ts.map +1 -1
- package/lib/esm/numerics/BezierPolynomials.js +11 -0
- package/lib/esm/numerics/BezierPolynomials.js.map +1 -1
- package/lib/esm/numerics/SmallSystem.d.ts.map +1 -1
- package/lib/esm/numerics/SmallSystem.js +3 -3
- package/lib/esm/numerics/SmallSystem.js.map +1 -1
- package/lib/esm/polyface/IndexedPolyfaceVisitor.js +1 -1
- package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSearch.d.ts +1 -0
- package/lib/esm/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSearch.js +1 -0
- package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanarSubdivision.js","sourceRoot":"","sources":["../../../../src/curve/Query/PlanarSubdivision.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\nimport { Geometry } from \"../../Geometry\";\r\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { HalfEdge, HalfEdgeGraph } from \"../../topology/Graph\";\r\nimport { HalfEdgeGraphSearch } from \"../../topology/HalfEdgeGraphSearch\";\r\nimport { HalfEdgeGraphMerge } from \"../../topology/Merging\";\r\nimport { Arc3d } from \"../Arc3d\";\r\nimport { CurveLocationDetail, CurveLocationDetailPair } from \"../CurveLocationDetail\";\r\nimport { CurvePrimitive } from \"../CurvePrimitive\";\r\nimport { LineSegment3d } from \"../LineSegment3d\";\r\nimport { LineString3d } from \"../LineString3d\";\r\nimport { Loop, LoopCurveLoopCurve, SignedLoops } from \"../Loop\";\r\nimport { RegionOps } from \"../RegionOps\";\r\n\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\n\r\nclass MapCurvePrimitiveToCurveLocationDetailPairArray {\r\n public primitiveToPair = new Map<CurvePrimitive, CurveLocationDetailPair[]>();\r\n // index assigned to this primitive (for debugging)\r\n public primitiveToIndex = new Map<CurvePrimitive, number>();\r\n private _numIndexedPrimitives: number = 0;\r\n public assignPrimitiveIndex(primitive: CurvePrimitive | undefined) {\r\n if (primitive !== undefined) {\r\n const index = this.primitiveToIndex.get(primitive);\r\n if (index === undefined) {\r\n this.primitiveToIndex.set(primitive, this._numIndexedPrimitives++);\r\n }\r\n }\r\n }\r\n public insertPrimitiveToPair(primitive: CurvePrimitive | undefined, pair: CurveLocationDetailPair) {\r\n if (primitive) {\r\n const priorPairs = this.primitiveToPair.get(primitive);\r\n this.assignPrimitiveIndex(primitive);\r\n if (!priorPairs) {\r\n this.primitiveToPair.set(primitive, [pair]);\r\n } else {\r\n priorPairs.push(pair);\r\n }\r\n }\r\n }\r\n public insertPair(pair: CurveLocationDetailPair) {\r\n const primitiveA = pair.detailA.curve;\r\n if (primitiveA)\r\n this.insertPrimitiveToPair(primitiveA, pair);\r\n const primitiveB = pair.detailB.curve;\r\n if (primitiveB)\r\n this.insertPrimitiveToPair(primitiveB, pair);\r\n }\r\n /**\r\n * Split closed missing primitives in half and add new intersection pairs.\r\n * * When bridge edges aren't included in the primitives array, a closed primitive with no intersections will not be\r\n * added to the graph because it isn't in the `primitiveToPair` map. By splitting such a missing primitive in two, we\r\n * introduce two intersections for each half, which allows the primitive to be represented in the map.\r\n */\r\n public splitAndAppendMissingClosedPrimitives(primitives: CurvePrimitive[], tolerance: number = Geometry.smallMetricDistance) {\r\n for (const p of primitives) {\r\n let closedCurveSplitCandidate = false;\r\n if (p instanceof Arc3d)\r\n closedCurveSplitCandidate = p.sweep.isFullCircle;\r\n else if (!(p instanceof LineSegment3d) && !(p instanceof LineString3d)) // TODO: probably should do this for all types. Lots of spline-type primitives can be closed.\r\n closedCurveSplitCandidate = p.startPoint().isAlmostEqualXY(p.endPoint(), tolerance);\r\n if (closedCurveSplitCandidate && !this.primitiveToPair.has(p)) {\r\n const p0 = p.clonePartialCurve(0.0, 0.5);\r\n const p1 = p.clonePartialCurve(0.5, 1.0);\r\n if (p0 && p1) {\r\n this.insertPair(CurveLocationDetailPair.createCapture(CurveLocationDetail.createCurveEvaluatedFraction(p0, 0.0), CurveLocationDetail.createCurveEvaluatedFraction(p1, 1.0)));\r\n this.insertPair(CurveLocationDetailPair.createCapture(CurveLocationDetail.createCurveEvaluatedFraction(p0, 1.0), CurveLocationDetail.createCurveEvaluatedFraction(p1, 0.0)));\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class PlanarSubdivision {\r\n /** Create a graph from an array of curves, and an array of the curves' precomputed intersections. Z-coordinates are ignored. */\r\n public static assembleHalfEdgeGraph(primitives: CurvePrimitive[], allPairs: CurveLocationDetailPair[], mergeTolerance: number = Geometry.smallMetricDistance): HalfEdgeGraph {\r\n const detailByPrimitive = new MapCurvePrimitiveToCurveLocationDetailPairArray(); // map from key CurvePrimitive to CurveLocationDetailPair.\r\n for (const pair of allPairs)\r\n detailByPrimitive.insertPair(pair);\r\n if (primitives.length > detailByPrimitive.primitiveToPair.size)\r\n detailByPrimitive.splitAndAppendMissingClosedPrimitives(primitives, mergeTolerance); // otherwise, these single-primitive loops are missing from the graph\r\n const graph = new HalfEdgeGraph();\r\n for (const entry of detailByPrimitive.primitiveToPair.entries()) {\r\n const p = entry[0];\r\n // convert each interval intersection into two isolated intersections\r\n const details = entry[1].reduce((accumulator: CurveLocationDetailPair[], detailPair) => {\r\n if (!detailPair.detailA.hasFraction1)\r\n return [...accumulator, detailPair];\r\n const detail = getDetailOnCurve(detailPair, p)!;\r\n const detail0 = CurveLocationDetail.createCurveFractionPoint(p, detail.fraction, detail.point);\r\n const detail1 = CurveLocationDetail.createCurveFractionPoint(p, detail.fraction1!, detail.point1!);\r\n return [...accumulator, CurveLocationDetailPair.createCapture(detail0, detail0), CurveLocationDetailPair.createCapture(detail1, detail1)];\r\n }, []);\r\n // lexical sort on p intersection fraction\r\n details.sort((pairA: CurveLocationDetailPair, pairB: CurveLocationDetailPair) => {\r\n const fractionA = getFractionOnCurve(pairA, p)!;\r\n const fractionB = getFractionOnCurve(pairB, p)!;\r\n return fractionA - fractionB;\r\n });\r\n let last = {point: p.startPoint(), fraction: 0.0};\r\n for (const detailPair of details) {\r\n const detail = getDetailOnCurve(detailPair, p)!;\r\n const detailFraction = Geometry.restrictToInterval(detail.fraction, 0, 1); // truncate fraction, but don't snap point; clustering happens later\r\n last = this.addHalfEdge(graph, p, last.point, last.fraction, detail.point, detailFraction, mergeTolerance);\r\n }\r\n this.addHalfEdge(graph, p, last.point, last.fraction, p.endPoint(), 1.0, mergeTolerance);\r\n }\r\n HalfEdgeGraphMerge.clusterAndMergeXYTheta(graph, (he: HalfEdge) => he.sortAngle!);\r\n return graph;\r\n }\r\n /**\r\n * Create a pair of mated half edges referencing an interval of a primitive\r\n * * no action if start and end points are identical.\r\n * @param graph containing graph.\r\n * @param p the curve\r\n * @param point0 start point\r\n * @param fraction0 starting fraction\r\n * @param point1 end point\r\n * @param fraction1 end fraction\r\n * @returns end point and fraction, or start point and fraction if no action\r\n */\r\n private static addHalfEdge(graph: HalfEdgeGraph, p: CurvePrimitive, point0: Point3d, fraction0: number, point1: Point3d, fraction1: number, mergeTolerance: number = Geometry.smallMetricDistance): {point: Point3d, fraction: number} {\r\n if (point0.isAlmostEqualXY(point1, mergeTolerance))\r\n return {point: point0, fraction: fraction0};\r\n const halfEdge = graph.createEdgeXYAndZ(point0, 0, point1, 0);\r\n const detail01 = CurveLocationDetail.createCurveEvaluatedFractionFraction(p, fraction0, fraction1);\r\n const mate = halfEdge.edgeMate;\r\n halfEdge.edgeTag = detail01;\r\n halfEdge.sortData = 1.0;\r\n mate.edgeTag = detail01;\r\n mate.sortData = -1.0;\r\n halfEdge.sortAngle = sortAngle(p, fraction0, false);\r\n mate.sortAngle = sortAngle(p, fraction1, true);\r\n return {point: point1, fraction: fraction1};\r\n }\r\n /**\r\n * Based on computed (and toleranced) area, push the loop (pointer) onto the appropriate array of positive, negative, or sliver loops.\r\n * @param zeroAreaTolerance absolute area tolerance for sliver face detection\r\n * @param isSliverFace whether the loop is known a priori (e.g., via topology) to have zero area\r\n * @returns the area (forced to zero if within tolerance)\r\n */\r\n public static collectSignedLoop(loop: Loop, outLoops: SignedLoops, zeroAreaTolerance: number = 1.0e-10, isSliverFace?: boolean): number{\r\n let area = isSliverFace ? 0.0 : RegionOps.computeXYArea(loop);\r\n if (area === undefined)\r\n area = 0;\r\n if (Math.abs(area) < zeroAreaTolerance)\r\n area = 0.0;\r\n (loop as any).computedAreaInPlanarSubdivision = area;\r\n if (area > 0)\r\n outLoops.positiveAreaLoops.push(loop);\r\n else if (area < 0)\r\n outLoops.negativeAreaLoops.push(loop);\r\n else\r\n outLoops.slivers.push(loop);\r\n return area;\r\n }\r\n public static createLoopInFace(faceSeed: HalfEdge,\r\n announce?: (he: HalfEdge, curve: CurvePrimitive, loop: Loop) => void): Loop {\r\n let he = faceSeed;\r\n const loop = Loop.create();\r\n do {\r\n const detail = he.edgeTag as CurveLocationDetail;\r\n if (detail) {\r\n let curve;\r\n if (he.sortData! > 0)\r\n curve = detail.curve!.clonePartialCurve(detail.fraction, detail.fraction1!);\r\n else\r\n curve = detail.curve!.clonePartialCurve(detail.fraction1!, detail.fraction);\r\n if (curve) {\r\n if (announce !== undefined)\r\n announce(he, curve, loop);\r\n loop.tryAddChild(curve);\r\n }\r\n }\r\n he = he.faceSuccessor;\r\n } while (he !== faceSeed);\r\n return loop;\r\n }\r\n // Return true if there are only two edges in the face loop, and their start curvatures are the same.\r\n private static isNullFace(he: HalfEdge): boolean {\r\n const faceHasTwoEdges = (he.faceSuccessor.faceSuccessor === he);\r\n let faceIsBanana = false;\r\n if (faceHasTwoEdges) {\r\n const c0 = HalfEdgeGraphMerge.curvatureSortKey(he);\r\n const c1 = HalfEdgeGraphMerge.curvatureSortKey(he.faceSuccessor.edgeMate);\r\n if (!Geometry.isSameCoordinate(c0, c1)) // default tol!\r\n faceIsBanana = true; // heuristic: we could also check end curvatures, and/or higher derivatives...\r\n }\r\n return faceHasTwoEdges && !faceIsBanana;\r\n }\r\n // Look across edge mates (possibly several) for a nonnull mate face.\r\n private static nonNullEdgeMate(_graph: HalfEdgeGraph, e: HalfEdge): HalfEdge | undefined {\r\n if (this.isNullFace (e))\r\n return undefined;\r\n let e1 = e.edgeMate;\r\n while (this.isNullFace(e1)){\r\n e1 = e1.faceSuccessor.edgeMate;\r\n if (e1 === e)\r\n return undefined;\r\n }\r\n return e1;\r\n }\r\n public static collectSignedLoopSetsInHalfEdgeGraph(graph: HalfEdgeGraph, zeroAreaTolerance: number = 1.0e-10): SignedLoops[] {\r\n const q = HalfEdgeGraphSearch.collectConnectedComponentsWithExteriorParityMasks(graph, undefined);\r\n const result: SignedLoops[] = [];\r\n const edgeMap = new Map<HalfEdge, LoopCurveLoopCurve>();\r\n for (const faceSeeds of q) {\r\n const componentAreas: SignedLoops = { positiveAreaLoops: [], negativeAreaLoops: [], slivers: [] };\r\n const edges: LoopCurveLoopCurve[] = [];\r\n for (const faceSeed of faceSeeds) {\r\n const isNullFace = this.isNullFace(faceSeed);\r\n const loop = this.createLoopInFace(faceSeed, (he: HalfEdge, curveC: CurvePrimitive, loopC: Loop) => {\r\n if (!isNullFace) {\r\n const mate = this.nonNullEdgeMate(graph, he);\r\n if (mate !== undefined) {\r\n const e = edgeMap.get(mate);\r\n if (e === undefined) {\r\n // Record this as loopA,edgeA of a shared edge to be completed later from the other side of the edge\r\n const e1 = new LoopCurveLoopCurve(loopC, curveC, undefined, undefined);\r\n edgeMap.set(he, e1);\r\n } else if (e instanceof LoopCurveLoopCurve) {\r\n e.setB(loopC, curveC);\r\n edges.push(e);\r\n edgeMap.delete(mate);\r\n }\r\n }\r\n }\r\n });\r\n this.collectSignedLoop(loop, componentAreas, zeroAreaTolerance, isNullFace);\r\n }\r\n componentAreas.edges = edges;\r\n result.push(componentAreas);\r\n edgeMap.clear();\r\n }\r\n return result;\r\n }\r\n}\r\n\r\nfunction sortAngle(curve: CurvePrimitive, fraction: number, reverse: boolean): number {\r\n const ray = curve.fractionToPointAndDerivative(fraction);\r\n const s = reverse ? -1.0 : 1.0;\r\n return Math.atan2(s * ray.direction.y, s * ray.direction.x);\r\n}\r\n\r\nfunction getFractionOnCurve(pair: CurveLocationDetailPair, curve: CurvePrimitive): number | undefined {\r\n if (pair.detailA.curve === curve)\r\n return pair.detailA.fraction;\r\n if (pair.detailB.curve === curve)\r\n return pair.detailB.fraction;\r\n return undefined;\r\n}\r\nfunction getDetailOnCurve(pair: CurveLocationDetailPair, curve: CurvePrimitive): CurveLocationDetail | undefined {\r\n if (pair.detailA.curve === curve)\r\n return pair.detailA;\r\n if (pair.detailB.curve === curve)\r\n return pair.detailB;\r\n return undefined;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"PlanarSubdivision.js","sourceRoot":"","sources":["../../../../src/curve/Query/PlanarSubdivision.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\nimport { Geometry } from \"../../Geometry\";\r\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { HalfEdge, HalfEdgeGraph } from \"../../topology/Graph\";\r\nimport { HalfEdgeGraphSearch } from \"../../topology/HalfEdgeGraphSearch\";\r\nimport { HalfEdgeGraphMerge } from \"../../topology/Merging\";\r\nimport { Arc3d } from \"../Arc3d\";\r\nimport { CurveLocationDetail, CurveLocationDetailPair } from \"../CurveLocationDetail\";\r\nimport { CurvePrimitive } from \"../CurvePrimitive\";\r\nimport { LineSegment3d } from \"../LineSegment3d\";\r\nimport { LineString3d } from \"../LineString3d\";\r\nimport { Loop, LoopCurveLoopCurve, SignedLoops } from \"../Loop\";\r\nimport { RegionOps } from \"../RegionOps\";\r\n\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\n\r\nclass MapCurvePrimitiveToCurveLocationDetailPairArray {\r\n public primitiveToPair = new Map<CurvePrimitive, CurveLocationDetailPair[]>();\r\n // index assigned to this primitive (for debugging)\r\n public primitiveToIndex = new Map<CurvePrimitive, number>();\r\n private _numIndexedPrimitives: number = 0;\r\n public assignPrimitiveIndex(primitive: CurvePrimitive | undefined) {\r\n if (primitive !== undefined) {\r\n const index = this.primitiveToIndex.get(primitive);\r\n if (index === undefined) {\r\n this.primitiveToIndex.set(primitive, this._numIndexedPrimitives++);\r\n }\r\n }\r\n }\r\n public insertPrimitiveToPair(primitive: CurvePrimitive | undefined, pair: CurveLocationDetailPair) {\r\n if (primitive) {\r\n const priorPairs = this.primitiveToPair.get(primitive);\r\n this.assignPrimitiveIndex(primitive);\r\n if (!priorPairs) {\r\n this.primitiveToPair.set(primitive, [pair]);\r\n } else {\r\n priorPairs.push(pair);\r\n }\r\n }\r\n }\r\n public insertPair(pair: CurveLocationDetailPair) {\r\n const primitiveA = pair.detailA.curve;\r\n if (primitiveA)\r\n this.insertPrimitiveToPair(primitiveA, pair);\r\n const primitiveB = pair.detailB.curve;\r\n if (primitiveB)\r\n this.insertPrimitiveToPair(primitiveB, pair);\r\n }\r\n /**\r\n * Split closed missing primitives in half and add new intersection pairs.\r\n * * When bridge edges aren't included in the primitives array, a closed primitive with no intersections will not be\r\n * added to the graph because it isn't in the `primitiveToPair` map. By splitting such a missing primitive in two, we\r\n * introduce two intersections for each half, which allows the primitive to be represented in the map.\r\n */\r\n public splitAndAppendMissingClosedPrimitives(\r\n primitives: CurvePrimitive[], tolerance: number = Geometry.smallMetricDistance,\r\n ): void {\r\n for (const p of primitives) {\r\n let closedCurveSplitCandidate = false;\r\n if (p instanceof Arc3d)\r\n closedCurveSplitCandidate = p.sweep.isFullCircle;\r\n else if (!(p instanceof LineSegment3d) && !(p instanceof LineString3d)) // TODO: probably should do this for all types. Lots of spline-type primitives can be closed.\r\n closedCurveSplitCandidate = p.startPoint().isAlmostEqualXY(p.endPoint(), tolerance);\r\n if (closedCurveSplitCandidate && !this.primitiveToPair.has(p)) {\r\n const p0 = p.clonePartialCurve(0.0, 0.5);\r\n const p1 = p.clonePartialCurve(0.5, 1.0);\r\n if (p0 && p1) {\r\n this.insertPair(CurveLocationDetailPair.createCapture(\r\n CurveLocationDetail.createCurveEvaluatedFraction(p0, 0.0),\r\n CurveLocationDetail.createCurveEvaluatedFraction(p1, 1.0),\r\n ));\r\n this.insertPair(CurveLocationDetailPair.createCapture(\r\n CurveLocationDetail.createCurveEvaluatedFraction(p0, 1.0),\r\n CurveLocationDetail.createCurveEvaluatedFraction(p1, 0.0),\r\n ));\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class PlanarSubdivision {\r\n /**\r\n * Create a graph from an array of curves, and an array of the curves' precomputed intersections.\r\n * Z-coordinates are ignored.\r\n */\r\n public static assembleHalfEdgeGraph(\r\n primitives: CurvePrimitive[],\r\n allPairs: CurveLocationDetailPair[],\r\n mergeTolerance: number = Geometry.smallMetricDistance,\r\n ): HalfEdgeGraph {\r\n // map from key CurvePrimitive to CurveLocationDetailPair\r\n const detailByPrimitive = new MapCurvePrimitiveToCurveLocationDetailPairArray();\r\n for (const pair of allPairs)\r\n detailByPrimitive.insertPair(pair);\r\n if (primitives.length > detailByPrimitive.primitiveToPair.size) {\r\n // otherwise, these single-primitive loops are missing from the graph\r\n detailByPrimitive.splitAndAppendMissingClosedPrimitives(primitives, mergeTolerance);\r\n }\r\n const graph = new HalfEdgeGraph();\r\n for (const entry of detailByPrimitive.primitiveToPair.entries()) {\r\n const p = entry[0];\r\n // convert each interval intersection into two isolated intersections\r\n const details = entry[1].reduce((accumulator: CurveLocationDetailPair[], detailPair) => {\r\n if (!detailPair.detailA.hasFraction1)\r\n return [...accumulator, detailPair];\r\n const detail = getDetailOnCurve(detailPair, p)!;\r\n const detail0 = CurveLocationDetail.createCurveFractionPoint(p, detail.fraction, detail.point);\r\n const detail1 = CurveLocationDetail.createCurveFractionPoint(p, detail.fraction1!, detail.point1!);\r\n return [\r\n ...accumulator,\r\n CurveLocationDetailPair.createCapture(detail0, detail0),\r\n CurveLocationDetailPair.createCapture(detail1, detail1),\r\n ];\r\n }, []);\r\n // lexical sort on p intersection fraction\r\n details.sort((pairA: CurveLocationDetailPair, pairB: CurveLocationDetailPair) => {\r\n const fractionA = getFractionOnCurve(pairA, p)!;\r\n const fractionB = getFractionOnCurve(pairB, p)!;\r\n return fractionA - fractionB;\r\n });\r\n let last = { point: p.startPoint(), fraction: 0.0 };\r\n for (const detailPair of details) {\r\n const detail = getDetailOnCurve(detailPair, p)!;\r\n const detailFraction = Geometry.restrictToInterval(detail.fraction, 0, 1); // truncate fraction, but don't snap point; clustering happens later\r\n last = this.addHalfEdge(graph, p, last.point, last.fraction, detail.point, detailFraction, mergeTolerance);\r\n }\r\n this.addHalfEdge(graph, p, last.point, last.fraction, p.endPoint(), 1.0, mergeTolerance);\r\n }\r\n HalfEdgeGraphMerge.clusterAndMergeXYTheta(graph, (he: HalfEdge) => he.sortAngle!);\r\n return graph;\r\n }\r\n /**\r\n * Create a pair of mated half edges referencing an interval of a primitive.\r\n * * no action if start and end points are identical.\r\n * @param graph containing graph\r\n * @param p the curve\r\n * @param point0 start point\r\n * @param fraction0 starting fraction\r\n * @param point1 end point\r\n * @param fraction1 end fraction\r\n * @returns end point and fraction, or start point and fraction if no action\r\n */\r\n private static addHalfEdge(\r\n graph: HalfEdgeGraph,\r\n p: CurvePrimitive,\r\n point0: Point3d,\r\n fraction0: number,\r\n point1: Point3d,\r\n fraction1: number,\r\n mergeTolerance: number = Geometry.smallMetricDistance,\r\n ): { point: Point3d, fraction: number } {\r\n if (point0.isAlmostEqualXY(point1, mergeTolerance))\r\n return { point: point0, fraction: fraction0 };\r\n const halfEdge = graph.createEdgeXYAndZ(point0, 0, point1, 0);\r\n const detail01 = CurveLocationDetail.createCurveEvaluatedFractionFraction(p, fraction0, fraction1);\r\n const mate = halfEdge.edgeMate;\r\n halfEdge.edgeTag = detail01;\r\n halfEdge.sortData = 1.0;\r\n mate.edgeTag = detail01;\r\n mate.sortData = -1.0;\r\n halfEdge.sortAngle = sortAngle(p, fraction0, false);\r\n mate.sortAngle = sortAngle(p, fraction1, true);\r\n return { point: point1, fraction: fraction1 };\r\n }\r\n /**\r\n * Based on computed (and toleranced) area, push the loop (pointer) onto the appropriate array of positive, negative,\r\n * or sliver loops.\r\n * @param zeroAreaTolerance absolute area tolerance for sliver face detection\r\n * @param isSliverFace whether the loop is known a priori (e.g., via topology) to have zero area\r\n * @returns the area (forced to zero if within tolerance)\r\n */\r\n public static collectSignedLoop(\r\n loop: Loop, outLoops: SignedLoops, zeroAreaTolerance: number = 1.0e-10, isSliverFace?: boolean,\r\n ): number {\r\n let area = isSliverFace ? 0.0 : RegionOps.computeXYArea(loop);\r\n if (area === undefined)\r\n area = 0;\r\n if (Math.abs(area) < zeroAreaTolerance)\r\n area = 0.0;\r\n (loop as any).computedAreaInPlanarSubdivision = area;\r\n if (area > 0)\r\n outLoops.positiveAreaLoops.push(loop);\r\n else if (area < 0)\r\n outLoops.negativeAreaLoops.push(loop);\r\n else\r\n outLoops.slivers.push(loop);\r\n return area;\r\n }\r\n public static createLoopInFace(\r\n faceSeed: HalfEdge, announce?: (he: HalfEdge, curve: CurvePrimitive, loop: Loop) => void,\r\n ): Loop {\r\n let he = faceSeed;\r\n const loop = Loop.create();\r\n do {\r\n const detail = he.edgeTag as CurveLocationDetail;\r\n if (detail) {\r\n let curve;\r\n if (he.sortData! > 0)\r\n curve = detail.curve!.clonePartialCurve(detail.fraction, detail.fraction1!);\r\n else\r\n curve = detail.curve!.clonePartialCurve(detail.fraction1!, detail.fraction);\r\n if (curve) {\r\n if (announce !== undefined)\r\n announce(he, curve, loop);\r\n loop.tryAddChild(curve);\r\n }\r\n }\r\n he = he.faceSuccessor;\r\n } while (he !== faceSeed);\r\n return loop;\r\n }\r\n // Return true if there are only two edges in the face loop, and their start curvatures are the same.\r\n private static isNullFace(he: HalfEdge): boolean {\r\n const faceHasTwoEdges = (he.faceSuccessor.faceSuccessor === he);\r\n let faceIsBanana = false;\r\n if (faceHasTwoEdges) {\r\n const c0 = HalfEdgeGraphMerge.curvatureSortKey(he);\r\n const c1 = HalfEdgeGraphMerge.curvatureSortKey(he.faceSuccessor.edgeMate);\r\n if (!Geometry.isSameCoordinate(c0, c1)) // default tol!\r\n faceIsBanana = true; // heuristic: we could also check end curvatures, and/or higher derivatives...\r\n }\r\n return faceHasTwoEdges && !faceIsBanana;\r\n }\r\n // Look across edge mates (possibly several) for a nonnull mate face.\r\n private static nonNullEdgeMate(_graph: HalfEdgeGraph, e: HalfEdge): HalfEdge | undefined {\r\n if (this.isNullFace(e))\r\n return undefined;\r\n let e1 = e.edgeMate;\r\n while (this.isNullFace(e1)) {\r\n e1 = e1.faceSuccessor.edgeMate;\r\n if (e1 === e)\r\n return undefined;\r\n }\r\n return e1;\r\n }\r\n public static collectSignedLoopSetsInHalfEdgeGraph(graph: HalfEdgeGraph, zeroAreaTolerance: number = 1.0e-10): SignedLoops[] {\r\n const q = HalfEdgeGraphSearch.collectConnectedComponentsWithExteriorParityMasks(graph, undefined);\r\n const result: SignedLoops[] = [];\r\n const edgeMap = new Map<HalfEdge, LoopCurveLoopCurve>();\r\n for (const faceSeeds of q) {\r\n const componentAreas: SignedLoops = { positiveAreaLoops: [], negativeAreaLoops: [], slivers: [] };\r\n const edges: LoopCurveLoopCurve[] = [];\r\n for (const faceSeed of faceSeeds) {\r\n const isNullFace = this.isNullFace(faceSeed);\r\n const loop = this.createLoopInFace(faceSeed, (he: HalfEdge, curveC: CurvePrimitive, loopC: Loop) => {\r\n if (!isNullFace) {\r\n const mate = this.nonNullEdgeMate(graph, he);\r\n if (mate !== undefined) {\r\n const e = edgeMap.get(mate);\r\n if (e === undefined) {\r\n // Record this as loopA,edgeA of a shared edge to be completed later from the other side of the edge\r\n const e1 = new LoopCurveLoopCurve(loopC, curveC, undefined, undefined);\r\n edgeMap.set(he, e1);\r\n } else if (e instanceof LoopCurveLoopCurve) {\r\n e.setB(loopC, curveC);\r\n edges.push(e);\r\n edgeMap.delete(mate);\r\n }\r\n }\r\n }\r\n });\r\n this.collectSignedLoop(loop, componentAreas, zeroAreaTolerance, isNullFace);\r\n }\r\n componentAreas.edges = edges;\r\n result.push(componentAreas);\r\n edgeMap.clear();\r\n }\r\n return result;\r\n }\r\n}\r\n\r\nfunction sortAngle(curve: CurvePrimitive, fraction: number, reverse: boolean): number {\r\n const ray = curve.fractionToPointAndDerivative(fraction);\r\n const s = reverse ? -1.0 : 1.0;\r\n return Math.atan2(s * ray.direction.y, s * ray.direction.x);\r\n}\r\n\r\nfunction getFractionOnCurve(pair: CurveLocationDetailPair, curve: CurvePrimitive): number | undefined {\r\n if (pair.detailA.curve === curve)\r\n return pair.detailA.fraction;\r\n if (pair.detailB.curve === curve)\r\n return pair.detailB.fraction;\r\n return undefined;\r\n}\r\nfunction getDetailOnCurve(pair: CurveLocationDetailPair, curve: CurvePrimitive): CurveLocationDetail | undefined {\r\n if (pair.detailA.curve === curve)\r\n return pair.detailA;\r\n if (pair.detailB.curve === curve)\r\n return pair.detailB;\r\n return undefined;\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RegionMomentsXY.d.ts","sourceRoot":"","sources":["../../../src/curve/RegionMomentsXY.ts"],"names":[],"mappings":"AAKA;;GAEG;AAIH,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,mBAAmB;IACtD,OAAO,CAAC,iBAAiB,CAAC,CAAa;IACvC,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,OAAO,CAAoB;IACnC;;;;OAIG;IACa,WAAW,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI;IAgC7C,6FAA6F;IAC7E,kBAAkB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI;IAI1D,4FAA4F;IAC5E,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAMjE,uEAAuE;IACvD,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU,GAAG,SAAS;IAQ9D,OAAO,CAAC,eAAe;IAiBvB,+EAA+E;IAC/D,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,UAAU,GAAG,SAAS;IAGhF,8EAA8E;IAC9D,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,UAAU,GAAG,SAAS;IAI9E,OAAO,CAAC,cAAc,CAAC,CAAgB;IACvC,OAAO,CAAC,gBAAgB;IASxB;;;OAGG;IACI,oBAAoB,CAAC,EAAE,EAAE,cAAc;
|
|
1
|
+
{"version":3,"file":"RegionMomentsXY.d.ts","sourceRoot":"","sources":["../../../src/curve/RegionMomentsXY.ts"],"names":[],"mappings":"AAKA;;GAEG;AAIH,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,mBAAmB;IACtD,OAAO,CAAC,iBAAiB,CAAC,CAAa;IACvC,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,OAAO,CAAoB;IACnC;;;;OAIG;IACa,WAAW,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI;IAgC7C,6FAA6F;IAC7E,kBAAkB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI;IAI1D,4FAA4F;IAC5E,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAMjE,uEAAuE;IACvD,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU,GAAG,SAAS;IAQ9D,OAAO,CAAC,eAAe;IAiBvB,+EAA+E;IAC/D,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,UAAU,GAAG,SAAS;IAGhF,8EAA8E;IAC9D,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,UAAU,GAAG,SAAS;IAI9E,OAAO,CAAC,cAAc,CAAC,CAAgB;IACvC,OAAO,CAAC,gBAAgB;IASxB;;;OAGG;IACI,oBAAoB,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI;IAMrD,yEAAyE;IACzD,oBAAoB,CAAC,CAAC,EAAE,cAAc,GAAG,IAAI;IAG7D,0EAA0E;IAC1D,qBAAqB,CAAC,CAAC,EAAE,eAAe,GAAG,IAAI;IAG/D,0EAA0E;IAC1D,sBAAsB,CAAC,CAAC,EAAE,kBAAkB,GAAG,IAAI;CAGpE"}
|
|
@@ -10,6 +10,7 @@ const GeometryHandler_1 = require("../geometry3d/GeometryHandler");
|
|
|
10
10
|
const Point3dVector3d_1 = require("../geometry3d/Point3dVector3d");
|
|
11
11
|
const MomentData_1 = require("../geometry4d/MomentData");
|
|
12
12
|
const LineString3d_1 = require("./LineString3d");
|
|
13
|
+
const Loop_1 = require("./Loop");
|
|
13
14
|
const RegionOps_1 = require("./RegionOps");
|
|
14
15
|
const StrokeOptions_1 = require("./StrokeOptions");
|
|
15
16
|
/**
|
|
@@ -77,20 +78,19 @@ class RegionMomentsXY extends GeometryHandler_1.NullGeometryHandler {
|
|
|
77
78
|
return momentData;
|
|
78
79
|
}
|
|
79
80
|
handleAnyRegion(region) {
|
|
80
|
-
const summedMoments = MomentData_1.MomentData.create();
|
|
81
81
|
// guarantee there is no overlapping children
|
|
82
82
|
const merged = RegionOps_1.RegionOps.regionBooleanXY(region, undefined, RegionOps_1.RegionBinaryOpType.Union);
|
|
83
|
-
if (merged)
|
|
84
|
-
for (const child of merged.children) {
|
|
85
|
-
const childMoments = child.dispatchToGeometryHandler(this);
|
|
86
|
-
if (childMoments) {
|
|
87
|
-
const sign0 = childMoments.signFactor(1.0);
|
|
88
|
-
summedMoments.accumulateProducts(childMoments, sign0);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
83
|
+
if (!merged)
|
|
93
84
|
return undefined;
|
|
85
|
+
if (merged instanceof Loop_1.Loop)
|
|
86
|
+
return this.handleLoop(merged);
|
|
87
|
+
const summedMoments = MomentData_1.MomentData.create();
|
|
88
|
+
for (const child of merged.children) {
|
|
89
|
+
const childMoments = child.dispatchToGeometryHandler(this);
|
|
90
|
+
if (childMoments) {
|
|
91
|
+
const sign0 = childMoments.signFactor(1.0);
|
|
92
|
+
summedMoments.accumulateProducts(childMoments, sign0);
|
|
93
|
+
}
|
|
94
94
|
}
|
|
95
95
|
return summedMoments;
|
|
96
96
|
}
|
|
@@ -124,15 +124,15 @@ class RegionMomentsXY extends GeometryHandler_1.NullGeometryHandler {
|
|
|
124
124
|
}
|
|
125
125
|
/** Handle strongly typed BSplineCurve3d as generic curve primitive. */
|
|
126
126
|
handleBSplineCurve3d(g) {
|
|
127
|
-
|
|
127
|
+
this.handleCurvePrimitive(g);
|
|
128
128
|
}
|
|
129
129
|
/** Handle strongly typed BSplineCurve3dH as generic curve primitive. */
|
|
130
130
|
handleBSplineCurve3dH(g) {
|
|
131
|
-
|
|
131
|
+
this.handleCurvePrimitive(g);
|
|
132
132
|
}
|
|
133
133
|
/** Handle strongly typed TransitionSpiral as generic curve primitive. */
|
|
134
134
|
handleTransitionSpiral(g) {
|
|
135
|
-
|
|
135
|
+
this.handleCurvePrimitive(g);
|
|
136
136
|
}
|
|
137
137
|
}
|
|
138
138
|
exports.RegionMomentsXY = RegionMomentsXY;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RegionMomentsXY.js","sourceRoot":"","sources":["../../../src/curve/RegionMomentsXY.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 Curve\r\n */\r\n\r\n// import { Geometry, Angle, AngleSweep } from \"../Geometry\";\r\n\r\nimport { BSplineCurve3d } from \"../bspline/BSplineCurve\";\r\nimport { BSplineCurve3dH } from \"../bspline/BSplineCurve3dH\";\r\nimport { Angle } from \"../geometry3d/Angle\";\r\nimport { NullGeometryHandler } from \"../geometry3d/GeometryHandler\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { MomentData } from \"../geometry4d/MomentData\";\r\nimport { Arc3d } from \"./Arc3d\";\r\nimport { CurvePrimitive } from \"./CurvePrimitive\";\r\nimport { AnyRegion } from \"./CurveTypes\";\r\nimport { LineSegment3d } from \"./LineSegment3d\";\r\nimport { LineString3d } from \"./LineString3d\";\r\nimport { Loop } from \"./Loop\";\r\nimport { ParityRegion } from \"./ParityRegion\";\r\nimport { RegionBinaryOpType, RegionOps } from \"./RegionOps\";\r\nimport { TransitionSpiral3d } from \"./spiral/TransitionSpiral3d\";\r\nimport { StrokeOptions } from \"./StrokeOptions\";\r\nimport { UnionRegion } from \"./UnionRegion\";\r\n\r\n/**\r\n * Implementation class for computing XY area moments.\r\n * @internal\r\n */\r\nexport class RegionMomentsXY extends NullGeometryHandler {\r\n private _activeMomentData?: MomentData;\r\n private _point0 = Point3d.create();\r\n private _point1 = Point3d.create();\r\n /**\r\n * Accumulate (independent) integrations over:\r\n * * The area between the arc and the chord connecting its endpoints.\r\n * * The triangle with vertices: origin, arc start, arc end.\r\n */\r\n public override handleArc3d(arc: Arc3d): void {\r\n const momentData = this._activeMomentData!;\r\n const sweepRadians = arc.sweep.sweepRadians;\r\n const alphaRadians = sweepRadians * 0.5;\r\n let s = Math.sin(alphaRadians);\r\n let c = Math.cos(alphaRadians);\r\n let s1 = Math.sin(sweepRadians);\r\n if (Angle.isFullCircleRadians(sweepRadians)) {\r\n s = 0.0;\r\n c = -1.0;\r\n s1 = 0.0;\r\n }\r\n const q = 2 * s * s * s * c / (alphaRadians - s * c);\r\n const s3 = s * s * s;\r\n const s6 = s3 * s3;\r\n const area = 0.5 * (sweepRadians - s1);\r\n const inertiaXX = 0.25 * area * (1.0 - q / 3.0);\r\n const inertiaYY1 = 0.25 * area * (1.0 + q);\r\n const inertiaYY = inertiaYY1 - 4.0 * s6 / (9.0 * area);\r\n const productXX = inertiaYY;\r\n const productYY = inertiaXX;\r\n const centerToCentroid = 4.0 * s * s * s / (3.0 * (sweepRadians - s1));\r\n const midRadians = arc.sweep.fractionToRadians(0.5);\r\n const centralPlane = arc.radiansToRotatedBasis(midRadians);\r\n const centroid = centralPlane.origin.plusScaled(centralPlane.vectorU, centerToCentroid);\r\n momentData.accumulateXYProductsInCentroidalFrame(\r\n productXX, 0.0, productYY, area, centroid, centralPlane.vectorU, centralPlane.vectorV,\r\n );\r\n const pointB = arc.fractionToPoint(0.0);\r\n const pointC = arc.fractionToPoint(1.0);\r\n momentData.accumulateTriangleMomentsXY(undefined, pointB, pointC);\r\n }\r\n /** Accumulate integrals over the (triangular) areas from the origin to each line segment. */\r\n public override handleLineString3d(ls: LineString3d): void {\r\n const momentData = this._activeMomentData!;\r\n momentData.accumulateTriangleToLineStringMomentsXY(undefined, ls.packedPoints);\r\n }\r\n /** Accumulate integrals over the (triangular) area from the origin to this line segment. */\r\n public override handleLineSegment3d(segment: LineSegment3d): void {\r\n const momentData = this._activeMomentData!;\r\n segment.startPoint(this._point0);\r\n segment.endPoint(this._point1);\r\n momentData.accumulateTriangleMomentsXY(undefined, this._point0, this._point1);\r\n }\r\n /** Accumulate integrals from origin to all primitives in the chain. */\r\n public override handleLoop(loop: Loop): MomentData | undefined {\r\n const momentData = this._activeMomentData = MomentData.create();\r\n momentData.needOrigin = false;\r\n for (const child of loop.children)\r\n child.dispatchToGeometryHandler(this);\r\n this._activeMomentData = undefined;\r\n return momentData;\r\n }\r\n private handleAnyRegion(region: AnyRegion): MomentData | undefined {\r\n const summedMoments = MomentData.create();\r\n // guarantee there is no overlapping children\r\n const merged = RegionOps.regionBooleanXY(region, undefined, RegionBinaryOpType.Union);\r\n if (merged) {\r\n for (const child of merged.children) {\r\n const childMoments = child.dispatchToGeometryHandler(this);\r\n if (childMoments) {\r\n const sign0 = childMoments.signFactor(1.0);\r\n summedMoments.accumulateProducts(childMoments, sign0);\r\n }\r\n }\r\n } else {\r\n return undefined;\r\n }\r\n return summedMoments;\r\n }\r\n /** Accumulate integrals from origin to the components of the parity region. */\r\n public override handleParityRegion(region: ParityRegion): MomentData | undefined {\r\n return this.handleAnyRegion(region);\r\n }\r\n /** Accumulate integrals from origin to the components of the union region. */\r\n public override handleUnionRegion(region: UnionRegion): MomentData | undefined {\r\n return this.handleAnyRegion(region);\r\n }\r\n\r\n private _strokeOptions?: StrokeOptions; // TODO: expose to callers in RegionOps\r\n private getStrokeOptions(): StrokeOptions {\r\n if (this._strokeOptions)\r\n return this._strokeOptions;\r\n const options = StrokeOptions.createForCurves();\r\n // this is unusually fine for stroking, but appropriate for sum.\r\n options.angleTol = Angle.createDegrees(5.0);\r\n this._strokeOptions = options;\r\n return options;\r\n }\r\n /**\r\n * Handle a single curve primitive (not loop).\r\n * * Stroke the curve and accumulate stroke array.\r\n */\r\n public handleCurvePrimitive(cp: CurvePrimitive) {\r\n const strokes = LineString3d.create();\r\n const options = this.getStrokeOptions();\r\n cp.emitStrokes(strokes, options);\r\n this.handleLineString3d(strokes);\r\n }\r\n /** Handle strongly typed BSplineCurve3d as generic curve primitive. */\r\n public override handleBSplineCurve3d(g: BSplineCurve3d) {\r\n return this.handleCurvePrimitive(g);\r\n }\r\n /** Handle strongly typed BSplineCurve3dH as generic curve primitive. */\r\n public override handleBSplineCurve3dH(g: BSplineCurve3dH) {\r\n return this.handleCurvePrimitive(g);\r\n }\r\n /** Handle strongly typed TransitionSpiral as generic curve primitive. */\r\n public override handleTransitionSpiral(g: TransitionSpiral3d) {\r\n return this.handleCurvePrimitive(g);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"RegionMomentsXY.js","sourceRoot":"","sources":["../../../src/curve/RegionMomentsXY.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 Curve\r\n */\r\n\r\n// import { Geometry, Angle, AngleSweep } from \"../Geometry\";\r\n\r\nimport { BSplineCurve3d } from \"../bspline/BSplineCurve\";\r\nimport { BSplineCurve3dH } from \"../bspline/BSplineCurve3dH\";\r\nimport { Angle } from \"../geometry3d/Angle\";\r\nimport { NullGeometryHandler } from \"../geometry3d/GeometryHandler\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { MomentData } from \"../geometry4d/MomentData\";\r\nimport { Arc3d } from \"./Arc3d\";\r\nimport { CurvePrimitive } from \"./CurvePrimitive\";\r\nimport { AnyRegion } from \"./CurveTypes\";\r\nimport { LineSegment3d } from \"./LineSegment3d\";\r\nimport { LineString3d } from \"./LineString3d\";\r\nimport { Loop } from \"./Loop\";\r\nimport { ParityRegion } from \"./ParityRegion\";\r\nimport { RegionBinaryOpType, RegionOps } from \"./RegionOps\";\r\nimport { TransitionSpiral3d } from \"./spiral/TransitionSpiral3d\";\r\nimport { StrokeOptions } from \"./StrokeOptions\";\r\nimport { UnionRegion } from \"./UnionRegion\";\r\n\r\n/**\r\n * Implementation class for computing XY area moments.\r\n * @internal\r\n */\r\nexport class RegionMomentsXY extends NullGeometryHandler {\r\n private _activeMomentData?: MomentData;\r\n private _point0 = Point3d.create();\r\n private _point1 = Point3d.create();\r\n /**\r\n * Accumulate (independent) integrations over:\r\n * * The area between the arc and the chord connecting its endpoints.\r\n * * The triangle with vertices: origin, arc start, arc end.\r\n */\r\n public override handleArc3d(arc: Arc3d): void {\r\n const momentData = this._activeMomentData!;\r\n const sweepRadians = arc.sweep.sweepRadians;\r\n const alphaRadians = sweepRadians * 0.5;\r\n let s = Math.sin(alphaRadians);\r\n let c = Math.cos(alphaRadians);\r\n let s1 = Math.sin(sweepRadians);\r\n if (Angle.isFullCircleRadians(sweepRadians)) {\r\n s = 0.0;\r\n c = -1.0;\r\n s1 = 0.0;\r\n }\r\n const q = 2 * s * s * s * c / (alphaRadians - s * c);\r\n const s3 = s * s * s;\r\n const s6 = s3 * s3;\r\n const area = 0.5 * (sweepRadians - s1);\r\n const inertiaXX = 0.25 * area * (1.0 - q / 3.0);\r\n const inertiaYY1 = 0.25 * area * (1.0 + q);\r\n const inertiaYY = inertiaYY1 - 4.0 * s6 / (9.0 * area);\r\n const productXX = inertiaYY;\r\n const productYY = inertiaXX;\r\n const centerToCentroid = 4.0 * s * s * s / (3.0 * (sweepRadians - s1));\r\n const midRadians = arc.sweep.fractionToRadians(0.5);\r\n const centralPlane = arc.radiansToRotatedBasis(midRadians);\r\n const centroid = centralPlane.origin.plusScaled(centralPlane.vectorU, centerToCentroid);\r\n momentData.accumulateXYProductsInCentroidalFrame(\r\n productXX, 0.0, productYY, area, centroid, centralPlane.vectorU, centralPlane.vectorV,\r\n );\r\n const pointB = arc.fractionToPoint(0.0);\r\n const pointC = arc.fractionToPoint(1.0);\r\n momentData.accumulateTriangleMomentsXY(undefined, pointB, pointC);\r\n }\r\n /** Accumulate integrals over the (triangular) areas from the origin to each line segment. */\r\n public override handleLineString3d(ls: LineString3d): void {\r\n const momentData = this._activeMomentData!;\r\n momentData.accumulateTriangleToLineStringMomentsXY(undefined, ls.packedPoints);\r\n }\r\n /** Accumulate integrals over the (triangular) area from the origin to this line segment. */\r\n public override handleLineSegment3d(segment: LineSegment3d): void {\r\n const momentData = this._activeMomentData!;\r\n segment.startPoint(this._point0);\r\n segment.endPoint(this._point1);\r\n momentData.accumulateTriangleMomentsXY(undefined, this._point0, this._point1);\r\n }\r\n /** Accumulate integrals from origin to all primitives in the chain. */\r\n public override handleLoop(loop: Loop): MomentData | undefined {\r\n const momentData = this._activeMomentData = MomentData.create();\r\n momentData.needOrigin = false;\r\n for (const child of loop.children)\r\n child.dispatchToGeometryHandler(this);\r\n this._activeMomentData = undefined;\r\n return momentData;\r\n }\r\n private handleAnyRegion(region: AnyRegion): MomentData | undefined {\r\n // guarantee there is no overlapping children\r\n const merged = RegionOps.regionBooleanXY(region, undefined, RegionBinaryOpType.Union);\r\n if (!merged)\r\n return undefined;\r\n if (merged instanceof Loop)\r\n return this.handleLoop(merged);\r\n const summedMoments = MomentData.create();\r\n for (const child of merged.children) {\r\n const childMoments = child.dispatchToGeometryHandler(this);\r\n if (childMoments) {\r\n const sign0 = childMoments.signFactor(1.0);\r\n summedMoments.accumulateProducts(childMoments, sign0);\r\n }\r\n }\r\n return summedMoments;\r\n }\r\n /** Accumulate integrals from origin to the components of the parity region. */\r\n public override handleParityRegion(region: ParityRegion): MomentData | undefined {\r\n return this.handleAnyRegion(region);\r\n }\r\n /** Accumulate integrals from origin to the components of the union region. */\r\n public override handleUnionRegion(region: UnionRegion): MomentData | undefined {\r\n return this.handleAnyRegion(region);\r\n }\r\n\r\n private _strokeOptions?: StrokeOptions; // TODO: expose to callers in RegionOps\r\n private getStrokeOptions(): StrokeOptions {\r\n if (this._strokeOptions)\r\n return this._strokeOptions;\r\n const options = StrokeOptions.createForCurves();\r\n // this is unusually fine for stroking, but appropriate for sum.\r\n options.angleTol = Angle.createDegrees(5.0);\r\n this._strokeOptions = options;\r\n return options;\r\n }\r\n /**\r\n * Handle a single curve primitive (not loop).\r\n * * Stroke the curve and accumulate stroke array.\r\n */\r\n public handleCurvePrimitive(cp: CurvePrimitive): void {\r\n const strokes = LineString3d.create();\r\n const options = this.getStrokeOptions();\r\n cp.emitStrokes(strokes, options);\r\n this.handleLineString3d(strokes);\r\n }\r\n /** Handle strongly typed BSplineCurve3d as generic curve primitive. */\r\n public override handleBSplineCurve3d(g: BSplineCurve3d): void {\r\n this.handleCurvePrimitive(g);\r\n }\r\n /** Handle strongly typed BSplineCurve3dH as generic curve primitive. */\r\n public override handleBSplineCurve3dH(g: BSplineCurve3dH): void {\r\n this.handleCurvePrimitive(g);\r\n }\r\n /** Handle strongly typed TransitionSpiral as generic curve primitive. */\r\n public override handleTransitionSpiral(g: TransitionSpiral3d): void {\r\n this.handleCurvePrimitive(g);\r\n }\r\n}\r\n"]}
|
|
@@ -138,6 +138,18 @@ export declare class RegionOps {
|
|
|
138
138
|
* @param triangulate whether to triangulate the result
|
|
139
139
|
*/
|
|
140
140
|
static polygonXYAreaDifferenceLoopsToPolyface(loopsA: MultiLineStringDataVariant, loopsB: MultiLineStringDataVariant, triangulate?: boolean): Polyface | undefined;
|
|
141
|
+
/**
|
|
142
|
+
* Simplify the type of the region by stripping redundant parent(s).
|
|
143
|
+
* * No Boolean operations are performed.
|
|
144
|
+
* * Invalid inputs (such as childless regions) are not corrected.
|
|
145
|
+
* @param region region to simplify
|
|
146
|
+
* @returns
|
|
147
|
+
* * For a [[UnionRegion]] with exactly one child, return it if it is a [[Loop]],
|
|
148
|
+
* or if it is a [[ParityRegion]] with multiple children, otherwise return the `ParityRegion`'s `Loop`.
|
|
149
|
+
* * For a `ParityRegion` with exactly one `Loop`, return it.
|
|
150
|
+
* * All other inputs returned unchanged.
|
|
151
|
+
*/
|
|
152
|
+
static simplifyRegionType(region: AnyRegion): AnyRegion;
|
|
141
153
|
/**
|
|
142
154
|
* Return areas defined by a boolean operation.
|
|
143
155
|
* @note For best results, input regions should have correctly oriented loops. See [[sortOuterAndHoleLoopsXY]].
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RegionOps.d.ts","sourceRoot":"","sources":["../../../src/curve/RegionOps.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"RegionOps.d.ts","sourceRoot":"","sources":["../../../src/curve/RegionOps.ts"],"names":[],"mappings":"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"}
|
|
@@ -284,6 +284,28 @@ class RegionOps {
|
|
|
284
284
|
const graph = RegionOpsClassificationSweeps_1.RegionOpsFaceToFaceSearch.doPolygonBoolean(loopsA, loopsB, (inA, inB) => (inA && !inB), this._graphCheckPointFunction);
|
|
285
285
|
return this.finishGraphToPolyface(graph, triangulate);
|
|
286
286
|
}
|
|
287
|
+
/**
|
|
288
|
+
* Simplify the type of the region by stripping redundant parent(s).
|
|
289
|
+
* * No Boolean operations are performed.
|
|
290
|
+
* * Invalid inputs (such as childless regions) are not corrected.
|
|
291
|
+
* @param region region to simplify
|
|
292
|
+
* @returns
|
|
293
|
+
* * For a [[UnionRegion]] with exactly one child, return it if it is a [[Loop]],
|
|
294
|
+
* or if it is a [[ParityRegion]] with multiple children, otherwise return the `ParityRegion`'s `Loop`.
|
|
295
|
+
* * For a `ParityRegion` with exactly one `Loop`, return it.
|
|
296
|
+
* * All other inputs returned unchanged.
|
|
297
|
+
*/
|
|
298
|
+
static simplifyRegionType(region) {
|
|
299
|
+
if (region instanceof UnionRegion_1.UnionRegion) {
|
|
300
|
+
if (region.children.length === 1)
|
|
301
|
+
return this.simplifyRegionType(region.children[0]);
|
|
302
|
+
}
|
|
303
|
+
else if (region instanceof ParityRegion_1.ParityRegion) {
|
|
304
|
+
if (region.children.length === 1)
|
|
305
|
+
return region.children[0];
|
|
306
|
+
}
|
|
307
|
+
return region;
|
|
308
|
+
}
|
|
287
309
|
/**
|
|
288
310
|
* Return areas defined by a boolean operation.
|
|
289
311
|
* @note For best results, input regions should have correctly oriented loops. See [[sortOuterAndHoleLoopsXY]].
|
|
@@ -297,8 +319,6 @@ class RegionOps {
|
|
|
297
319
|
* to connect interior loops to exterior loops.
|
|
298
320
|
*/
|
|
299
321
|
static regionBooleanXY(loopsA, loopsB, operation, mergeTolerance = Geometry_1.Geometry.smallMetricDistance) {
|
|
300
|
-
// Always return UnionRegion for now, but keep return type as AnyRegion.
|
|
301
|
-
// In the future, we might return the *simplest* region type.
|
|
302
322
|
const result = UnionRegion_1.UnionRegion.create();
|
|
303
323
|
const context = RegionOpsClassificationSweeps_1.RegionBooleanContext.create(RegionOpsClassificationSweeps_1.RegionGroupOpType.Union, RegionOpsClassificationSweeps_1.RegionGroupOpType.Union);
|
|
304
324
|
context.addMembers(loopsA, loopsB);
|
|
@@ -317,7 +337,7 @@ class RegionOps {
|
|
|
317
337
|
result.tryAddChild(loop);
|
|
318
338
|
}
|
|
319
339
|
});
|
|
320
|
-
return result;
|
|
340
|
+
return result ? this.simplifyRegionType(result) : undefined;
|
|
321
341
|
}
|
|
322
342
|
/**
|
|
323
343
|
* Return a polyface whose facets are a boolean operation between the input regions.
|