@metamesh/modeling 0.13.0 → 0.14.0
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 +13 -0
- package/README.md +52 -9
- package/dist/api/engine.d.ts +3 -3
- package/dist/api/geometry.d.ts +521 -185
- package/dist/api/index.d.ts +414 -145
- package/dist/api/text.d.ts +3 -3
- package/dist/docs/guides/concepts.md +114 -11
- package/dist/docs/guides/fonts.md +8 -0
- package/dist/docs/guides/fundamentals.md +4 -2
- package/dist/docs/guides/generation.md +6 -4
- package/dist/docs/guides/hosting.md +7 -4
- package/dist/docs/guides/recipes.md +52 -2
- package/dist/docs/manifest.json +1246 -394
- package/dist/docs/reference/engine/Export3mfOptions.md +1 -1
- package/dist/docs/reference/engine/ExportMeshPart.md +1 -1
- package/dist/docs/reference/engine/GenerationOptions.md +1 -1
- package/dist/docs/reference/engine/GeometryResource.md +1 -1
- package/dist/docs/reference/engine/ModelDependencies.md +1 -1
- package/dist/docs/reference/engine/ModelEngine.md +1 -1
- package/dist/docs/reference/engine/ModelEngineOptions.md +1 -1
- package/dist/docs/reference/engine/ModelSession.md +1 -1
- package/dist/docs/reference/engine/ModelSnapshot.md +1 -1
- package/dist/docs/reference/engine/SessionOptions.md +1 -1
- package/dist/docs/reference/engine/SnapshotPart.md +3 -3
- package/dist/docs/reference/engine/categories/host-lifecycle.md +1 -1
- package/dist/docs/reference/engine/createModelEngine.md +1 -1
- package/dist/docs/reference/engine/defaultModelingLimits.md +1 -1
- package/dist/docs/reference/engine/modelingWasmUrl.md +1 -1
- package/dist/docs/reference/engine/validateModel.md +1 -1
- package/dist/docs/reference/engine.md +1 -1
- package/dist/docs/reference/geometry/AcmeThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +14 -1
- package/dist/docs/reference/geometry/Anchor3.md +9 -5
- package/dist/docs/reference/geometry/ArcCurve2.md +3 -3
- package/dist/docs/reference/geometry/ArcCurve3.md +5 -5
- package/dist/docs/reference/geometry/AttachTransformOptions.md +5 -1
- package/dist/docs/reference/geometry/AxisAngleRotation3.md +6 -1
- package/dist/docs/reference/geometry/Bounds2.md +4 -4
- package/dist/docs/reference/geometry/Bounds3.md +4 -4
- package/dist/docs/reference/geometry/BoundsFit2.md +3 -3
- package/dist/docs/reference/geometry/BoundsFit3.md +3 -3
- package/dist/docs/reference/geometry/BoundsFitOptions.md +1 -1
- package/dist/docs/reference/geometry/BoundsFromSizeOptions.md +1 -1
- package/dist/docs/reference/geometry/BoxAnchorFace.md +8 -1
- package/dist/docs/reference/geometry/BoxAnchorOptions.md +8 -4
- package/dist/docs/reference/geometry/BoxEdge.md +1 -1
- package/dist/docs/reference/geometry/BoxEdgeSelection.md +1 -1
- package/dist/docs/reference/geometry/BoxEdgeTreatments.md +1 -1
- package/dist/docs/reference/geometry/BoxOptions.md +3 -3
- package/dist/docs/reference/geometry/ButtressPressureFlankSide.md +1 -1
- package/dist/docs/reference/geometry/ButtressThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/CircleContourOptions.md +1 -1
- package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +1 -1
- package/dist/docs/reference/geometry/CircularResolutionOptions.md +107 -0
- package/dist/docs/reference/geometry/ClearanceHoleDimensions.md +1 -1
- package/dist/docs/reference/geometry/ClearanceHoleFit.md +1 -1
- package/dist/docs/reference/geometry/ClosestPointOnPathOptions.md +34 -0
- package/dist/docs/reference/geometry/ClosestPointOnPathResult.md +65 -0
- package/dist/docs/reference/geometry/CompensatedThreadDiameters.md +1 -1
- package/dist/docs/reference/geometry/Contour.md +3 -3
- package/dist/docs/reference/geometry/ContourCurve.md +1 -1
- package/dist/docs/reference/geometry/ContourPoint.md +1 -1
- package/dist/docs/reference/geometry/ContourSegment.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingComponent.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingContour.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingProfile.md +1 -1
- package/dist/docs/reference/geometry/CorrespondingProfileStation.md +1 -1
- package/dist/docs/reference/geometry/CubicBezierCurve2.md +6 -6
- package/dist/docs/reference/geometry/CubicBezierCurve3.md +6 -6
- package/dist/docs/reference/geometry/Curve2.md +1 -1
- package/dist/docs/reference/geometry/Curve3.md +1 -1
- package/dist/docs/reference/geometry/CurveSamplingOptions.md +1 -1
- package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +3 -3
- package/dist/docs/reference/geometry/CylinderAnchorFace.md +8 -1
- package/dist/docs/reference/geometry/CylinderAnchorOptions.md +7 -3
- package/dist/docs/reference/geometry/CylinderOptions.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearDimensions.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearMeshKind.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearOutlineOptions.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearPairDimensions.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearPairMotionOptions.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearPairMotionReport.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearPairSpec.md +1 -1
- package/dist/docs/reference/geometry/CylindricalGearSpec.md +1 -1
- package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +1 -1
- package/dist/docs/reference/geometry/EdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/EllipseContourOptions.md +3 -3
- package/dist/docs/reference/geometry/EndTreatments.md +1 -1
- package/dist/docs/reference/geometry/ExtrudeOptions.md +3 -3
- package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +3 -3
- package/dist/docs/reference/geometry/FittedTextLayout.md +1 -1
- package/dist/docs/reference/geometry/Frame3.md +6 -6
- package/dist/docs/reference/geometry/GeometryError.md +1 -1
- package/dist/docs/reference/geometry/GeometryErrorCode.md +1 -1
- package/dist/docs/reference/geometry/GeometryErrorContext.md +1 -1
- package/dist/docs/reference/geometry/GeometryResolution.md +10 -1
- package/dist/docs/reference/geometry/GeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/geometry/GeometryToleranceOptions.md +1 -1
- package/dist/docs/reference/geometry/GridPatternOptions.md +4 -4
- package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +1 -1
- package/dist/docs/reference/geometry/HeightfieldOptions.md +5 -5
- package/dist/docs/reference/geometry/HeightfieldPreflight.md +1 -1
- package/dist/docs/reference/geometry/HelicalThreadRidgeMeshOptions.md +1 -1
- package/dist/docs/reference/geometry/HelicalThreadSolidMeshOptions.md +1 -1
- package/dist/docs/reference/geometry/HelicalThreadSolidMeshPreflight.md +1 -1
- package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +7 -3
- package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +1 -1
- package/dist/docs/reference/geometry/LineCurve2.md +4 -4
- package/dist/docs/reference/geometry/LineCurve3.md +4 -4
- package/dist/docs/reference/geometry/LinearPatternOptions.md +3 -3
- package/dist/docs/reference/geometry/LoftCorrespondence.md +1 -1
- package/dist/docs/reference/geometry/LoftMeshStation.md +1 -1
- package/dist/docs/reference/geometry/LoftOptions.md +1 -1
- package/dist/docs/reference/geometry/LoftPlacement.md +1 -1
- package/dist/docs/reference/geometry/METRIC_FASTENER_STANDARDS.md +1 -1
- package/dist/docs/reference/geometry/MatchProfilesOptions.md +1 -1
- package/dist/docs/reference/geometry/MetricFastenerSize.md +1 -1
- package/dist/docs/reference/geometry/MetricFastenerStandard.md +1 -1
- package/dist/docs/reference/geometry/MetricHexNutDimensions.md +1 -1
- package/dist/docs/reference/geometry/MetricSocketCapHeadDimensions.md +1 -1
- package/dist/docs/reference/geometry/ModelingLimits.md +1 -1
- package/dist/docs/reference/geometry/PRINTABLE_THREAD_FIT_POLICIES.md +1 -1
- package/dist/docs/reference/geometry/Path2.md +3 -3
- package/dist/docs/reference/geometry/Path3.md +3 -3
- package/dist/docs/reference/geometry/PathFrame.md +5 -5
- package/dist/docs/reference/geometry/PathNormalGuide.md +5 -5
- package/dist/docs/reference/geometry/PathPatternOptions.md +1 -1
- package/dist/docs/reference/geometry/PathPlacement.md +4 -4
- package/dist/docs/reference/geometry/Pivot2Options.md +26 -0
- package/dist/docs/reference/geometry/Pivot3Options.md +26 -0
- package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +1 -1
- package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +1 -1
- package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +1 -1
- package/dist/docs/reference/geometry/PlanarPatchQuality.md +3 -3
- package/dist/docs/reference/geometry/{Polygon.md → PolygonData.md} +2 -2
- package/dist/docs/reference/geometry/PolylineResamplingOptions.md +1 -1
- package/dist/docs/reference/geometry/PrimitivePlacement.md +1 -1
- package/dist/docs/reference/geometry/PrimitivePlacementOptions.md +1 -1
- package/dist/docs/reference/geometry/PrintableThreadFit.md +1 -1
- package/dist/docs/reference/geometry/PrintableThreadFitPolicy.md +1 -1
- package/dist/docs/reference/geometry/Profile.md +1 -1
- package/dist/docs/reference/geometry/ProfileComponent2.md +1 -1
- package/dist/docs/reference/geometry/ProfileContour2.md +1 -1
- package/dist/docs/reference/geometry/ProfileSpan2.md +3 -3
- package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +3 -3
- package/dist/docs/reference/geometry/RackPitchDimensions.md +1 -1
- package/dist/docs/reference/geometry/RackPitchSpec.md +1 -1
- package/dist/docs/reference/geometry/RadialPatternOptions.md +4 -4
- package/dist/docs/reference/geometry/RadialSizing.md +1 -1
- package/dist/docs/reference/geometry/RadialSizingOptions.md +1 -1
- package/dist/docs/reference/geometry/RectangleContourOptions.md +3 -3
- package/dist/docs/reference/geometry/RectangleCornerTreatment.md +1 -1
- package/dist/docs/reference/geometry/RectangleCornerTreatments.md +1 -1
- package/dist/docs/reference/geometry/RectangleProfileOptions.md +3 -3
- package/dist/docs/reference/geometry/RegionData.md +14 -0
- package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +1 -1
- package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +1 -1
- package/dist/docs/reference/geometry/RevolveOptions.md +1 -1
- package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/RowLayoutOptions.md +1 -1
- package/dist/docs/reference/geometry/SampleContourOptions.md +1 -1
- package/dist/docs/reference/geometry/SampleHelixOptions.md +1 -1
- package/dist/docs/reference/geometry/SampleSideProfileOptions.md +1 -1
- package/dist/docs/reference/geometry/SampledCurve2.md +4 -4
- package/dist/docs/reference/geometry/SampledCurve3.md +4 -4
- package/dist/docs/reference/geometry/SampledThreadHelices.md +1 -1
- package/dist/docs/reference/geometry/SideProfileCurve.md +1 -1
- package/dist/docs/reference/geometry/SideProfilePoint.md +1 -1
- package/dist/docs/reference/geometry/SideProfileSegment.md +1 -1
- package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +1 -1
- package/dist/docs/reference/geometry/SolidMeshValidationOptions.md +1 -1
- package/dist/docs/reference/geometry/SphereOptions.md +1 -1
- package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/StrokePathCap.md +1 -1
- package/dist/docs/reference/geometry/StrokePathJoin.md +1 -1
- package/dist/docs/reference/geometry/StrokePathRegionOptions.md +2 -2
- package/dist/docs/reference/geometry/SvgImportOptions.md +1 -1
- package/dist/docs/reference/geometry/SvgRegionPreflight.md +3 -3
- package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +1 -1
- package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +1 -1
- package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +1 -1
- package/dist/docs/reference/geometry/SweepOptions.md +3 -3
- package/dist/docs/reference/geometry/SweepOrientation.md +7 -7
- package/dist/docs/reference/geometry/ThreadBevelOptions.md +1 -1
- package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +1 -1
- package/dist/docs/reference/geometry/ThreadCompensationOptions.md +1 -1
- package/dist/docs/reference/geometry/ThreadEndStyle.md +1 -1
- package/dist/docs/reference/geometry/ThreadEndTreatmentOptions.md +1 -1
- package/dist/docs/reference/geometry/ThreadHandedness.md +1 -1
- package/dist/docs/reference/geometry/ThreadHelixOptions.md +1 -1
- package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +1 -1
- package/dist/docs/reference/geometry/ThreadLeadInShape.md +1 -1
- package/dist/docs/reference/geometry/ThreadProfile.md +3 -3
- package/dist/docs/reference/geometry/ThreadProfileBaseSpec.md +1 -1
- package/dist/docs/reference/geometry/ThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/ThreadRole.md +1 -1
- package/dist/docs/reference/geometry/ThreadedNutBevel.md +1 -1
- package/dist/docs/reference/geometry/ThreadedNutOptions.md +1 -1
- package/dist/docs/reference/geometry/ThreadedNutPreflight.md +1 -1
- package/dist/docs/reference/geometry/ThreadedNutShape.md +1 -1
- package/dist/docs/reference/geometry/ThreadedRodOptions.md +1 -1
- package/dist/docs/reference/geometry/TorusOptions.md +1 -1
- package/dist/docs/reference/geometry/Transform2-type.md +255 -0
- package/dist/docs/reference/geometry/Transform2Input.md +19 -0
- package/dist/docs/reference/geometry/Transform2Matrix.md +14 -0
- package/dist/docs/reference/geometry/Transform3-type.md +295 -0
- package/dist/docs/reference/geometry/Transform3Input.md +19 -0
- package/dist/docs/reference/geometry/Transform3Matrix.md +17 -0
- package/dist/docs/reference/geometry/TrapezoidalThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/TriangleMesh.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshAnalysisOptions.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshMeasurements.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshQualityOptions.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshSignature.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshSignatureTolerances.md +1 -1
- package/dist/docs/reference/geometry/TriangleMeshValidationOptions.md +1 -1
- package/dist/docs/reference/geometry/TriangularThreadProfileSpec.md +1 -1
- package/dist/docs/reference/geometry/TubeOptions.md +1 -1
- package/dist/docs/reference/geometry/Vector2-type.md +269 -0
- package/dist/docs/reference/geometry/Vector2Input.md +19 -0
- package/dist/docs/reference/geometry/Vector2Tuple.md +14 -0
- package/dist/docs/reference/geometry/Vector3-type.md +281 -0
- package/dist/docs/reference/geometry/Vector3Input.md +19 -0
- package/dist/docs/reference/geometry/Vector3Tuple.md +14 -0
- package/dist/docs/reference/geometry/VectorTextArcBaseline.md +1 -1
- package/dist/docs/reference/geometry/VectorTextLayout.md +1 -1
- package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +1 -1
- package/dist/docs/reference/geometry/VectorTextMetrics.md +1 -1
- package/dist/docs/reference/geometry/VectorTextOptions.md +1 -1
- package/dist/docs/reference/geometry/add2.md +36 -0
- package/dist/docs/reference/geometry/add3.md +10 -6
- package/dist/docs/reference/geometry/analyzeTriangleMesh.md +1 -1
- package/dist/docs/reference/geometry/analyzeTriangleMeshQuality.md +1 -1
- package/dist/docs/reference/geometry/anchorFrame3.md +1 -1
- package/dist/docs/reference/geometry/applyTransformDirection3.md +11 -7
- package/dist/docs/reference/geometry/applyTransformPoint3.md +11 -7
- package/dist/docs/reference/geometry/attachTransform.md +8 -4
- package/dist/docs/reference/geometry/boundsCenter.md +7 -7
- package/dist/docs/reference/geometry/boundsFromSize.md +7 -7
- package/dist/docs/reference/geometry/boundsSize.md +7 -7
- package/dist/docs/reference/geometry/boxAnchor3.md +7 -3
- package/dist/docs/reference/geometry/buildHelicalThreadRidgeMesh.md +1 -1
- package/dist/docs/reference/geometry/buildHelicalThreadSolidMesh.md +1 -1
- package/dist/docs/reference/geometry/categories/bounds-layout.md +1 -1
- package/dist/docs/reference/geometry/categories/curves-paths.md +6 -3
- package/dist/docs/reference/geometry/categories/mechanical.md +1 -1
- package/dist/docs/reference/geometry/categories/meshes.md +1 -1
- package/dist/docs/reference/geometry/categories/pattern-placement.md +2 -2
- package/dist/docs/reference/geometry/categories/primitive-options.md +1 -1
- package/dist/docs/reference/geometry/categories/profiles-regions.md +6 -6
- package/dist/docs/reference/geometry/categories/resolution-errors.md +3 -2
- package/dist/docs/reference/geometry/categories/transforms-math.md +37 -8
- package/dist/docs/reference/geometry/categories/vector-import.md +2 -2
- package/dist/docs/reference/geometry/circleContour.md +1 -1
- package/dist/docs/reference/geometry/closeToAxis.md +4 -4
- package/dist/docs/reference/geometry/closestPointOnPath.md +110 -0
- package/dist/docs/reference/geometry/compensateThreadDiameters.md +1 -1
- package/dist/docs/reference/geometry/compensateThreadProfileAxially.md +1 -1
- package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +1 -1
- package/dist/docs/reference/geometry/composeTransform3.md +10 -6
- package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +5 -5
- package/dist/docs/reference/geometry/computeParallelTransportFrames.md +5 -5
- package/dist/docs/reference/geometry/computeTriangleMeshCentroid.md +4 -4
- package/dist/docs/reference/geometry/containsBounds.md +1 -1
- package/dist/docs/reference/geometry/contourContainsPoint.md +4 -4
- package/dist/docs/reference/geometry/createAnchor3.md +10 -6
- package/dist/docs/reference/geometry/createThreadProfile.md +1 -1
- package/dist/docs/reference/geometry/createTriangleMeshSignature.md +1 -1
- package/dist/docs/reference/geometry/cross2.md +36 -0
- package/dist/docs/reference/geometry/cross3.md +10 -6
- package/dist/docs/reference/geometry/cumulativePathLengths.md +4 -4
- package/dist/docs/reference/geometry/cylinderAnchor3.md +6 -2
- package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/geometry/distance2.md +36 -0
- package/dist/docs/reference/geometry/distance3.md +36 -0
- package/dist/docs/reference/geometry/distributeAlongPath.md +4 -4
- package/dist/docs/reference/geometry/dot2.md +36 -0
- package/dist/docs/reference/geometry/dot3.md +9 -5
- package/dist/docs/reference/geometry/ellipseContour.md +1 -1
- package/dist/docs/reference/geometry/eulerTransform3.md +10 -6
- package/dist/docs/reference/geometry/extrudeMesh.md +2 -2
- package/dist/docs/reference/geometry/fitBounds.md +1 -1
- package/dist/docs/reference/geometry/fitTextLayout.md +1 -1
- package/dist/docs/reference/geometry/frameTransform3.md +8 -4
- package/dist/docs/reference/geometry/getMetricClearanceHole.md +1 -1
- package/dist/docs/reference/geometry/getMetricFastenerStandard.md +1 -1
- package/dist/docs/reference/geometry/gridPatternTransforms.md +4 -4
- package/dist/docs/reference/geometry/heightfieldMesh.md +1 -1
- package/dist/docs/reference/geometry/inverseTransform3.md +9 -5
- package/dist/docs/reference/geometry/isGeometryError.md +1 -1
- package/dist/docs/reference/geometry/joinTriangleMeshes.md +1 -1
- package/dist/docs/reference/geometry/layoutRow.md +4 -4
- package/dist/docs/reference/geometry/length2.md +30 -0
- package/dist/docs/reference/geometry/length3.md +8 -4
- package/dist/docs/reference/geometry/lerp2.md +42 -0
- package/dist/docs/reference/geometry/lerp3.md +10 -6
- package/dist/docs/reference/geometry/linearPatternTransforms.md +4 -4
- package/dist/docs/reference/geometry/loftMesh.md +1 -1
- package/dist/docs/reference/geometry/matchProfiles.md +1 -1
- package/dist/docs/reference/geometry/measureInternalCylindricalGearPairMotion.md +3 -2
- package/dist/docs/reference/geometry/measureTriangleMesh.md +1 -1
- package/dist/docs/reference/geometry/meshBounds.md +1 -1
- package/dist/docs/reference/geometry/minimumCylindricalGearToothCountWithoutUndercut.md +1 -1
- package/dist/docs/reference/geometry/normalize2.md +36 -0
- package/dist/docs/reference/geometry/normalize3.md +10 -6
- package/dist/docs/reference/geometry/normalizeContour.md +4 -4
- package/dist/docs/reference/geometry/normalizePolygon.md +5 -5
- package/dist/docs/reference/geometry/normalizeRegion.md +5 -5
- package/dist/docs/reference/geometry/optimizePlanarPatches.md +1 -1
- package/dist/docs/reference/geometry/pathLength.md +4 -4
- package/dist/docs/reference/geometry/pathPatternTransforms.md +6 -6
- package/dist/docs/reference/geometry/preflightHeightfield.md +1 -1
- package/dist/docs/reference/geometry/preflightHelicalThreadSolidMesh.md +1 -1
- package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +1 -1
- package/dist/docs/reference/geometry/preflightSvgRegion.md +1 -1
- package/dist/docs/reference/geometry/preflightThreadedNut.md +1 -1
- package/dist/docs/reference/geometry/preflightThreadedRod.md +1 -1
- package/dist/docs/reference/geometry/projectOntoPlane3.md +10 -6
- package/dist/docs/reference/geometry/radialPatternTransforms.md +6 -6
- package/dist/docs/reference/geometry/rectangleContour.md +2 -2
- package/dist/docs/reference/geometry/rectangleProfile.md +2 -2
- package/dist/docs/reference/geometry/regionArea.md +4 -4
- package/dist/docs/reference/geometry/regionBounds.md +4 -4
- package/dist/docs/reference/geometry/regularPolygonContour.md +4 -4
- package/dist/docs/reference/geometry/resamplePolyline2.md +4 -4
- package/dist/docs/reference/geometry/resamplePolyline3.md +4 -4
- package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +5 -1
- package/dist/docs/reference/geometry/resolveArcSegments.md +4 -4
- package/dist/docs/reference/geometry/resolveCircularSegments.md +6 -5
- package/dist/docs/reference/geometry/resolveCylindricalGear.md +1 -1
- package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +1 -1
- package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +5 -5
- package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/geometry/resolveGeometryTolerance.md +1 -1
- package/dist/docs/reference/geometry/resolvePrintableThreadFitPolicy.md +1 -1
- package/dist/docs/reference/geometry/resolveRackPitch.md +1 -1
- package/dist/docs/reference/geometry/resolveThreadCircularSegments.md +1 -1
- package/dist/docs/reference/geometry/reverseTriangleMesh.md +1 -1
- package/dist/docs/reference/geometry/revolveMesh.md +4 -4
- package/dist/docs/reference/geometry/rotate2.md +36 -0
- package/dist/docs/reference/geometry/rotationTransform3.md +10 -6
- package/dist/docs/reference/geometry/roundClosedPolylinePath.md +5 -5
- package/dist/docs/reference/geometry/sampleContour.md +1 -1
- package/dist/docs/reference/geometry/sampleCurve2.md +1 -1
- package/dist/docs/reference/geometry/sampleCurve3.md +1 -1
- package/dist/docs/reference/geometry/sampleCylindricalGearOutline.md +1 -1
- package/dist/docs/reference/geometry/sampleHelix.md +4 -4
- package/dist/docs/reference/geometry/sampleInternalCylindricalGearSpaceOutline.md +1 -1
- package/dist/docs/reference/geometry/sampleRackToothPath.md +1 -1
- package/dist/docs/reference/geometry/sampleSideProfile.md +4 -4
- package/dist/docs/reference/geometry/sampleTextContours.md +1 -1
- package/dist/docs/reference/geometry/sampleThreadHelices.md +1 -1
- package/dist/docs/reference/geometry/scale2.md +36 -0
- package/dist/docs/reference/geometry/scale3.md +9 -5
- package/dist/docs/reference/geometry/scaleTransform3.md +10 -6
- package/dist/docs/reference/geometry/signedContourArea.md +1 -1
- package/dist/docs/reference/geometry/starContour.md +4 -4
- package/dist/docs/reference/geometry/strokePathRegion.md +4 -4
- package/dist/docs/reference/geometry/subtract2.md +36 -0
- package/dist/docs/reference/geometry/subtract3.md +10 -6
- package/dist/docs/reference/geometry/sweepMesh.md +5 -5
- package/dist/docs/reference/geometry/transform2.md +38 -0
- package/dist/docs/reference/geometry/transform3.md +38 -0
- package/dist/docs/reference/geometry/transformContour.md +5 -5
- package/dist/docs/reference/geometry/transformDeterminant3.md +8 -4
- package/dist/docs/reference/geometry/transformPath2.md +5 -5
- package/dist/docs/reference/geometry/transformPath3.md +5 -5
- package/dist/docs/reference/geometry/transformRegionData.md +40 -0
- package/dist/docs/reference/geometry/transformTriangleMesh.md +4 -4
- package/dist/docs/reference/geometry/translationTransform3.md +10 -6
- package/dist/docs/reference/geometry/triangulateContour.md +1 -1
- package/dist/docs/reference/geometry/validateSolidMesh.md +1 -1
- package/dist/docs/reference/geometry/validateTransform3.md +9 -5
- package/dist/docs/reference/geometry/validateTriangleMesh.md +1 -1
- package/dist/docs/reference/geometry/vector2.md +31 -0
- package/dist/docs/reference/geometry/vector3.md +38 -0
- package/dist/docs/reference/geometry.md +2 -2
- package/dist/docs/reference/model/Anchor3.md +5 -5
- package/dist/docs/reference/model/AttachOptions.md +1 -1
- package/dist/docs/reference/model/Bounds2.md +4 -4
- package/dist/docs/reference/model/Bounds3.md +4 -4
- package/dist/docs/reference/model/BoxEdge.md +1 -1
- package/dist/docs/reference/model/BoxEdgeSelection.md +1 -1
- package/dist/docs/reference/model/BoxEdgeTreatments.md +1 -1
- package/dist/docs/reference/model/BoxOptions.md +3 -3
- package/dist/docs/reference/model/ChamferedEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/CircleContourOptions.md +1 -1
- package/dist/docs/reference/model/CircleOptions.md +1 -1
- package/dist/docs/reference/model/CircularPrimitiveOptions.md +1 -1
- package/dist/docs/reference/model/Computed.md +1 -1
- package/dist/docs/reference/model/ComputedValue.md +1 -1
- package/dist/docs/reference/model/Contour.md +3 -3
- package/dist/docs/reference/model/CorrespondingComponent.md +1 -1
- package/dist/docs/reference/model/CorrespondingContour.md +1 -1
- package/dist/docs/reference/model/CorrespondingProfile.md +1 -1
- package/dist/docs/reference/model/CorrespondingProfileStation.md +1 -1
- package/dist/docs/reference/model/CylinderOptions.md +1 -1
- package/dist/docs/reference/model/DiagnosticOptions.md +1 -1
- package/dist/docs/reference/model/EdgeTreatment.md +1 -1
- package/dist/docs/reference/model/EllipseContourOptions.md +3 -3
- package/dist/docs/reference/model/EllipseOptions.md +1 -1
- package/dist/docs/reference/model/EndTreatments.md +1 -1
- package/dist/docs/reference/model/ExtrudeOptions.md +3 -3
- package/dist/docs/reference/model/FinalizedModel.md +1 -1
- package/dist/docs/reference/model/FinalizedPart.md +1 -1
- package/dist/docs/reference/model/Frame3.md +6 -6
- package/dist/docs/reference/model/GenerateCallback.md +1 -1
- package/dist/docs/reference/model/GenerateContext.md +5 -5
- package/dist/docs/reference/model/GeneratedPart.md +6 -6
- package/dist/docs/reference/model/GenerationDiagnostic.md +1 -1
- package/dist/docs/reference/model/GenerationError.md +1 -1
- package/dist/docs/reference/model/GeometryResolution.md +1 -1
- package/dist/docs/reference/model/GeometrySamplingLimits.md +1 -1
- package/dist/docs/reference/model/GeometryToleranceOptions.md +1 -1
- package/dist/docs/reference/model/GridPatternOptions.md +4 -4
- package/dist/docs/reference/model/HeightfieldOptions.md +5 -5
- package/dist/docs/reference/model/HelicalThreadRidgeMeshOptions.md +1 -1
- package/dist/docs/reference/model/HelicalThreadSolidMeshPreflight.md +1 -1
- package/dist/docs/reference/model/HullOptions.md +7 -7
- package/dist/docs/reference/model/ImmutableBuffer-type.md +1 -1
- package/dist/docs/reference/model/ImmutableTriangleMesh.md +1 -1
- package/dist/docs/reference/model/ImplicitOptions.md +4 -4
- package/dist/docs/reference/model/InternalThreadCutterOptions.md +1 -1
- package/dist/docs/reference/model/LinearPatternOptions.md +3 -3
- package/dist/docs/reference/model/LoftCorrespondence.md +1 -1
- package/dist/docs/reference/model/LoftOptions.md +1 -1
- package/dist/docs/reference/model/LoftPlacement.md +1 -1
- package/dist/docs/reference/model/LoftStation.md +2 -2
- package/dist/docs/reference/model/MatchProfilesOptions.md +1 -1
- package/dist/docs/reference/model/ModelProgram.md +1 -1
- package/dist/docs/reference/model/ModelingLimits.md +1 -1
- package/dist/docs/reference/model/NumericArray.md +1 -1
- package/dist/docs/reference/model/PartGeometry.md +1 -1
- package/dist/docs/reference/model/PartOptions.md +6 -6
- package/dist/docs/reference/model/{fromRegion.md → Path2.md} +5 -18
- package/dist/docs/reference/model/PathNormalGuide.md +5 -5
- package/dist/docs/reference/model/PathPatternOptions.md +1 -1
- package/dist/docs/reference/model/PatternSource.md +2 -2
- package/dist/docs/reference/model/Pivot2Options.md +27 -0
- package/dist/docs/reference/model/Pivot3Options.md +27 -0
- package/dist/docs/reference/model/PlaneOptions.md +3 -3
- package/dist/docs/reference/model/{Polygon-type.md → PolygonData.md} +2 -2
- package/dist/docs/reference/model/PolygonOptions.md +81 -4
- package/dist/docs/reference/model/PrimitivePlacement.md +1 -1
- package/dist/docs/reference/model/PrimitivePlacementOptions.md +1 -1
- package/dist/docs/reference/model/PrintableThreadFit.md +1 -1
- package/dist/docs/reference/model/PrintableThreadFitPolicy.md +1 -1
- package/dist/docs/reference/model/Profile.md +1 -1
- package/dist/docs/reference/model/ProfileComponent2.md +1 -1
- package/dist/docs/reference/model/ProfileContour2.md +1 -1
- package/dist/docs/reference/model/ProfileSpan2.md +3 -3
- package/dist/docs/reference/model/ProfiledEdgeTreatment.md +3 -3
- package/dist/docs/reference/model/RadialPatternOptions.md +4 -4
- package/dist/docs/reference/model/RadialSizing.md +1 -1
- package/dist/docs/reference/model/RadialSizingOptions.md +1 -1
- package/dist/docs/reference/model/RectangleContourOptions.md +3 -3
- package/dist/docs/reference/model/RectangleCornerTreatment.md +1 -1
- package/dist/docs/reference/model/RectangleCornerTreatments.md +1 -1
- package/dist/docs/reference/model/RectangleOptions.md +3 -3
- package/dist/docs/reference/model/{Region.md → RegionData.md} +4 -4
- package/dist/docs/reference/model/RegularPolygonOptions.md +1 -1
- package/dist/docs/reference/model/RevolveOptions.md +1 -1
- package/dist/docs/reference/model/RoundedEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/Section.md +75 -35
- package/dist/docs/reference/model/SectionHullOptions.md +7 -7
- package/dist/docs/reference/model/SectionInspection.md +4 -4
- package/dist/docs/reference/model/{RegionOffsetJoin.md → SectionOffsetJoin.md} +3 -3
- package/dist/docs/reference/model/{RegionOffsetOptions.md → SectionOffsetOptions.md} +4 -4
- package/dist/docs/reference/model/SmoothEdgeTreatment.md +1 -1
- package/dist/docs/reference/model/Solid.md +44 -21
- package/dist/docs/reference/model/SolidInspection.md +4 -4
- package/dist/docs/reference/model/SolidRayHit.md +4 -4
- package/dist/docs/reference/model/SphereOptions.md +1 -1
- package/dist/docs/reference/model/StarOptions.md +1 -1
- package/dist/docs/reference/model/StrokeOptions.md +91 -0
- package/dist/docs/reference/model/StrokePathCap.md +16 -0
- package/dist/docs/reference/model/StrokePathJoin.md +16 -0
- package/dist/docs/reference/model/SvgOrigin.md +1 -1
- package/dist/docs/reference/model/SvgPathSectionOptions.md +1 -1
- package/dist/docs/reference/model/SvgSectionOptions.md +1 -1
- package/dist/docs/reference/model/SweepOptions.md +3 -3
- package/dist/docs/reference/model/SweepOrientation.md +7 -7
- package/dist/docs/reference/model/TextSectionOptions.md +1 -1
- package/dist/docs/reference/model/ThreadEndStyle.md +1 -1
- package/dist/docs/reference/model/ThreadEndTreatmentOptions.md +1 -1
- package/dist/docs/reference/model/ThreadHandedness.md +1 -1
- package/dist/docs/reference/model/ThreadLeadInEnvelope.md +1 -1
- package/dist/docs/reference/model/ThreadLeadInShape.md +1 -1
- package/dist/docs/reference/model/ThreadProfile.md +3 -3
- package/dist/docs/reference/model/ThreadRidgeOptions.md +1 -1
- package/dist/docs/reference/model/ThreadedNutBevel.md +1 -1
- package/dist/docs/reference/model/ThreadedNutOptions.md +1 -1
- package/dist/docs/reference/model/ThreadedNutPreflight.md +1 -1
- package/dist/docs/reference/model/ThreadedNutShape.md +1 -1
- package/dist/docs/reference/model/ThreadedRodOptions.md +1 -1
- package/dist/docs/reference/model/TorusOptions.md +1 -1
- package/dist/docs/reference/model/Transform2-type.md +256 -0
- package/dist/docs/reference/model/Transform2Input.md +20 -0
- package/dist/docs/reference/model/Transform2Matrix.md +15 -0
- package/dist/docs/reference/model/Transform3-type.md +296 -0
- package/dist/docs/reference/model/Transform3Input.md +20 -0
- package/dist/docs/reference/model/{Transform3.md → Transform3Matrix.md} +3 -3
- package/dist/docs/reference/model/TriangleMesh.md +1 -1
- package/dist/docs/reference/model/TriangleMeshAnalysis.md +1 -1
- package/dist/docs/reference/model/TriangleMeshMeasurements.md +1 -1
- package/dist/docs/reference/model/TubeOptions.md +1 -1
- package/dist/docs/reference/model/Vector2-type.md +270 -0
- package/dist/docs/reference/model/Vector2Input.md +20 -0
- package/dist/docs/reference/model/{Vector2.md → Vector2Tuple.md} +3 -3
- package/dist/docs/reference/model/Vector3-type.md +282 -0
- package/dist/docs/reference/model/Vector3Input.md +20 -0
- package/dist/docs/reference/model/{Vector3.md → Vector3Tuple.md} +3 -3
- package/dist/docs/reference/model/VectorTextLayout.md +1 -1
- package/dist/docs/reference/model/VectorTextMetrics.md +1 -1
- package/dist/docs/reference/model/anchor.md +1 -1
- package/dist/docs/reference/model/box.md +2 -2
- package/dist/docs/reference/model/categories/boolean-operations.md +4 -4
- package/dist/docs/reference/model/categories/bounded-surfaces.md +3 -3
- package/dist/docs/reference/model/categories/contracts.md +1 -1
- package/dist/docs/reference/model/categories/core-values-errors.md +5 -5
- package/dist/docs/reference/model/categories/explicit-profiles.md +2 -2
- package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +1 -1
- package/dist/docs/reference/model/categories/generation.md +1 -1
- package/dist/docs/reference/model/categories/inspection.md +5 -5
- package/dist/docs/reference/model/categories/mesh-inspection.md +2 -2
- package/dist/docs/reference/model/categories/primitives.md +2 -2
- package/dist/docs/reference/model/categories/resolution.md +1 -1
- package/dist/docs/reference/model/categories/sections.md +11 -8
- package/dist/docs/reference/model/categories/threads.md +1 -1
- package/dist/docs/reference/model/categories/transforms-placement.md +21 -7
- package/dist/docs/reference/model/circle.md +1 -1
- package/dist/docs/reference/model/components.md +7 -4
- package/dist/docs/reference/model/compose.md +1 -1
- package/dist/docs/reference/model/cylinder.md +1 -1
- package/dist/docs/reference/model/distance.md +2 -2
- package/dist/docs/reference/model/ellipse.md +1 -1
- package/dist/docs/reference/model/extrude.md +2 -2
- package/dist/docs/reference/model/generate.md +1 -1
- package/dist/docs/reference/model/gridPattern.md +1 -1
- package/dist/docs/reference/model/heightfield.md +2 -2
- package/dist/docs/reference/model/hull.md +2 -2
- package/dist/docs/reference/model/immutableBuffer.md +1 -1
- package/dist/docs/reference/model/immutableMesh.md +1 -1
- package/dist/docs/reference/model/implicit.md +3 -3
- package/dist/docs/reference/model/inspectSection.md +1 -1
- package/dist/docs/reference/model/inspectSolid.md +1 -1
- package/dist/docs/reference/model/internalThreadCutter.md +1 -1
- package/dist/docs/reference/model/intersect.md +1 -1
- package/dist/docs/reference/model/isEmpty.md +2 -2
- package/dist/docs/reference/model/linearPattern.md +1 -1
- package/dist/docs/reference/model/loft.md +1 -1
- package/dist/docs/reference/model/matchProfiles.md +1 -1
- package/dist/docs/reference/model/minkowskiSum.md +1 -1
- package/dist/docs/reference/model/pathPattern.md +6 -6
- package/dist/docs/reference/model/polygon.md +1 -1
- package/dist/docs/reference/model/preflightInternalThreadCutter.md +1 -1
- package/dist/docs/reference/model/preflightThreadedNut.md +1 -1
- package/dist/docs/reference/model/preflightThreadedRod.md +1 -1
- package/dist/docs/reference/model/radialPattern.md +5 -5
- package/dist/docs/reference/model/rayCast.md +5 -5
- package/dist/docs/reference/model/rectangle.md +2 -2
- package/dist/docs/reference/model/regularPolygon.md +1 -1
- package/dist/docs/reference/model/revolve.md +1 -1
- package/dist/docs/reference/model/solidFromMesh.md +1 -1
- package/dist/docs/reference/model/sphere.md +1 -1
- package/dist/docs/reference/model/split.md +1 -1
- package/dist/docs/reference/model/splitByPlane.md +1 -1
- package/dist/docs/reference/model/star.md +1 -1
- package/dist/docs/reference/model/stroke.md +74 -0
- package/dist/docs/reference/model/svgPathSection.md +1 -1
- package/dist/docs/reference/model/svgSection.md +1 -1
- package/dist/docs/reference/model/sweep.md +5 -5
- package/dist/docs/reference/model/textSection.md +1 -1
- package/dist/docs/reference/model/threadRidge.md +1 -1
- package/dist/docs/reference/model/threadedNut.md +1 -1
- package/dist/docs/reference/model/threadedRod.md +1 -1
- package/dist/docs/reference/model/toTriangleMesh.md +1 -1
- package/dist/docs/reference/model/torus.md +1 -1
- package/dist/docs/reference/model/transform2.md +39 -0
- package/dist/docs/reference/model/transform3.md +39 -0
- package/dist/docs/reference/model/tube.md +1 -1
- package/dist/docs/reference/model/union.md +1 -1
- package/dist/docs/reference/model/vector2.md +32 -0
- package/dist/docs/reference/model/vector3.md +39 -0
- package/dist/docs/reference/model.md +7 -7
- package/dist/docs/reference/text/Bounds2.md +4 -4
- package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +1 -1
- package/dist/docs/reference/text/Vector2Tuple.md +7 -0
- package/dist/docs/reference/text/VectorFont.md +1 -1
- package/dist/docs/reference/text/VectorFontOptions.md +1 -1
- package/dist/docs/reference/text/VectorTextArcBaseline.md +1 -1
- package/dist/docs/reference/text/VectorTextLayout.md +1 -1
- package/dist/docs/reference/text/VectorTextLayoutOptions.md +1 -1
- package/dist/docs/reference/text/VectorTextMetrics.md +1 -1
- package/dist/docs/reference/text/VectorTextOptions.md +1 -1
- package/dist/docs/reference/text/categories/font-preparation.md +2 -2
- package/dist/docs/reference/text/prepareVectorFont.md +1 -1
- package/dist/docs/reference/text.md +1 -1
- package/dist/engine/deferred-context.js +11 -181
- package/dist/engine/native/transforms.js +6 -1
- package/dist/engine/pattern-operations.js +2 -2
- package/dist/engine/primitive-profiles.js +1 -0
- package/dist/engine/recipe-realization.js +29 -21
- package/dist/engine/section-operations.js +19 -3
- package/dist/engine/session-graph.js +1 -1
- package/dist/engine/session-native.js +1 -1
- package/dist/engine/session-snapshot.js +3 -2
- package/dist/engine/session.js +3 -3
- package/dist/engine/shape-anchors.js +3 -9
- package/dist/engine/transform-operations.js +42 -25
- package/dist/geometry/index.js +6 -2
- package/dist/geometry/math/immutable-value.js +20 -0
- package/dist/geometry/math/vector-value.js +168 -0
- package/dist/geometry/math/vector2.js +80 -0
- package/dist/geometry/math/vector3.js +37 -7
- package/dist/geometry/mechanical/gear-motion.js +7 -4
- package/dist/geometry/mesh/mesh-solid-intersections.js +5 -1
- package/dist/geometry/paths/closest-point.js +74 -0
- package/dist/geometry/paths/frames.js +3 -3
- package/dist/geometry/primitive-resolution.js +4 -1
- package/dist/geometry/resolution.js +17 -5
- package/dist/geometry/stroke-path.js +48 -44
- package/dist/geometry/sweeps/stations.js +4 -4
- package/dist/geometry/sweeps/sweep-closed.js +3 -3
- package/dist/geometry/sweeps/sweep-open.js +3 -3
- package/dist/geometry/transform-chain.js +172 -0
- package/dist/geometry/transform-geometry.js +28 -24
- package/dist/geometry/transform-matrix.js +14 -0
- package/dist/geometry/transform2.js +60 -0
- package/dist/geometry/transform3.js +70 -26
- package/dist/index.js +3 -0
- package/dist/model/execution-binding.js +10 -5
- package/dist/model/geometry-recipes.js +15 -0
- package/dist/{engine → model}/immutable-generation-data.js +25 -3
- package/dist/model/operation-dispatch.js +10 -3
- package/dist/model/operations.js +21 -10
- package/dist/model/recipe-declaration.js +193 -0
- package/dist/model/shape-handles.js +15 -4
- package/package.json +1 -1
- package/dist/docs/reference/geometry/Region.md +0 -14
- package/dist/docs/reference/geometry/Transform3.md +0 -12
- package/dist/docs/reference/geometry/Vector2.md +0 -7
- package/dist/docs/reference/geometry/Vector3.md +0 -7
- package/dist/docs/reference/geometry/rotateAroundAxis3.md +0 -38
- package/dist/docs/reference/geometry/transformRegion.md +0 -40
- package/dist/docs/reference/model/Transform2.md +0 -15
- package/dist/docs/reference/model/toRegion.md +0 -33
- package/dist/docs/reference/text/Vector2.md +0 -7
- package/dist/engine/geometry-recipes.js +0 -12
- package/dist/engine/pattern-transform.js +0 -9
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { GeometryError } from "../errors.js";
|
|
2
|
+
/** Adds two finite XY vectors component-wise. */
|
|
3
|
+
export const add2 = (a, b) => [a[0] + b[0], a[1] + b[1]];
|
|
4
|
+
/** Subtracts `b` from `a` component-wise. */
|
|
5
|
+
export const subtract2 = (a, b) => [
|
|
6
|
+
a[0] - b[0],
|
|
7
|
+
a[1] - b[1],
|
|
8
|
+
];
|
|
9
|
+
/** Multiplies a vector by a dimensionless scalar. */
|
|
10
|
+
export const scale2 = (vector, scale) => [
|
|
11
|
+
vector[0] * scale,
|
|
12
|
+
vector[1] * scale,
|
|
13
|
+
];
|
|
14
|
+
/** Returns the scalar dot product. */
|
|
15
|
+
export const dot2 = (a, b) => a[0] * b[0] + a[1] * b[1];
|
|
16
|
+
/** Returns the signed scalar cross product; positive means `b` is counter-clockwise from `a`. */
|
|
17
|
+
export const cross2 = (a, b) => a[0] * b[1] - a[1] * b[0];
|
|
18
|
+
/** Returns Euclidean vector length in the vector's coordinate units. */
|
|
19
|
+
export const length2 = (vector) => Math.hypot(vector[0], vector[1]);
|
|
20
|
+
/** Returns Euclidean point distance without allocating an intermediate difference vector. */
|
|
21
|
+
export const distance2 = (a, b) => Math.hypot(a[0] - b[0], a[1] - b[1]);
|
|
22
|
+
/**
|
|
23
|
+
* Returns a unit vector; `epsilon` is a finite, non-negative length threshold (default `1e-12`).
|
|
24
|
+
* Rejects invalid thresholds, nonfinite lengths, and lengths at or below the threshold with
|
|
25
|
+
* `INVALID_TOLERANCE`, `NON_FINITE_VALUE`, and `DEGENERATE_GEOMETRY` respectively.
|
|
26
|
+
*/
|
|
27
|
+
export const normalize2 = (vector, epsilon = 1e-12) => {
|
|
28
|
+
const operation = "normalize2";
|
|
29
|
+
if (!Number.isFinite(epsilon) || epsilon < 0) {
|
|
30
|
+
throw new GeometryError("INVALID_TOLERANCE", "epsilon must be finite and non-negative.", {
|
|
31
|
+
operation,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
const length = length2(vector);
|
|
35
|
+
if (!Number.isFinite(length)) {
|
|
36
|
+
throw new GeometryError("NON_FINITE_VALUE", "Cannot normalize a vector without finite length.", {
|
|
37
|
+
operation,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
if (length <= epsilon) {
|
|
41
|
+
throw new GeometryError("DEGENERATE_GEOMETRY", "Cannot normalize a zero-length vector.", {
|
|
42
|
+
operation,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
// Subnormal lengths lose relative precision; rescale only this rare case before division.
|
|
46
|
+
if (length < 2 ** -1022) {
|
|
47
|
+
const maximum = Math.max(Math.abs(vector[0]), Math.abs(vector[1]));
|
|
48
|
+
const x = vector[0] / maximum;
|
|
49
|
+
const y = vector[1] / maximum;
|
|
50
|
+
const scaledLength = Math.hypot(x, y);
|
|
51
|
+
return [x / scaledLength, y / scaledLength];
|
|
52
|
+
}
|
|
53
|
+
return [vector[0] / length, vector[1] / length];
|
|
54
|
+
};
|
|
55
|
+
/** Linearly interpolates two vectors; `t` is dimensionless and may extrapolate. */
|
|
56
|
+
export const lerp2 = (a, b, t) => add2(a, scale2(subtract2(b, a), t));
|
|
57
|
+
/**
|
|
58
|
+
* Rotates a finite vector counter-clockwise in XY by `degrees` about the origin.
|
|
59
|
+
* Throws `NON_FINITE_VALUE` for nonfinite coordinates, angles, or derived coordinates.
|
|
60
|
+
*/
|
|
61
|
+
export const rotate2 = (vector, degrees) => {
|
|
62
|
+
if (!Number.isFinite(vector[0]) || !Number.isFinite(vector[1]) || !Number.isFinite(degrees)) {
|
|
63
|
+
throw new GeometryError("NON_FINITE_VALUE", "Rotation coordinates and angle must be finite.", {
|
|
64
|
+
operation: "rotate2",
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
const radians = degrees * (Math.PI / 180);
|
|
68
|
+
const cosine = Math.cos(radians);
|
|
69
|
+
const sine = Math.sin(radians);
|
|
70
|
+
const rotated = [
|
|
71
|
+
vector[0] * cosine - vector[1] * sine,
|
|
72
|
+
vector[0] * sine + vector[1] * cosine,
|
|
73
|
+
];
|
|
74
|
+
if (!Number.isFinite(rotated[0]) || !Number.isFinite(rotated[1])) {
|
|
75
|
+
throw new GeometryError("NON_FINITE_VALUE", "Rotated coordinates must remain finite.", {
|
|
76
|
+
operation: "rotate2",
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
return rotated;
|
|
80
|
+
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { GeometryError } from "../errors.js";
|
|
1
2
|
/**
|
|
2
3
|
* Adds two finite XYZ vectors component-wise.
|
|
3
4
|
* @example
|
|
@@ -5,7 +6,11 @@
|
|
|
5
6
|
* add3([1, 2, 3], [4, 5, 6]); // [5, 7, 9]
|
|
6
7
|
* ```
|
|
7
8
|
*/
|
|
8
|
-
export const add3 = (a, b) => [
|
|
9
|
+
export const add3 = (a, b) => [
|
|
10
|
+
a[0] + b[0],
|
|
11
|
+
a[1] + b[1],
|
|
12
|
+
a[2] + b[2],
|
|
13
|
+
];
|
|
9
14
|
/**
|
|
10
15
|
* Subtracts `b` from `a`.
|
|
11
16
|
* @example
|
|
@@ -52,23 +57,48 @@ export const cross3 = (a, b) => [
|
|
|
52
57
|
];
|
|
53
58
|
/** Returns Euclidean vector length in the vector's coordinate units. */
|
|
54
59
|
export const length3 = (vector) => Math.hypot(vector[0], vector[1], vector[2]);
|
|
55
|
-
/**
|
|
60
|
+
/** Returns Euclidean point distance without allocating an intermediate difference vector. */
|
|
61
|
+
export const distance3 = (a, b) => Math.hypot(a[0] - b[0], a[1] - b[1], a[2] - b[2]);
|
|
62
|
+
/**
|
|
63
|
+
* Returns a unit vector; `epsilon` is a finite, non-negative length threshold (default `1e-12`).
|
|
64
|
+
* Rejects invalid thresholds, nonfinite lengths, and lengths at or below the threshold with
|
|
65
|
+
* `INVALID_TOLERANCE`, `NON_FINITE_VALUE`, and `DEGENERATE_GEOMETRY` respectively.
|
|
66
|
+
*/
|
|
56
67
|
export const normalize3 = (vector, epsilon = 1e-12) => {
|
|
68
|
+
const operation = "normalize3";
|
|
69
|
+
if (!Number.isFinite(epsilon) || epsilon < 0) {
|
|
70
|
+
throw new GeometryError("INVALID_TOLERANCE", "epsilon must be finite and non-negative.", {
|
|
71
|
+
operation,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
57
74
|
const length = length3(vector);
|
|
58
75
|
if (!Number.isFinite(length)) {
|
|
59
|
-
throw new
|
|
76
|
+
throw new GeometryError("NON_FINITE_VALUE", "Cannot normalize a vector without finite length.", {
|
|
77
|
+
operation,
|
|
78
|
+
});
|
|
60
79
|
}
|
|
61
80
|
if (length <= epsilon) {
|
|
62
|
-
throw new
|
|
81
|
+
throw new GeometryError("DEGENERATE_GEOMETRY", "Cannot normalize a zero-length vector.", {
|
|
82
|
+
operation,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
// Subnormal lengths lose relative precision; rescale only this rare case before division.
|
|
86
|
+
if (length < 2 ** -1022) {
|
|
87
|
+
const maximum = Math.max(Math.abs(vector[0]), Math.abs(vector[1]), Math.abs(vector[2]));
|
|
88
|
+
const x = vector[0] / maximum;
|
|
89
|
+
const y = vector[1] / maximum;
|
|
90
|
+
const z = vector[2] / maximum;
|
|
91
|
+
const scaledLength = Math.hypot(x, y, z);
|
|
92
|
+
return [x / scaledLength, y / scaledLength, z / scaledLength];
|
|
63
93
|
}
|
|
64
|
-
return
|
|
94
|
+
return [vector[0] / length, vector[1] / length, vector[2] / length];
|
|
65
95
|
};
|
|
66
96
|
/** Linearly interpolates two vectors; `t` is dimensionless and may extrapolate. */
|
|
67
97
|
export const lerp3 = (a, b, t) => add3(a, scale3(subtract3(b, a), t));
|
|
68
98
|
/** Removes the component parallel to a normalized plane normal. */
|
|
69
99
|
export const projectOntoPlane3 = (vector, normal) => subtract3(vector, scale3(normal, dot3(vector, normal)));
|
|
70
|
-
/** Rotates a vector right-handed around
|
|
71
|
-
export const
|
|
100
|
+
/** Rotates a vector right-handed around a unit axis by `angle` radians. */
|
|
101
|
+
export const rotateAroundAxis3Radians = (vector, axis, angle) => {
|
|
72
102
|
const cosine = Math.cos(angle);
|
|
73
103
|
const sine = Math.sin(angle);
|
|
74
104
|
return add3(add3(scale3(vector, cosine), scale3(cross3(axis, vector), sine)), scale3(axis, dot3(axis, vector) * (1 - cosine)));
|
|
@@ -50,7 +50,8 @@ const multiPolygonArea = (multiPolygon) => multiPolygon.reduce((total, polygon)
|
|
|
50
50
|
/**
|
|
51
51
|
* Measures sampled kinematic interference over one tooth cycle of an internal gear pair.
|
|
52
52
|
*
|
|
53
|
-
* The driver and ring
|
|
53
|
+
* The driver and ring start with half-tooth offsets for odd tooth counts, then rotate in the
|
|
54
|
+
* same direction at their resolved tooth-count ratio. Each
|
|
54
55
|
* sampled pinion outline is subtracted from the ring's center-and-space opening; remaining area is
|
|
55
56
|
* solid overlap. This catches involute, tip, and trimming interference that a single assembled pose
|
|
56
57
|
* misses. It is a deterministic model check, not a certified gear-rating calculation.
|
|
@@ -71,11 +72,13 @@ export function measureInternalCylindricalGearPairMotion(spec, options = {}) {
|
|
|
71
72
|
const ringTipRadius = pair.driven.pitchRadius - pair.driven.addendum;
|
|
72
73
|
const contactWindow = contactWindowPolygon(pair.centerDistance, pair.driver.outsideRadius, ringTipRadius);
|
|
73
74
|
const initialRingPhase = pair.driven.toothCount % 2 === 0 ? 0 : pair.driven.angularPitch / 2;
|
|
75
|
+
const initialDriverPhase = pair.driver.toothCount % 2 === 0 ? 0 : pair.driver.angularPitch / 2;
|
|
74
76
|
let maximumOverlapArea = 0;
|
|
75
|
-
let maximumPhase =
|
|
77
|
+
let maximumPhase = initialDriverPhase;
|
|
76
78
|
for (let sample = 0; sample < samples; sample += 1) {
|
|
77
|
-
const
|
|
78
|
-
const
|
|
79
|
+
const phase = (pair.driver.angularPitch * sample) / samples;
|
|
80
|
+
const driverPhase = initialDriverPhase + phase;
|
|
81
|
+
const drivenPhase = initialRingPhase + phase / pair.ratio;
|
|
79
82
|
const posedDriver = clippingPolygon(transformedLoop(driver, driverPhase));
|
|
80
83
|
const posedSpace = clippingPolygon(transformedLoop(ringSpace, drivenPhase, pair.centerDistance));
|
|
81
84
|
const contactDriver = polygonClipping.intersection(posedDriver, contactWindow);
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
const subtract = (a, b) => [
|
|
1
|
+
const subtract = (a, b) => [
|
|
2
|
+
a[0] - b[0],
|
|
3
|
+
a[1] - b[1],
|
|
4
|
+
a[2] - b[2],
|
|
5
|
+
];
|
|
2
6
|
const dot = (a, b) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
|
|
3
7
|
const cross = (a, b) => [
|
|
4
8
|
a[1] * b[2] - a[2] * b[1],
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { assertSamplingCount, resolveGeometrySamplingLimits, } from "../sampling-limits.js";
|
|
3
|
+
export function closestPointOnPath(path, point, options = {}) {
|
|
4
|
+
const fail = (message, code = "INVALID_ARGUMENT") => {
|
|
5
|
+
throw new GeometryError(code, message, { operation: "closestPointOnPath" });
|
|
6
|
+
};
|
|
7
|
+
const dimensions = point.length;
|
|
8
|
+
const closed = options.closed ?? false;
|
|
9
|
+
if (typeof closed !== "boolean" || (dimensions !== 2 && dimensions !== 3))
|
|
10
|
+
fail("Use a 2D or 3D point and a boolean closed option.");
|
|
11
|
+
assertSamplingCount(path.length, "closestPointOnPath", resolveGeometrySamplingLimits(options.limits).maxPathPoints);
|
|
12
|
+
if (path.length < (closed ? 3 : 2))
|
|
13
|
+
fail("Open paths need two points; closed paths need three.");
|
|
14
|
+
const validate = (value) => {
|
|
15
|
+
if (value.length !== dimensions)
|
|
16
|
+
fail("Path and query points must have the same dimension.");
|
|
17
|
+
if (!Number.isFinite(value[0]) ||
|
|
18
|
+
!Number.isFinite(value[1]) ||
|
|
19
|
+
(dimensions === 3 && !Number.isFinite(value[2])))
|
|
20
|
+
fail("Path and query coordinates must be finite.", "NON_FINITE_VALUE");
|
|
21
|
+
};
|
|
22
|
+
validate(point);
|
|
23
|
+
validate(path[0]);
|
|
24
|
+
let bestDistance = Infinity, bestSquared = Infinity, edgeIndex = 0, fraction = 0;
|
|
25
|
+
let bestX = 0, bestY = 0, bestZ = 0;
|
|
26
|
+
const count = closed ? path.length : path.length - 1;
|
|
27
|
+
for (let i = 0; i < count; i++) {
|
|
28
|
+
const a = path[i], b = path[(i + 1) % path.length];
|
|
29
|
+
validate(b);
|
|
30
|
+
const dx = b[0] - a[0], dy = b[1] - a[1], dz = (b[2] ?? 0) - (a[2] ?? 0);
|
|
31
|
+
const px = point[0] - a[0], py = point[1] - a[1], pz = (point[2] ?? 0) - (a[2] ?? 0);
|
|
32
|
+
const lengthSquared = dx * dx + dy * dy + dz * dz;
|
|
33
|
+
let projection = (px * dx + py * dy + pz * dz) / lengthSquared;
|
|
34
|
+
if (!Number.isFinite(projection)) {
|
|
35
|
+
// Normalize only extreme extents; ordinary boundary scans use scalar squared arithmetic.
|
|
36
|
+
const scale = Math.max(Math.abs(dx), Math.abs(dy), Math.abs(dz));
|
|
37
|
+
if (!Number.isFinite(scale))
|
|
38
|
+
fail("Path extent exceeds finite arithmetic.", "NON_FINITE_VALUE");
|
|
39
|
+
if (scale === 0)
|
|
40
|
+
projection = 0;
|
|
41
|
+
else {
|
|
42
|
+
const ux = dx / scale, uy = dy / scale, uz = dz / scale;
|
|
43
|
+
const denominator = ux * ux + uy * uy + uz * uz;
|
|
44
|
+
projection =
|
|
45
|
+
(px * (ux / denominator) + py * (uy / denominator) + pz * (uz / denominator)) / scale;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const t = Math.max(0, Math.min(1, projection));
|
|
49
|
+
const x = a[0] + t * dx, y = a[1] + t * dy, z = (a[2] ?? 0) + t * dz;
|
|
50
|
+
const rx = point[0] - x, ry = point[1] - y, rz = (point[2] ?? 0) - z;
|
|
51
|
+
const squared = rx * rx + ry * ry + rz * rz;
|
|
52
|
+
if (squared > 0 && Number.isFinite(squared) && squared >= bestSquared)
|
|
53
|
+
continue;
|
|
54
|
+
const distance = squared > 0 && Number.isFinite(squared) ? Math.sqrt(squared) : Math.hypot(rx, ry, rz);
|
|
55
|
+
if (!Number.isFinite(distance))
|
|
56
|
+
fail("Path distance exceeds finite arithmetic.", "NON_FINITE_VALUE");
|
|
57
|
+
if (distance < bestDistance) {
|
|
58
|
+
bestDistance = distance;
|
|
59
|
+
bestSquared = squared;
|
|
60
|
+
edgeIndex = i;
|
|
61
|
+
fraction = t;
|
|
62
|
+
bestX = x;
|
|
63
|
+
bestY = y;
|
|
64
|
+
bestZ = z;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const position = dimensions === 2 ? [bestX, bestY] : [bestX, bestY, bestZ];
|
|
68
|
+
return Object.freeze({
|
|
69
|
+
point: Object.freeze(position),
|
|
70
|
+
distance: bestDistance,
|
|
71
|
+
edgeIndex,
|
|
72
|
+
fraction,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { cross3, dot3, length3, normalize3, projectOntoPlane3,
|
|
1
|
+
import { cross3, dot3, length3, normalize3, projectOntoPlane3, rotateAroundAxis3Radians, scale3, subtract3, } from "../math/vector3.js";
|
|
2
2
|
import { assertSamplingCount, resolveGeometrySamplingLimits, } from "../sampling-limits.js";
|
|
3
3
|
const tangentAt = (path, index) => {
|
|
4
4
|
if (index === 0) {
|
|
@@ -32,7 +32,7 @@ const transportNormal = (normal, previousTangent, tangent) => {
|
|
|
32
32
|
if (sine > 1e-10) {
|
|
33
33
|
const axis = scale3(rotationAxis, 1 / sine);
|
|
34
34
|
const cosine = Math.max(-1, Math.min(1, dot3(previousTangent, tangent)));
|
|
35
|
-
transported =
|
|
35
|
+
transported = rotateAroundAxis3Radians(normal, axis, Math.atan2(sine, cosine));
|
|
36
36
|
}
|
|
37
37
|
return normalize3(projectOntoPlane3(transported, tangent));
|
|
38
38
|
};
|
|
@@ -107,7 +107,7 @@ export const computeClosedParallelTransportFrames = (path, initialNormal, limits
|
|
|
107
107
|
const seamCorrection = signedAngleAround(seamNormal, transportedNormals[0], tangents[0]);
|
|
108
108
|
return tangents.map((tangent, index) => {
|
|
109
109
|
const correction = (seamCorrection * index) / path.length;
|
|
110
|
-
const normal = normalize3(projectOntoPlane3(
|
|
110
|
+
const normal = normalize3(projectOntoPlane3(rotateAroundAxis3Radians(transportedNormals[index], tangent, correction), tangent));
|
|
111
111
|
return {
|
|
112
112
|
tangent,
|
|
113
113
|
normal,
|
|
@@ -8,7 +8,10 @@ import { assertSamplingCount, resolveGeometrySamplingLimits } from "./sampling-l
|
|
|
8
8
|
*/
|
|
9
9
|
export function resolveCircularPrimitiveSegments(radius, options, operation) {
|
|
10
10
|
if (options.segments === undefined) {
|
|
11
|
-
return resolveCircularSegments(radius,
|
|
11
|
+
return resolveCircularSegments(radius, {
|
|
12
|
+
...options.resolution,
|
|
13
|
+
sizing: options.sizing ?? "vertex",
|
|
14
|
+
}, options.limits);
|
|
12
15
|
}
|
|
13
16
|
if (!Number.isSafeInteger(options.segments) || options.segments < 3)
|
|
14
17
|
throw new GeometryError("INVALID_ARGUMENT", "segments must be a safe integer of at least three.", { operation, details: { value: options.segments } });
|
|
@@ -55,12 +55,17 @@ export function resolveGeometryResolution(policy = {}, limits = {}) {
|
|
|
55
55
|
minimumSegments,
|
|
56
56
|
});
|
|
57
57
|
}
|
|
58
|
-
const requiredFullCircleSegments = (radius, resolution) => {
|
|
59
|
-
const chordAngle = 2 *
|
|
58
|
+
const requiredFullCircleSegments = (radius, resolution, sizing) => {
|
|
59
|
+
const chordAngle = 2 *
|
|
60
|
+
Math.acos(sizing === "face"
|
|
61
|
+
? 1 / (1 + resolution.maxChordError / radius)
|
|
62
|
+
: Math.max(-1, Math.min(1, 1 - resolution.maxChordError / radius)));
|
|
60
63
|
const chordSegments = chordAngle === 0 ? Number.POSITIVE_INFINITY : Math.ceil((Math.PI * 2) / chordAngle);
|
|
61
64
|
const lengthSegments = resolution.maxSegmentLength === undefined
|
|
62
65
|
? 0
|
|
63
|
-
:
|
|
66
|
+
: sizing === "face"
|
|
67
|
+
? Math.ceil(Math.PI / Math.atan(resolution.maxSegmentLength / radius / 2))
|
|
68
|
+
: Math.ceil((Math.PI * 2 * radius) / resolution.maxSegmentLength);
|
|
64
69
|
return Math.max(resolution.minimumSegments, chordSegments, lengthSegments);
|
|
65
70
|
};
|
|
66
71
|
const assertRadius = (radius, operation) => {
|
|
@@ -75,7 +80,8 @@ const assertRadius = (radius, operation) => {
|
|
|
75
80
|
* Resolves a deterministic full-circle segment count for one radius.
|
|
76
81
|
*
|
|
77
82
|
* An exact `circularSegments` value wins. Otherwise the smallest regular polygon satisfying both
|
|
78
|
-
* physical error criteria is used.
|
|
83
|
+
* physical error criteria is used. Face sizing bounds the circumscribed polygon's outward
|
|
84
|
+
* excess and actual edge length. A safety cap that would violate either criterion raises
|
|
79
85
|
* `COMPLEXITY_LIMIT` rather than silently reducing quality.
|
|
80
86
|
*
|
|
81
87
|
* @param radius - Circle radius in millimetres.
|
|
@@ -94,10 +100,13 @@ const assertRadius = (radius, operation) => {
|
|
|
94
100
|
export function resolveCircularSegments(radius, policy = {}, limits = {}) {
|
|
95
101
|
const operation = "resolveCircularSegments";
|
|
96
102
|
assertRadius(radius, operation);
|
|
103
|
+
const sizing = policy.sizing ?? "vertex";
|
|
104
|
+
if (sizing !== "vertex" && sizing !== "face")
|
|
105
|
+
invalid("sizing must be vertex or face.");
|
|
97
106
|
const resolution = resolveGeometryResolution(policy, limits);
|
|
98
107
|
if (resolution.circularSegments !== undefined)
|
|
99
108
|
return resolution.circularSegments;
|
|
100
|
-
const required = requiredFullCircleSegments(radius, resolution);
|
|
109
|
+
const required = requiredFullCircleSegments(radius, resolution, sizing);
|
|
101
110
|
if (required > resolution.maximumSegments) {
|
|
102
111
|
throw new GeometryError("COMPLEXITY_LIMIT", `The requested physical curve tolerance requires ${required} segments, above the ${resolution.maximumSegments}-segment safety limit.`, {
|
|
103
112
|
operation,
|
|
@@ -151,6 +160,8 @@ const checkedLeastCommonMultiple = (left, right, operation) => {
|
|
|
151
160
|
export function resolveAlignedCircularSegments(radius, options) {
|
|
152
161
|
const operation = "resolveAlignedCircularSegments";
|
|
153
162
|
assertRadius(radius, operation);
|
|
163
|
+
if (options.sizing !== undefined && options.sizing !== "vertex" && options.sizing !== "face")
|
|
164
|
+
invalid("sizing must be vertex or face.");
|
|
154
165
|
const alignTo = options.alignTo;
|
|
155
166
|
const hasArrayShape = Array.isArray(alignTo);
|
|
156
167
|
if (!hasArrayShape || alignTo.length === 0) {
|
|
@@ -186,6 +197,7 @@ export function resolveAlignedCircularSegments(radius, options) {
|
|
|
186
197
|
}
|
|
187
198
|
const baseSegments = resolveCircularSegments(radius, {
|
|
188
199
|
...resolution,
|
|
200
|
+
sizing: options.sizing ?? "vertex",
|
|
189
201
|
}, options.limits);
|
|
190
202
|
const requiredSegments = Math.max(baseSegments, minimumSegments);
|
|
191
203
|
const multiplier = Math.ceil(requiredSegments / alignment);
|
|
@@ -23,10 +23,7 @@ function ellipsePoints(center, radius, segments) {
|
|
|
23
23
|
return [center[0] + Math.cos(angle) * radius, center[1] + Math.sin(angle) * radius];
|
|
24
24
|
});
|
|
25
25
|
}
|
|
26
|
-
function
|
|
27
|
-
return [ring(ellipsePoints(center, radius, segments))];
|
|
28
|
-
}
|
|
29
|
-
function cornerPolygon(previous, point, next, halfWidth, join) {
|
|
26
|
+
function cornerContour(previous, point, next, halfWidth, join) {
|
|
30
27
|
const incomingLength = Math.hypot(point[0] - previous[0], point[1] - previous[1]);
|
|
31
28
|
const outgoingLength = Math.hypot(next[0] - point[0], next[1] - point[1]);
|
|
32
29
|
const incoming = [
|
|
@@ -54,11 +51,13 @@ function cornerPolygon(previous, point, next, halfWidth, join) {
|
|
|
54
51
|
]);
|
|
55
52
|
}
|
|
56
53
|
points.push([point[0] + after[0], point[1] + after[1]]);
|
|
57
|
-
return
|
|
54
|
+
return turn > 0 ? points : points.reverse();
|
|
58
55
|
}
|
|
59
56
|
/** Removes consecutive points that cannot define a visible stroke segment at model scale. */
|
|
60
57
|
function deduplicatePath(path, closed, width) {
|
|
61
|
-
|
|
58
|
+
let scale = width;
|
|
59
|
+
for (const [x, y] of path)
|
|
60
|
+
scale = Math.max(scale, Math.abs(x), Math.abs(y));
|
|
62
61
|
const tolerance = resolveGeometryTolerance(scale).linear;
|
|
63
62
|
const points = [];
|
|
64
63
|
for (const point of path) {
|
|
@@ -76,11 +75,27 @@ function deduplicatePath(path, closed, width) {
|
|
|
76
75
|
}
|
|
77
76
|
return Object.freeze(points);
|
|
78
77
|
}
|
|
79
|
-
/** @internal
|
|
80
|
-
export function
|
|
78
|
+
/** @internal Bounded CCW stroke primitives shared by native sections and pure clipping. */
|
|
79
|
+
export function strokePathContours(path, options, exactCircularSegments) {
|
|
81
80
|
const closed = options.closed ?? false;
|
|
82
81
|
const cap = options.cap ?? "butt";
|
|
83
82
|
const join = options.join ?? "miter";
|
|
83
|
+
if (typeof closed !== "boolean")
|
|
84
|
+
return fail("closed must be a boolean.");
|
|
85
|
+
if (!Number.isFinite(options.width) || options.width <= 0)
|
|
86
|
+
return fail("Stroke width must be finite and greater than zero.");
|
|
87
|
+
if (path.length < (closed ? 3 : 2))
|
|
88
|
+
return fail(`${closed ? "Closed" : "Open"} strokes need more sampled path points.`);
|
|
89
|
+
if (!path.every((point) => point.length === 2 && point.every(Number.isFinite)))
|
|
90
|
+
return fail("Stroke path coordinates must be finite XY points.");
|
|
91
|
+
if (!["butt", "round", "square"].includes(cap))
|
|
92
|
+
return fail("Stroke cap must be butt, round, or square.");
|
|
93
|
+
if (!["bevel", "miter", "round"].includes(join))
|
|
94
|
+
return fail("Stroke join must be bevel, miter, or round.");
|
|
95
|
+
const circularSegments = exactCircularSegments ??
|
|
96
|
+
(cap === "round" || join === "round"
|
|
97
|
+
? resolveCircularSegments(options.width / 2, options.resolution, options.limits)
|
|
98
|
+
: 3);
|
|
84
99
|
const half = options.width / 2;
|
|
85
100
|
const limits = resolveGeometrySamplingLimits(options.limits);
|
|
86
101
|
assertSamplingCount(path.length, "strokePathRegion", limits.maxPathPoints);
|
|
@@ -88,7 +103,7 @@ export function strokePathMultiPolygon(path, options, circularSegments) {
|
|
|
88
103
|
const normalizedPath = deduplicatePath(path, closed, options.width);
|
|
89
104
|
if (normalizedPath.length < (closed ? 3 : 2))
|
|
90
105
|
return [];
|
|
91
|
-
const
|
|
106
|
+
const contours = [];
|
|
92
107
|
const segmentCount = closed ? normalizedPath.length : normalizedPath.length - 1;
|
|
93
108
|
const joinCount = closed ? normalizedPath.length : Math.max(0, normalizedPath.length - 2);
|
|
94
109
|
const constructionVertices = segmentCount * 4 +
|
|
@@ -108,34 +123,44 @@ export function strokePathMultiPolygon(path, options, circularSegments) {
|
|
|
108
123
|
}
|
|
109
124
|
}
|
|
110
125
|
const normal = [-tangent[1] * half, tangent[0] * half];
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
[start[0] - normal[0], start[1] - normal[1]],
|
|
117
|
-
]),
|
|
126
|
+
contours.push([
|
|
127
|
+
[start[0] - normal[0], start[1] - normal[1]],
|
|
128
|
+
[end[0] - normal[0], end[1] - normal[1]],
|
|
129
|
+
[end[0] + normal[0], end[1] + normal[1]],
|
|
130
|
+
[start[0] + normal[0], start[1] + normal[1]],
|
|
118
131
|
]);
|
|
119
132
|
}
|
|
133
|
+
const disk = join === "round" || (!closed && cap === "round")
|
|
134
|
+
? ellipsePoints([0, 0], half, circularSegments)
|
|
135
|
+
: [];
|
|
136
|
+
const circleAt = ([x, y]) => disk.map(([u, v]) => [x + u, y + v]);
|
|
120
137
|
if (join === "round") {
|
|
121
138
|
const joinPoints = closed ? normalizedPath : normalizedPath.slice(1, -1);
|
|
122
|
-
|
|
139
|
+
for (const point of joinPoints)
|
|
140
|
+
contours.push(circleAt(point));
|
|
123
141
|
}
|
|
124
142
|
else {
|
|
125
143
|
const first = closed ? 0 : 1;
|
|
126
144
|
const end = closed ? normalizedPath.length : normalizedPath.length - 1;
|
|
127
145
|
for (let index = first; index < end; index += 1) {
|
|
128
|
-
const corner =
|
|
146
|
+
const corner = cornerContour(normalizedPath[(index - 1 + normalizedPath.length) % normalizedPath.length], normalizedPath[index], normalizedPath[(index + 1) % normalizedPath.length], half, join);
|
|
129
147
|
if (corner !== undefined)
|
|
130
|
-
|
|
148
|
+
contours.push(corner);
|
|
131
149
|
}
|
|
132
150
|
}
|
|
133
151
|
if (!closed && cap === "round") {
|
|
134
|
-
|
|
152
|
+
contours.push(circleAt(normalizedPath[0]), circleAt(normalizedPath.at(-1)));
|
|
135
153
|
}
|
|
136
|
-
|
|
154
|
+
return contours;
|
|
155
|
+
}
|
|
156
|
+
/** @internal Polygon-clipping representation shared with the bounded SVG importer. */
|
|
157
|
+
export function strokePathMultiPolygon(path, options, circularSegments) {
|
|
158
|
+
const contours = strokePathContours(path, options, circularSegments);
|
|
159
|
+
if (contours.length === 0)
|
|
160
|
+
return [];
|
|
161
|
+
const result = unionPolygonGeometry(contours.map((contour) => [ring(contour)]));
|
|
137
162
|
const outputVertices = result.reduce((count, polygon) => count + polygon.reduce((total, contour) => total + Math.max(0, contour.length - 1), 0), 0);
|
|
138
|
-
assertSamplingCount(outputVertices, "strokePathRegion", limits.maxProfilePoints);
|
|
163
|
+
assertSamplingCount(outputVertices, "strokePathRegion", resolveGeometrySamplingLimits(options.limits).maxProfilePoints);
|
|
139
164
|
return result;
|
|
140
165
|
}
|
|
141
166
|
function regionFromMultiPolygon(value) {
|
|
@@ -153,28 +178,7 @@ function regionFromMultiPolygon(value) {
|
|
|
153
178
|
* intersection, falling back to bevels above SVG's default miter limit of 4.
|
|
154
179
|
*/
|
|
155
180
|
export function strokePathRegion(path, options) {
|
|
156
|
-
const
|
|
157
|
-
if (!Number.isFinite(options.width) || options.width <= 0) {
|
|
158
|
-
return fail("Stroke width must be finite and greater than zero.");
|
|
159
|
-
}
|
|
160
|
-
if (path.length < (closed ? 3 : 2)) {
|
|
161
|
-
return fail(`${closed ? "Closed" : "Open"} strokes need more sampled path points.`);
|
|
162
|
-
}
|
|
163
|
-
if (!path.every((point) => Number.isFinite(point[0]) && Number.isFinite(point[1]))) {
|
|
164
|
-
return fail("Stroke path coordinates must be finite.");
|
|
165
|
-
}
|
|
166
|
-
const cap = options.cap ?? "butt";
|
|
167
|
-
const join = options.join ?? "miter";
|
|
168
|
-
if (!["butt", "round", "square"].includes(cap)) {
|
|
169
|
-
return fail("Stroke cap must be butt, round, or square.");
|
|
170
|
-
}
|
|
171
|
-
if (!["bevel", "miter", "round"].includes(join)) {
|
|
172
|
-
return fail("Stroke join must be bevel, miter, or round.");
|
|
173
|
-
}
|
|
174
|
-
const circularSegments = cap === "round" || join === "round"
|
|
175
|
-
? resolveCircularSegments(options.width / 2, options.resolution, options.limits)
|
|
176
|
-
: 3;
|
|
177
|
-
const result = strokePathMultiPolygon(path, { ...options, cap, closed, join }, circularSegments);
|
|
181
|
+
const result = strokePathMultiPolygon(path, options);
|
|
178
182
|
if (result.length === 0)
|
|
179
183
|
return fail("The sampled stroke path has no visible length.");
|
|
180
184
|
return regionFromMultiPolygon(result);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
|
-
import { cross3, dot3, lerp3, normalize3,
|
|
2
|
+
import { cross3, dot3, lerp3, normalize3, rotateAroundAxis3Radians } from "../math/vector3.js";
|
|
3
3
|
import { resolveGeometryResolution } from "../resolution.js";
|
|
4
4
|
import { assertSamplingCount, resolveGeometrySamplingLimits } from "../sampling-limits.js";
|
|
5
5
|
/** @internal Original station progression, with a virtual final seam endpoint for closed paths. */
|
|
@@ -144,9 +144,9 @@ export function refineSweepStations(path, scales, frames, options, plan) {
|
|
|
144
144
|
sampledFrames.push(amount === 0
|
|
145
145
|
? frames[i]
|
|
146
146
|
: {
|
|
147
|
-
normal:
|
|
148
|
-
binormal:
|
|
149
|
-
tangent:
|
|
147
|
+
normal: rotateAroundAxis3Radians(frames[i].normal, rotation.axis, rotation.angle * amount),
|
|
148
|
+
binormal: rotateAroundAxis3Radians(frames[i].binormal, rotation.axis, rotation.angle * amount),
|
|
149
|
+
tangent: rotateAroundAxis3Radians(frames[i].tangent, rotation.axis, rotation.angle * amount),
|
|
150
150
|
});
|
|
151
151
|
twists.push(twist * (plan.progress[i] + (plan.progress[i + 1] - plan.progress[i]) * amount));
|
|
152
152
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
|
-
import { add3,
|
|
2
|
+
import { add3, rotateAroundAxis3Radians, scale3 } from "../math/vector3.js";
|
|
3
3
|
import { validateTriangleMesh } from "../mesh/mesh.js";
|
|
4
4
|
import { resolveGeometryTolerance } from "../tolerance.js";
|
|
5
5
|
import { resolveSweepScales } from "./options.js";
|
|
@@ -63,8 +63,8 @@ export const buildClosedSweepMesh = (profile, path, options = {}) => {
|
|
|
63
63
|
const tangent = transportedFrames[ring].tangent;
|
|
64
64
|
const twist = twists?.[ring] ?? twistRadians * (ring / path.length);
|
|
65
65
|
const baseNormal = transportedFrames[ring].normal;
|
|
66
|
-
const normal =
|
|
67
|
-
const binormal =
|
|
66
|
+
const normal = rotateAroundAxis3Radians(baseNormal, tangent, twist);
|
|
67
|
+
const binormal = rotateAroundAxis3Radians(transportedFrames[ring].binormal, tangent, twist);
|
|
68
68
|
const [scaleX, scaleY] = scales[ring];
|
|
69
69
|
for (let profileIndex = 0; profileIndex < profile.length; profileIndex += 1) {
|
|
70
70
|
const [x, y] = profile[profileIndex];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { triangulateContour } from "../loft/loft.js";
|
|
2
|
-
import { add3,
|
|
2
|
+
import { add3, rotateAroundAxis3Radians, scale3 } from "../math/vector3.js";
|
|
3
3
|
import { validateTriangleMesh } from "../mesh/mesh.js";
|
|
4
4
|
import { resolveSweepScales } from "./options.js";
|
|
5
5
|
import { computeSweepFrames, validateSweepOptions } from "./orientation.js";
|
|
@@ -37,8 +37,8 @@ export const buildOpenSweepMesh = (profile, path, options = {}) => {
|
|
|
37
37
|
const point = path[ring];
|
|
38
38
|
const frame = frames[ring];
|
|
39
39
|
const twist = twists?.[ring] ?? (twistRadians * ring) / (path.length - 1);
|
|
40
|
-
const normal =
|
|
41
|
-
const binormal =
|
|
40
|
+
const normal = rotateAroundAxis3Radians(frame.normal, frame.tangent, twist);
|
|
41
|
+
const binormal = rotateAroundAxis3Radians(frame.binormal, frame.tangent, twist);
|
|
42
42
|
const [scaleX, scaleY] = scales[ring];
|
|
43
43
|
for (let profileIndex = 0; profileIndex < profile.length; profileIndex += 1) {
|
|
44
44
|
const [x, y] = profile[profileIndex];
|