brep-io-kernel 1.0.0-ci.10
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/LICENSE.md +32 -0
- package/README.md +157 -0
- package/dist-kernel/brep-kernel.js +74699 -0
- package/package.json +58 -0
- package/src/BREP/AssemblyComponent.js +42 -0
- package/src/BREP/BREP.js +43 -0
- package/src/BREP/BetterSolid.js +805 -0
- package/src/BREP/Edge.js +103 -0
- package/src/BREP/Extrude.js +403 -0
- package/src/BREP/Face.js +187 -0
- package/src/BREP/MeshRepairer.js +634 -0
- package/src/BREP/OffsetShellSolid.js +614 -0
- package/src/BREP/PointCloudWrap.js +302 -0
- package/src/BREP/Revolve.js +345 -0
- package/src/BREP/SolidMethods/authoring.js +112 -0
- package/src/BREP/SolidMethods/booleanOps.js +230 -0
- package/src/BREP/SolidMethods/chamfer.js +122 -0
- package/src/BREP/SolidMethods/edgeResolution.js +25 -0
- package/src/BREP/SolidMethods/fillet.js +792 -0
- package/src/BREP/SolidMethods/index.js +72 -0
- package/src/BREP/SolidMethods/io.js +105 -0
- package/src/BREP/SolidMethods/lifecycle.js +103 -0
- package/src/BREP/SolidMethods/manifoldOps.js +375 -0
- package/src/BREP/SolidMethods/meshCleanup.js +2512 -0
- package/src/BREP/SolidMethods/meshQueries.js +264 -0
- package/src/BREP/SolidMethods/metadata.js +106 -0
- package/src/BREP/SolidMethods/metrics.js +51 -0
- package/src/BREP/SolidMethods/transforms.js +361 -0
- package/src/BREP/SolidMethods/visualize.js +508 -0
- package/src/BREP/SolidShared.js +26 -0
- package/src/BREP/Sweep.js +1596 -0
- package/src/BREP/Tube.js +857 -0
- package/src/BREP/Vertex.js +43 -0
- package/src/BREP/applyBooleanOperation.js +704 -0
- package/src/BREP/boundsUtils.js +48 -0
- package/src/BREP/chamfer.js +551 -0
- package/src/BREP/edgePolylineUtils.js +85 -0
- package/src/BREP/fillets/common.js +388 -0
- package/src/BREP/fillets/fillet.js +1422 -0
- package/src/BREP/fillets/filletGeometry.js +15 -0
- package/src/BREP/fillets/inset.js +389 -0
- package/src/BREP/fillets/offsetHelper.js +143 -0
- package/src/BREP/fillets/outset.js +88 -0
- package/src/BREP/helix.js +193 -0
- package/src/BREP/meshToBrep.js +234 -0
- package/src/BREP/primitives.js +279 -0
- package/src/BREP/setupManifold.js +71 -0
- package/src/BREP/threadGeometry.js +1120 -0
- package/src/BREP/triangleUtils.js +8 -0
- package/src/BREP/triangulate.js +608 -0
- package/src/FeatureRegistry.js +183 -0
- package/src/PartHistory.js +1132 -0
- package/src/UI/AccordionWidget.js +292 -0
- package/src/UI/CADmaterials.js +850 -0
- package/src/UI/EnvMonacoEditor.js +522 -0
- package/src/UI/FloatingWindow.js +396 -0
- package/src/UI/HistoryWidget.js +457 -0
- package/src/UI/MainToolbar.js +131 -0
- package/src/UI/ModelLibraryView.js +194 -0
- package/src/UI/OrthoCameraIdle.js +206 -0
- package/src/UI/PluginsWidget.js +280 -0
- package/src/UI/SceneListing.js +606 -0
- package/src/UI/SelectionFilter.js +629 -0
- package/src/UI/ViewCube.js +389 -0
- package/src/UI/assembly/AssemblyConstraintCollectionWidget.js +329 -0
- package/src/UI/assembly/AssemblyConstraintControlsWidget.js +282 -0
- package/src/UI/assembly/AssemblyConstraintsWidget.css +292 -0
- package/src/UI/assembly/AssemblyConstraintsWidget.js +1373 -0
- package/src/UI/assembly/constraintFaceUtils.js +115 -0
- package/src/UI/assembly/constraintHighlightUtils.js +70 -0
- package/src/UI/assembly/constraintLabelUtils.js +31 -0
- package/src/UI/assembly/constraintPointUtils.js +64 -0
- package/src/UI/assembly/constraintSelectionUtils.js +185 -0
- package/src/UI/assembly/constraintStatusUtils.js +142 -0
- package/src/UI/componentSelectorModal.js +240 -0
- package/src/UI/controls/CombinedTransformControls.js +386 -0
- package/src/UI/dialogs.js +351 -0
- package/src/UI/expressionsManager.js +100 -0
- package/src/UI/featureDialogWidgets/booleanField.js +25 -0
- package/src/UI/featureDialogWidgets/booleanOperationField.js +97 -0
- package/src/UI/featureDialogWidgets/buttonField.js +45 -0
- package/src/UI/featureDialogWidgets/componentSelectorField.js +102 -0
- package/src/UI/featureDialogWidgets/defaultField.js +23 -0
- package/src/UI/featureDialogWidgets/fileField.js +66 -0
- package/src/UI/featureDialogWidgets/index.js +34 -0
- package/src/UI/featureDialogWidgets/numberField.js +165 -0
- package/src/UI/featureDialogWidgets/optionsField.js +33 -0
- package/src/UI/featureDialogWidgets/referenceSelectionField.js +208 -0
- package/src/UI/featureDialogWidgets/stringField.js +24 -0
- package/src/UI/featureDialogWidgets/textareaField.js +28 -0
- package/src/UI/featureDialogWidgets/threadDesignationField.js +160 -0
- package/src/UI/featureDialogWidgets/transformField.js +252 -0
- package/src/UI/featureDialogWidgets/utils.js +43 -0
- package/src/UI/featureDialogWidgets/vec3Field.js +133 -0
- package/src/UI/featureDialogs.js +1414 -0
- package/src/UI/fileManagerWidget.js +615 -0
- package/src/UI/history/HistoryCollectionWidget.js +1294 -0
- package/src/UI/history/historyCollectionWidget.css.js +257 -0
- package/src/UI/history/historyDisplayInfo.js +133 -0
- package/src/UI/mobile.js +28 -0
- package/src/UI/objectDump.js +442 -0
- package/src/UI/pmi/AnnotationCollectionWidget.js +120 -0
- package/src/UI/pmi/AnnotationHistory.js +353 -0
- package/src/UI/pmi/AnnotationRegistry.js +90 -0
- package/src/UI/pmi/BaseAnnotation.js +269 -0
- package/src/UI/pmi/LabelOverlay.css +102 -0
- package/src/UI/pmi/LabelOverlay.js +191 -0
- package/src/UI/pmi/PMIMode.js +1550 -0
- package/src/UI/pmi/PMIViewsWidget.js +1098 -0
- package/src/UI/pmi/annUtils.js +729 -0
- package/src/UI/pmi/dimensions/AngleDimensionAnnotation.js +647 -0
- package/src/UI/pmi/dimensions/ExplodeBodyAnnotation.js +507 -0
- package/src/UI/pmi/dimensions/HoleCalloutAnnotation.js +462 -0
- package/src/UI/pmi/dimensions/LeaderAnnotation.js +403 -0
- package/src/UI/pmi/dimensions/LinearDimensionAnnotation.js +532 -0
- package/src/UI/pmi/dimensions/NoteAnnotation.js +110 -0
- package/src/UI/pmi/dimensions/RadialDimensionAnnotation.js +659 -0
- package/src/UI/pmi/pmiStyle.js +44 -0
- package/src/UI/sketcher/SketchMode3D.js +4095 -0
- package/src/UI/sketcher/dimensions.js +674 -0
- package/src/UI/sketcher/glyphs.js +236 -0
- package/src/UI/sketcher/highlights.js +60 -0
- package/src/UI/toolbarButtons/aboutButton.js +5 -0
- package/src/UI/toolbarButtons/exportButton.js +609 -0
- package/src/UI/toolbarButtons/flatPatternButton.js +307 -0
- package/src/UI/toolbarButtons/importButton.js +160 -0
- package/src/UI/toolbarButtons/inspectorToggleButton.js +12 -0
- package/src/UI/toolbarButtons/metadataButton.js +1063 -0
- package/src/UI/toolbarButtons/orientToFaceButton.js +114 -0
- package/src/UI/toolbarButtons/registerDefaultButtons.js +46 -0
- package/src/UI/toolbarButtons/saveButton.js +99 -0
- package/src/UI/toolbarButtons/scriptRunnerButton.js +302 -0
- package/src/UI/toolbarButtons/testsButton.js +26 -0
- package/src/UI/toolbarButtons/undoRedoButtons.js +25 -0
- package/src/UI/toolbarButtons/wireframeToggleButton.js +5 -0
- package/src/UI/toolbarButtons/zoomToFitButton.js +5 -0
- package/src/UI/triangleDebuggerWindow.js +945 -0
- package/src/UI/viewer.js +4228 -0
- package/src/assemblyConstraints/AssemblyConstraintHistory.js +1576 -0
- package/src/assemblyConstraints/AssemblyConstraintRegistry.js +120 -0
- package/src/assemblyConstraints/BaseAssemblyConstraint.js +66 -0
- package/src/assemblyConstraints/constraintExpressionUtils.js +35 -0
- package/src/assemblyConstraints/constraintUtils/parallelAlignment.js +676 -0
- package/src/assemblyConstraints/constraints/AngleConstraint.js +485 -0
- package/src/assemblyConstraints/constraints/CoincidentConstraint.js +194 -0
- package/src/assemblyConstraints/constraints/DistanceConstraint.js +616 -0
- package/src/assemblyConstraints/constraints/FixedConstraint.js +78 -0
- package/src/assemblyConstraints/constraints/ParallelConstraint.js +252 -0
- package/src/assemblyConstraints/constraints/TouchAlignConstraint.js +961 -0
- package/src/core/entities/HistoryCollectionBase.js +72 -0
- package/src/core/entities/ListEntityBase.js +109 -0
- package/src/core/entities/schemaProcesser.js +121 -0
- package/src/exporters/sheetMetalFlatPattern.js +659 -0
- package/src/exporters/sheetMetalUnfold.js +862 -0
- package/src/exporters/step.js +1135 -0
- package/src/exporters/threeMF.js +575 -0
- package/src/features/assemblyComponent/AssemblyComponentFeature.js +780 -0
- package/src/features/boolean/BooleanFeature.js +94 -0
- package/src/features/chamfer/ChamferFeature.js +116 -0
- package/src/features/datium/DatiumFeature.js +80 -0
- package/src/features/edgeFeatureUtils.js +41 -0
- package/src/features/extrude/ExtrudeFeature.js +143 -0
- package/src/features/fillet/FilletFeature.js +197 -0
- package/src/features/helix/HelixFeature.js +405 -0
- package/src/features/hole/HoleFeature.js +1050 -0
- package/src/features/hole/screwClearance.js +86 -0
- package/src/features/hole/threadDesignationCatalog.js +149 -0
- package/src/features/imageHeightSolid/ImageHeightmapSolidFeature.js +463 -0
- package/src/features/imageToFace/ImageToFaceFeature.js +727 -0
- package/src/features/imageToFace/imageEditor.js +1270 -0
- package/src/features/imageToFace/traceUtils.js +971 -0
- package/src/features/import3dModel/Import3dModelFeature.js +151 -0
- package/src/features/loft/LoftFeature.js +605 -0
- package/src/features/mirror/MirrorFeature.js +151 -0
- package/src/features/offsetFace/OffsetFaceFeature.js +370 -0
- package/src/features/offsetShell/OffsetShellFeature.js +89 -0
- package/src/features/overlapCleanup/OverlapCleanupFeature.js +85 -0
- package/src/features/pattern/PatternFeature.js +275 -0
- package/src/features/patternLinear/PatternLinearFeature.js +120 -0
- package/src/features/patternRadial/PatternRadialFeature.js +186 -0
- package/src/features/plane/PlaneFeature.js +154 -0
- package/src/features/primitiveCone/primitiveConeFeature.js +99 -0
- package/src/features/primitiveCube/primitiveCubeFeature.js +70 -0
- package/src/features/primitiveCylinder/primitiveCylinderFeature.js +91 -0
- package/src/features/primitivePyramid/primitivePyramidFeature.js +72 -0
- package/src/features/primitiveSphere/primitiveSphereFeature.js +62 -0
- package/src/features/primitiveTorus/primitiveTorusFeature.js +109 -0
- package/src/features/remesh/RemeshFeature.js +97 -0
- package/src/features/revolve/RevolveFeature.js +111 -0
- package/src/features/selectionUtils.js +118 -0
- package/src/features/sheetMetal/SheetMetalContourFlangeFeature.js +1656 -0
- package/src/features/sheetMetal/SheetMetalCutoutFeature.js +1056 -0
- package/src/features/sheetMetal/SheetMetalFlangeFeature.js +1568 -0
- package/src/features/sheetMetal/SheetMetalHemFeature.js +43 -0
- package/src/features/sheetMetal/SheetMetalObject.js +141 -0
- package/src/features/sheetMetal/SheetMetalTabFeature.js +176 -0
- package/src/features/sheetMetal/UNFOLD_NEUTRAL_REQUIREMENTS.md +153 -0
- package/src/features/sheetMetal/contour-flange-rebuild-spec.md +261 -0
- package/src/features/sheetMetal/profileUtils.js +25 -0
- package/src/features/sheetMetal/sheetMetalCleanup.js +9 -0
- package/src/features/sheetMetal/sheetMetalFaceTypes.js +146 -0
- package/src/features/sheetMetal/sheetMetalMetadata.js +165 -0
- package/src/features/sheetMetal/sheetMetalPipeline.js +169 -0
- package/src/features/sheetMetal/sheetMetalProfileUtils.js +216 -0
- package/src/features/sheetMetal/sheetMetalTabUtils.js +29 -0
- package/src/features/sheetMetal/sheetMetalTree.js +210 -0
- package/src/features/sketch/SketchFeature.js +955 -0
- package/src/features/sketch/sketchSolver2D/ConstraintEngine.js +800 -0
- package/src/features/sketch/sketchSolver2D/constraintDefinitions.js +704 -0
- package/src/features/sketch/sketchSolver2D/mathHelpersMod.js +307 -0
- package/src/features/spline/SplineEditorSession.js +988 -0
- package/src/features/spline/SplineFeature.js +1388 -0
- package/src/features/spline/splineUtils.js +218 -0
- package/src/features/sweep/SweepFeature.js +110 -0
- package/src/features/transform/TransformFeature.js +152 -0
- package/src/features/tube/TubeFeature.js +635 -0
- package/src/fs.proxy.js +625 -0
- package/src/idbStorage.js +254 -0
- package/src/index.js +12 -0
- package/src/main.js +15 -0
- package/src/metadataManager.js +64 -0
- package/src/path.proxy.js +277 -0
- package/src/plugins/ghLoader.worker.js +151 -0
- package/src/plugins/pluginManager.js +286 -0
- package/src/pmi/PMIViewsManager.js +134 -0
- package/src/services/componentLibrary.js +198 -0
- package/src/tests/ConsoleCapture.js +189 -0
- package/src/tests/S7-diagnostics-2025-12-23T18-37-23-570Z.json +630 -0
- package/src/tests/browserTests.js +597 -0
- package/src/tests/debugBoolean.js +225 -0
- package/src/tests/partFiles/badBoolean.json +957 -0
- package/src/tests/partFiles/extrudeTest.json +88 -0
- package/src/tests/partFiles/filletFail.json +58 -0
- package/src/tests/partFiles/import_TEst.part.part.json +646 -0
- package/src/tests/partFiles/sheetMetalHem.BREP.json +734 -0
- package/src/tests/test_boolean_subtract.js +27 -0
- package/src/tests/test_chamfer.js +17 -0
- package/src/tests/test_extrudeFace.js +24 -0
- package/src/tests/test_fillet.js +17 -0
- package/src/tests/test_fillet_nonClosed.js +45 -0
- package/src/tests/test_filletsMoreDifficult.js +46 -0
- package/src/tests/test_history_features_basic.js +149 -0
- package/src/tests/test_hole.js +282 -0
- package/src/tests/test_mirror.js +16 -0
- package/src/tests/test_offsetShellGrouping.js +85 -0
- package/src/tests/test_plane.js +4 -0
- package/src/tests/test_primitiveCone.js +11 -0
- package/src/tests/test_primitiveCube.js +7 -0
- package/src/tests/test_primitiveCylinder.js +8 -0
- package/src/tests/test_primitivePyramid.js +9 -0
- package/src/tests/test_primitiveSphere.js +17 -0
- package/src/tests/test_primitiveTorus.js +21 -0
- package/src/tests/test_pushFace.js +126 -0
- package/src/tests/test_sheetMetalContourFlange.js +125 -0
- package/src/tests/test_sheetMetal_features.js +80 -0
- package/src/tests/test_sketch_openLoop.js +45 -0
- package/src/tests/test_solidMetrics.js +58 -0
- package/src/tests/test_stlLoader.js +1889 -0
- package/src/tests/test_sweepFace.js +55 -0
- package/src/tests/test_tube.js +45 -0
- package/src/tests/test_tube_closedLoop.js +67 -0
- package/src/tests/tests.js +493 -0
- package/src/tools/assemblyConstraintDialogCapturePage.js +56 -0
- package/src/tools/dialogCapturePageFactory.js +227 -0
- package/src/tools/featureDialogCapturePage.js +47 -0
- package/src/tools/pmiAnnotationDialogCapturePage.js +60 -0
- package/src/utils/axisHelpers.js +99 -0
- package/src/utils/deepClone.js +69 -0
- package/src/utils/geometryTolerance.js +37 -0
- package/src/utils/normalizeTypeString.js +8 -0
- package/src/utils/xformMath.js +51 -0
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
export function getIntersectionPoint(point1, point2, point3, point4, offset = 0) {
|
|
2
|
+
// Original Line 1 points
|
|
3
|
+
let x1 = point1.x, y1 = point1.y;
|
|
4
|
+
let x2 = point2.x, y2 = point2.y;
|
|
5
|
+
|
|
6
|
+
// Original Line 2 points
|
|
7
|
+
let x3 = point3.x, y3 = point3.y;
|
|
8
|
+
let x4 = point4.x, y4 = point4.y;
|
|
9
|
+
|
|
10
|
+
// Calculate direction vectors
|
|
11
|
+
let dir1 = { x: x2 - x1, y: y2 - y1 };
|
|
12
|
+
let dir2 = { x: x4 - x3, y: y4 - y3 };
|
|
13
|
+
|
|
14
|
+
// Normalize direction vectors
|
|
15
|
+
let mag1 = Math.sqrt(dir1.x * dir1.x + dir1.y * dir1.y);
|
|
16
|
+
let mag2 = Math.sqrt(dir2.x * dir2.x + dir2.y * dir2.y);
|
|
17
|
+
|
|
18
|
+
let unitDir1 = { x: dir1.x / mag1, y: dir1.y / mag1 };
|
|
19
|
+
let unitDir2 = { x: dir2.x / mag2, y: dir2.y / mag2 };
|
|
20
|
+
|
|
21
|
+
// Calculate offset points for Line 1
|
|
22
|
+
let offsetPoint1 = { x: x1 + offset * unitDir1.y, y: y1 - offset * unitDir1.x };
|
|
23
|
+
let offsetPoint2 = { x: x2 + offset * unitDir1.y, y: y2 - offset * unitDir1.x };
|
|
24
|
+
|
|
25
|
+
// Calculate offset points for Line 2
|
|
26
|
+
let offsetPoint3 = { x: x3 - offset * unitDir2.y, y: y3 + offset * unitDir2.x };
|
|
27
|
+
let offsetPoint4 = { x: x4 - offset * unitDir2.y, y: y4 + offset * unitDir2.x };
|
|
28
|
+
|
|
29
|
+
// Calculate line equations Ax + By = C for offset lines
|
|
30
|
+
let A1 = offsetPoint2.y - offsetPoint1.y;
|
|
31
|
+
let B1 = offsetPoint1.x - offsetPoint2.x;
|
|
32
|
+
let C1 = A1 * offsetPoint1.x + B1 * offsetPoint1.y;
|
|
33
|
+
|
|
34
|
+
let A2 = offsetPoint4.y - offsetPoint3.y;
|
|
35
|
+
let B2 = offsetPoint3.x - offsetPoint4.x;
|
|
36
|
+
let C2 = A2 * offsetPoint3.x + B2 * offsetPoint3.y;
|
|
37
|
+
|
|
38
|
+
// Calculate intersection
|
|
39
|
+
let det = A1 * B2 - A2 * B1;
|
|
40
|
+
if (det === 0) {
|
|
41
|
+
return null; // Lines are parallel
|
|
42
|
+
} else {
|
|
43
|
+
let x = (B2 * C1 - B1 * C2) / det;
|
|
44
|
+
let y = (A1 * C2 - A2 * C1) / det;
|
|
45
|
+
return { x, y };
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
export function distance(point1, point2) {
|
|
55
|
+
return Math.sqrt(Math.pow(point1.x - point2.x, 2) + Math.pow(point1.y - point2.y, 2));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
export function polarToCartesian(centerX, centerY, radius, angleInDegrees) {
|
|
64
|
+
const angleInRadians = angleInDegrees * Math.PI / 180.0; // Removed the - 90
|
|
65
|
+
return {
|
|
66
|
+
x: centerX + (radius * Math.cos(angleInRadians)),
|
|
67
|
+
y: centerY + (radius * Math.sin(angleInRadians))
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
export function describeArc(x, y, radius, startAngle, endAngle) {
|
|
73
|
+
if (startAngle === endAngle) {
|
|
74
|
+
// Draw a full circle as two arcs (SVG doesn't allow a single arc to draw a full circle)
|
|
75
|
+
return [
|
|
76
|
+
"M", x + radius, y,
|
|
77
|
+
"A", radius, radius, 0, 0, 1, x - radius, y,
|
|
78
|
+
"A", radius, radius, 0, 0, 1, x + radius, y
|
|
79
|
+
].join(" ");
|
|
80
|
+
} else {
|
|
81
|
+
const start = polarToCartesian(x, y, radius, startAngle);
|
|
82
|
+
const end = polarToCartesian(x, y, radius, endAngle);
|
|
83
|
+
const largeArcFlag = ((endAngle - startAngle) + 360) % 360 <= 180 ? "0" : "1";
|
|
84
|
+
const sweepFlag = "1"; // Always draw the arc in a "positive-angle" direction
|
|
85
|
+
|
|
86
|
+
return [
|
|
87
|
+
"M", start.x, start.y,
|
|
88
|
+
"A", radius, radius, 0, largeArcFlag, sweepFlag, end.x, end.y
|
|
89
|
+
].join(" ");
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export function findMidpointOnArc(x, y, radius, startAngle, endAngle) {
|
|
94
|
+
if (startAngle === endAngle) {
|
|
95
|
+
// For a full circle, the midpoint is the center
|
|
96
|
+
return { x: x, y: y };
|
|
97
|
+
} else {
|
|
98
|
+
const adjustedStartAngle = startAngle % 360;
|
|
99
|
+
const adjustedEndAngle = endAngle % 360;
|
|
100
|
+
let midpointAngle;
|
|
101
|
+
|
|
102
|
+
if (adjustedStartAngle <= adjustedEndAngle) {
|
|
103
|
+
midpointAngle = (adjustedStartAngle + adjustedEndAngle) / 2;
|
|
104
|
+
} else {
|
|
105
|
+
// Handle the case where the arc crosses the 0-degree line
|
|
106
|
+
midpointAngle = ((adjustedStartAngle + adjustedEndAngle + 360) / 2) % 360;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return polarToCartesian(x, y, radius, midpointAngle);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
export function calculateAngle(point1, point2) {
|
|
113
|
+
const dx = point2.x - point1.x;
|
|
114
|
+
const dy = point2.y - point1.y;
|
|
115
|
+
const angle = Math.atan2(dy, dx) * 180 / Math.PI;
|
|
116
|
+
return (angle + 360) % 360; // Normalize to [0, 360)
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export function rotatePoint(center, point, angleDeg) {
|
|
120
|
+
const angleRad = (angleDeg % 360) * (Math.PI / 180); // Normalize to [0, 360)
|
|
121
|
+
const { x: x1, y: y1 } = center;
|
|
122
|
+
const { x: x2, y: y2 } = point;
|
|
123
|
+
const xRotated = (x2 - x1) * Math.cos(angleRad) - (y2 - y1) * Math.sin(angleRad) + x1;
|
|
124
|
+
const yRotated = (x2 - x1) * Math.sin(angleRad) + (y2 - y1) * Math.cos(angleRad) + y1;
|
|
125
|
+
point.x = xRotated;
|
|
126
|
+
point.y = yRotated;
|
|
127
|
+
return { x: xRotated, y: yRotated };
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
export function offsetLine(arrayOfPoints, distance) {
|
|
133
|
+
// Extract the points from the array
|
|
134
|
+
const [point1, point2] = arrayOfPoints;
|
|
135
|
+
|
|
136
|
+
// Calculate the direction vector of the line
|
|
137
|
+
const dx = point2.x - point1.x;
|
|
138
|
+
const dy = point2.y - point1.y;
|
|
139
|
+
|
|
140
|
+
// Normalize the direction vector
|
|
141
|
+
const length = Math.sqrt(dx * dx + dy * dy);
|
|
142
|
+
const dxNormalized = dx / length;
|
|
143
|
+
const dyNormalized = dy / length;
|
|
144
|
+
|
|
145
|
+
// Calculate the offset vector
|
|
146
|
+
const dxOffset = dyNormalized * distance;
|
|
147
|
+
const dyOffset = -dxNormalized * distance;
|
|
148
|
+
|
|
149
|
+
// Create the new offset points
|
|
150
|
+
const offsetPoint1 = { x: point1.x + dxOffset, y: point1.y + dyOffset };
|
|
151
|
+
const offsetPoint2 = { x: point2.x + dxOffset, y: point2.y + dyOffset };
|
|
152
|
+
|
|
153
|
+
// Return the new offset points in an array
|
|
154
|
+
return [offsetPoint1, offsetPoint2];
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
export function coinToss() {
|
|
160
|
+
return Math.random() < 0.5;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
export function shuffle(array) {
|
|
165
|
+
var currentIndex = array.length, temporaryValue, randomIndex;
|
|
166
|
+
|
|
167
|
+
// While there remain elements to shuffle
|
|
168
|
+
while (0 !== currentIndex) {
|
|
169
|
+
|
|
170
|
+
// Pick a remaining element
|
|
171
|
+
randomIndex = Math.floor(Math.random() * currentIndex);
|
|
172
|
+
currentIndex -= 1;
|
|
173
|
+
|
|
174
|
+
// And swap it with the current element
|
|
175
|
+
temporaryValue = array[currentIndex];
|
|
176
|
+
array[currentIndex] = array[randomIndex];
|
|
177
|
+
array[randomIndex] = temporaryValue;
|
|
178
|
+
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
return array;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
export function shuffleArray(originalArray) {
|
|
186
|
+
// Creating a shallow copy of the original array
|
|
187
|
+
const array = [...originalArray];
|
|
188
|
+
for (let i = array.length - 1; i > 0; i--) {
|
|
189
|
+
// Generate a random index lower than the current index
|
|
190
|
+
const j = Math.floor(Math.random() * (i + 1));
|
|
191
|
+
// Swap elements at indices i and j
|
|
192
|
+
[array[i], array[j]] = [array[j], array[i]];
|
|
193
|
+
}
|
|
194
|
+
return array;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
export function roundToDecimals(number, decimals) {
|
|
199
|
+
return Math.round(number * Math.pow(10, decimals)) / Math.pow(10, decimals);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
export function calcPerpendicularDistanceLineToPoint(linePoints, point) {
|
|
205
|
+
const [pointA, pointB] = linePoints;
|
|
206
|
+
|
|
207
|
+
// Calculate the direction vector of the line
|
|
208
|
+
const dirX = pointB.x - pointA.x;
|
|
209
|
+
const dirY = pointB.y - pointA.y;
|
|
210
|
+
|
|
211
|
+
// Calculate the vector from pointA to the point
|
|
212
|
+
const vecX = point.x - pointA.x;
|
|
213
|
+
const vecY = point.y - pointA.y;
|
|
214
|
+
|
|
215
|
+
// Calculate the projection of the point onto the line
|
|
216
|
+
const t = (vecX * dirX + vecY * dirY) / (dirX * dirX + dirY * dirY);
|
|
217
|
+
const projX = pointA.x + t * dirX;
|
|
218
|
+
const projY = pointA.y + t * dirY;
|
|
219
|
+
|
|
220
|
+
// Calculate the vector from the point to its projection on the line
|
|
221
|
+
const perpX = projX - point.x;
|
|
222
|
+
const perpY = projY - point.y;
|
|
223
|
+
|
|
224
|
+
// Calculate the perpendicular distance
|
|
225
|
+
const perpDistance = Math.sqrt(perpX * perpX + perpY * perpY);
|
|
226
|
+
|
|
227
|
+
// Calculate the cross product to determine the side
|
|
228
|
+
const crossProduct = dirX * vecY - dirY * vecX;
|
|
229
|
+
|
|
230
|
+
// Use the sign of the cross product to set the sign of the distance
|
|
231
|
+
const signedPerpDistance = crossProduct >= 0 ? perpDistance : -perpDistance;
|
|
232
|
+
|
|
233
|
+
return signedPerpDistance * -1;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
/// take an array of points and return the average point
|
|
238
|
+
export function averagePoint(points) {
|
|
239
|
+
let x = 0;
|
|
240
|
+
let y = 0;
|
|
241
|
+
points.forEach(p => {
|
|
242
|
+
x += p.x;
|
|
243
|
+
y += p.y;
|
|
244
|
+
});
|
|
245
|
+
return { x: x / points.length, y: y / points.length };
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Function to calculate the intersection point of two lines
|
|
249
|
+
export function lineIntersection(line1, line2) {
|
|
250
|
+
const [{ x: x1, y: y1 }, { x: x2, y: y2 }] = line1;
|
|
251
|
+
const [{ x: x3, y: y3 }, { x: x4, y: y4 }] = line2;
|
|
252
|
+
|
|
253
|
+
const det = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);
|
|
254
|
+
if (det === 0) return null; // Lines are parallel
|
|
255
|
+
|
|
256
|
+
const px = ((x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4)) / det;
|
|
257
|
+
const py = ((x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4)) / det;
|
|
258
|
+
|
|
259
|
+
return { x: px, y: py };
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
export function findArcIntersections(centerPoint, radius, line) {
|
|
263
|
+
const [point1, point2] = line;
|
|
264
|
+
|
|
265
|
+
// Check if the line is vertical (x1 === x2) or horizontal (y1 === y2)
|
|
266
|
+
if (point1.x === point2.x) {
|
|
267
|
+
// Vertical line, solve for x directly
|
|
268
|
+
const x = point1.x;
|
|
269
|
+
const y1 = centerPoint.y + Math.sqrt(radius * radius - (x - centerPoint.x) * (x - centerPoint.x));
|
|
270
|
+
const y2 = centerPoint.y - Math.sqrt(radius * radius - (x - centerPoint.x) * (x - centerPoint.x));
|
|
271
|
+
return [{ x, y: y1 }, { x, y: y2 }];
|
|
272
|
+
} else if (point1.y === point2.y) {
|
|
273
|
+
// Horizontal line, solve for y directly
|
|
274
|
+
const y = point1.y;
|
|
275
|
+
const x1 = centerPoint.x + Math.sqrt(radius * radius - (y - centerPoint.y) * (y - centerPoint.y));
|
|
276
|
+
const x2 = centerPoint.x - Math.sqrt(radius * radius - (y - centerPoint.y) * (y - centerPoint.y));
|
|
277
|
+
return [{ x: x1, y }, { x: x2, y }];
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// For non-vertical and non-horizontal lines, continue with your existing code
|
|
281
|
+
const m = (point2.y - point1.y) / (point2.x - point1.x);
|
|
282
|
+
const b = point1.y - m * point1.x;
|
|
283
|
+
|
|
284
|
+
const h = centerPoint.x;
|
|
285
|
+
const k = centerPoint.y;
|
|
286
|
+
|
|
287
|
+
const a = 1 + m * m;
|
|
288
|
+
const b2 = 2 * (m * (b - k) - h);
|
|
289
|
+
const c = h * h + (b - k) * (b - k) - radius * radius;
|
|
290
|
+
|
|
291
|
+
const discriminant = b2 * b2 - 4 * a * c;
|
|
292
|
+
|
|
293
|
+
if (discriminant < 0) {
|
|
294
|
+
return []; // No intersection
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
const x1 = (-b2 + Math.sqrt(discriminant)) / (2 * a);
|
|
298
|
+
const x2 = (-b2 - Math.sqrt(discriminant)) / (2 * a);
|
|
299
|
+
|
|
300
|
+
const y1 = m * x1 + b;
|
|
301
|
+
const y2 = m * x2 + b;
|
|
302
|
+
|
|
303
|
+
return [
|
|
304
|
+
{ x: x1, y: y1 },
|
|
305
|
+
{ x: x2, y: y2 }
|
|
306
|
+
];
|
|
307
|
+
}
|