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.
Files changed (271) hide show
  1. package/LICENSE.md +32 -0
  2. package/README.md +157 -0
  3. package/dist-kernel/brep-kernel.js +74699 -0
  4. package/package.json +58 -0
  5. package/src/BREP/AssemblyComponent.js +42 -0
  6. package/src/BREP/BREP.js +43 -0
  7. package/src/BREP/BetterSolid.js +805 -0
  8. package/src/BREP/Edge.js +103 -0
  9. package/src/BREP/Extrude.js +403 -0
  10. package/src/BREP/Face.js +187 -0
  11. package/src/BREP/MeshRepairer.js +634 -0
  12. package/src/BREP/OffsetShellSolid.js +614 -0
  13. package/src/BREP/PointCloudWrap.js +302 -0
  14. package/src/BREP/Revolve.js +345 -0
  15. package/src/BREP/SolidMethods/authoring.js +112 -0
  16. package/src/BREP/SolidMethods/booleanOps.js +230 -0
  17. package/src/BREP/SolidMethods/chamfer.js +122 -0
  18. package/src/BREP/SolidMethods/edgeResolution.js +25 -0
  19. package/src/BREP/SolidMethods/fillet.js +792 -0
  20. package/src/BREP/SolidMethods/index.js +72 -0
  21. package/src/BREP/SolidMethods/io.js +105 -0
  22. package/src/BREP/SolidMethods/lifecycle.js +103 -0
  23. package/src/BREP/SolidMethods/manifoldOps.js +375 -0
  24. package/src/BREP/SolidMethods/meshCleanup.js +2512 -0
  25. package/src/BREP/SolidMethods/meshQueries.js +264 -0
  26. package/src/BREP/SolidMethods/metadata.js +106 -0
  27. package/src/BREP/SolidMethods/metrics.js +51 -0
  28. package/src/BREP/SolidMethods/transforms.js +361 -0
  29. package/src/BREP/SolidMethods/visualize.js +508 -0
  30. package/src/BREP/SolidShared.js +26 -0
  31. package/src/BREP/Sweep.js +1596 -0
  32. package/src/BREP/Tube.js +857 -0
  33. package/src/BREP/Vertex.js +43 -0
  34. package/src/BREP/applyBooleanOperation.js +704 -0
  35. package/src/BREP/boundsUtils.js +48 -0
  36. package/src/BREP/chamfer.js +551 -0
  37. package/src/BREP/edgePolylineUtils.js +85 -0
  38. package/src/BREP/fillets/common.js +388 -0
  39. package/src/BREP/fillets/fillet.js +1422 -0
  40. package/src/BREP/fillets/filletGeometry.js +15 -0
  41. package/src/BREP/fillets/inset.js +389 -0
  42. package/src/BREP/fillets/offsetHelper.js +143 -0
  43. package/src/BREP/fillets/outset.js +88 -0
  44. package/src/BREP/helix.js +193 -0
  45. package/src/BREP/meshToBrep.js +234 -0
  46. package/src/BREP/primitives.js +279 -0
  47. package/src/BREP/setupManifold.js +71 -0
  48. package/src/BREP/threadGeometry.js +1120 -0
  49. package/src/BREP/triangleUtils.js +8 -0
  50. package/src/BREP/triangulate.js +608 -0
  51. package/src/FeatureRegistry.js +183 -0
  52. package/src/PartHistory.js +1132 -0
  53. package/src/UI/AccordionWidget.js +292 -0
  54. package/src/UI/CADmaterials.js +850 -0
  55. package/src/UI/EnvMonacoEditor.js +522 -0
  56. package/src/UI/FloatingWindow.js +396 -0
  57. package/src/UI/HistoryWidget.js +457 -0
  58. package/src/UI/MainToolbar.js +131 -0
  59. package/src/UI/ModelLibraryView.js +194 -0
  60. package/src/UI/OrthoCameraIdle.js +206 -0
  61. package/src/UI/PluginsWidget.js +280 -0
  62. package/src/UI/SceneListing.js +606 -0
  63. package/src/UI/SelectionFilter.js +629 -0
  64. package/src/UI/ViewCube.js +389 -0
  65. package/src/UI/assembly/AssemblyConstraintCollectionWidget.js +329 -0
  66. package/src/UI/assembly/AssemblyConstraintControlsWidget.js +282 -0
  67. package/src/UI/assembly/AssemblyConstraintsWidget.css +292 -0
  68. package/src/UI/assembly/AssemblyConstraintsWidget.js +1373 -0
  69. package/src/UI/assembly/constraintFaceUtils.js +115 -0
  70. package/src/UI/assembly/constraintHighlightUtils.js +70 -0
  71. package/src/UI/assembly/constraintLabelUtils.js +31 -0
  72. package/src/UI/assembly/constraintPointUtils.js +64 -0
  73. package/src/UI/assembly/constraintSelectionUtils.js +185 -0
  74. package/src/UI/assembly/constraintStatusUtils.js +142 -0
  75. package/src/UI/componentSelectorModal.js +240 -0
  76. package/src/UI/controls/CombinedTransformControls.js +386 -0
  77. package/src/UI/dialogs.js +351 -0
  78. package/src/UI/expressionsManager.js +100 -0
  79. package/src/UI/featureDialogWidgets/booleanField.js +25 -0
  80. package/src/UI/featureDialogWidgets/booleanOperationField.js +97 -0
  81. package/src/UI/featureDialogWidgets/buttonField.js +45 -0
  82. package/src/UI/featureDialogWidgets/componentSelectorField.js +102 -0
  83. package/src/UI/featureDialogWidgets/defaultField.js +23 -0
  84. package/src/UI/featureDialogWidgets/fileField.js +66 -0
  85. package/src/UI/featureDialogWidgets/index.js +34 -0
  86. package/src/UI/featureDialogWidgets/numberField.js +165 -0
  87. package/src/UI/featureDialogWidgets/optionsField.js +33 -0
  88. package/src/UI/featureDialogWidgets/referenceSelectionField.js +208 -0
  89. package/src/UI/featureDialogWidgets/stringField.js +24 -0
  90. package/src/UI/featureDialogWidgets/textareaField.js +28 -0
  91. package/src/UI/featureDialogWidgets/threadDesignationField.js +160 -0
  92. package/src/UI/featureDialogWidgets/transformField.js +252 -0
  93. package/src/UI/featureDialogWidgets/utils.js +43 -0
  94. package/src/UI/featureDialogWidgets/vec3Field.js +133 -0
  95. package/src/UI/featureDialogs.js +1414 -0
  96. package/src/UI/fileManagerWidget.js +615 -0
  97. package/src/UI/history/HistoryCollectionWidget.js +1294 -0
  98. package/src/UI/history/historyCollectionWidget.css.js +257 -0
  99. package/src/UI/history/historyDisplayInfo.js +133 -0
  100. package/src/UI/mobile.js +28 -0
  101. package/src/UI/objectDump.js +442 -0
  102. package/src/UI/pmi/AnnotationCollectionWidget.js +120 -0
  103. package/src/UI/pmi/AnnotationHistory.js +353 -0
  104. package/src/UI/pmi/AnnotationRegistry.js +90 -0
  105. package/src/UI/pmi/BaseAnnotation.js +269 -0
  106. package/src/UI/pmi/LabelOverlay.css +102 -0
  107. package/src/UI/pmi/LabelOverlay.js +191 -0
  108. package/src/UI/pmi/PMIMode.js +1550 -0
  109. package/src/UI/pmi/PMIViewsWidget.js +1098 -0
  110. package/src/UI/pmi/annUtils.js +729 -0
  111. package/src/UI/pmi/dimensions/AngleDimensionAnnotation.js +647 -0
  112. package/src/UI/pmi/dimensions/ExplodeBodyAnnotation.js +507 -0
  113. package/src/UI/pmi/dimensions/HoleCalloutAnnotation.js +462 -0
  114. package/src/UI/pmi/dimensions/LeaderAnnotation.js +403 -0
  115. package/src/UI/pmi/dimensions/LinearDimensionAnnotation.js +532 -0
  116. package/src/UI/pmi/dimensions/NoteAnnotation.js +110 -0
  117. package/src/UI/pmi/dimensions/RadialDimensionAnnotation.js +659 -0
  118. package/src/UI/pmi/pmiStyle.js +44 -0
  119. package/src/UI/sketcher/SketchMode3D.js +4095 -0
  120. package/src/UI/sketcher/dimensions.js +674 -0
  121. package/src/UI/sketcher/glyphs.js +236 -0
  122. package/src/UI/sketcher/highlights.js +60 -0
  123. package/src/UI/toolbarButtons/aboutButton.js +5 -0
  124. package/src/UI/toolbarButtons/exportButton.js +609 -0
  125. package/src/UI/toolbarButtons/flatPatternButton.js +307 -0
  126. package/src/UI/toolbarButtons/importButton.js +160 -0
  127. package/src/UI/toolbarButtons/inspectorToggleButton.js +12 -0
  128. package/src/UI/toolbarButtons/metadataButton.js +1063 -0
  129. package/src/UI/toolbarButtons/orientToFaceButton.js +114 -0
  130. package/src/UI/toolbarButtons/registerDefaultButtons.js +46 -0
  131. package/src/UI/toolbarButtons/saveButton.js +99 -0
  132. package/src/UI/toolbarButtons/scriptRunnerButton.js +302 -0
  133. package/src/UI/toolbarButtons/testsButton.js +26 -0
  134. package/src/UI/toolbarButtons/undoRedoButtons.js +25 -0
  135. package/src/UI/toolbarButtons/wireframeToggleButton.js +5 -0
  136. package/src/UI/toolbarButtons/zoomToFitButton.js +5 -0
  137. package/src/UI/triangleDebuggerWindow.js +945 -0
  138. package/src/UI/viewer.js +4228 -0
  139. package/src/assemblyConstraints/AssemblyConstraintHistory.js +1576 -0
  140. package/src/assemblyConstraints/AssemblyConstraintRegistry.js +120 -0
  141. package/src/assemblyConstraints/BaseAssemblyConstraint.js +66 -0
  142. package/src/assemblyConstraints/constraintExpressionUtils.js +35 -0
  143. package/src/assemblyConstraints/constraintUtils/parallelAlignment.js +676 -0
  144. package/src/assemblyConstraints/constraints/AngleConstraint.js +485 -0
  145. package/src/assemblyConstraints/constraints/CoincidentConstraint.js +194 -0
  146. package/src/assemblyConstraints/constraints/DistanceConstraint.js +616 -0
  147. package/src/assemblyConstraints/constraints/FixedConstraint.js +78 -0
  148. package/src/assemblyConstraints/constraints/ParallelConstraint.js +252 -0
  149. package/src/assemblyConstraints/constraints/TouchAlignConstraint.js +961 -0
  150. package/src/core/entities/HistoryCollectionBase.js +72 -0
  151. package/src/core/entities/ListEntityBase.js +109 -0
  152. package/src/core/entities/schemaProcesser.js +121 -0
  153. package/src/exporters/sheetMetalFlatPattern.js +659 -0
  154. package/src/exporters/sheetMetalUnfold.js +862 -0
  155. package/src/exporters/step.js +1135 -0
  156. package/src/exporters/threeMF.js +575 -0
  157. package/src/features/assemblyComponent/AssemblyComponentFeature.js +780 -0
  158. package/src/features/boolean/BooleanFeature.js +94 -0
  159. package/src/features/chamfer/ChamferFeature.js +116 -0
  160. package/src/features/datium/DatiumFeature.js +80 -0
  161. package/src/features/edgeFeatureUtils.js +41 -0
  162. package/src/features/extrude/ExtrudeFeature.js +143 -0
  163. package/src/features/fillet/FilletFeature.js +197 -0
  164. package/src/features/helix/HelixFeature.js +405 -0
  165. package/src/features/hole/HoleFeature.js +1050 -0
  166. package/src/features/hole/screwClearance.js +86 -0
  167. package/src/features/hole/threadDesignationCatalog.js +149 -0
  168. package/src/features/imageHeightSolid/ImageHeightmapSolidFeature.js +463 -0
  169. package/src/features/imageToFace/ImageToFaceFeature.js +727 -0
  170. package/src/features/imageToFace/imageEditor.js +1270 -0
  171. package/src/features/imageToFace/traceUtils.js +971 -0
  172. package/src/features/import3dModel/Import3dModelFeature.js +151 -0
  173. package/src/features/loft/LoftFeature.js +605 -0
  174. package/src/features/mirror/MirrorFeature.js +151 -0
  175. package/src/features/offsetFace/OffsetFaceFeature.js +370 -0
  176. package/src/features/offsetShell/OffsetShellFeature.js +89 -0
  177. package/src/features/overlapCleanup/OverlapCleanupFeature.js +85 -0
  178. package/src/features/pattern/PatternFeature.js +275 -0
  179. package/src/features/patternLinear/PatternLinearFeature.js +120 -0
  180. package/src/features/patternRadial/PatternRadialFeature.js +186 -0
  181. package/src/features/plane/PlaneFeature.js +154 -0
  182. package/src/features/primitiveCone/primitiveConeFeature.js +99 -0
  183. package/src/features/primitiveCube/primitiveCubeFeature.js +70 -0
  184. package/src/features/primitiveCylinder/primitiveCylinderFeature.js +91 -0
  185. package/src/features/primitivePyramid/primitivePyramidFeature.js +72 -0
  186. package/src/features/primitiveSphere/primitiveSphereFeature.js +62 -0
  187. package/src/features/primitiveTorus/primitiveTorusFeature.js +109 -0
  188. package/src/features/remesh/RemeshFeature.js +97 -0
  189. package/src/features/revolve/RevolveFeature.js +111 -0
  190. package/src/features/selectionUtils.js +118 -0
  191. package/src/features/sheetMetal/SheetMetalContourFlangeFeature.js +1656 -0
  192. package/src/features/sheetMetal/SheetMetalCutoutFeature.js +1056 -0
  193. package/src/features/sheetMetal/SheetMetalFlangeFeature.js +1568 -0
  194. package/src/features/sheetMetal/SheetMetalHemFeature.js +43 -0
  195. package/src/features/sheetMetal/SheetMetalObject.js +141 -0
  196. package/src/features/sheetMetal/SheetMetalTabFeature.js +176 -0
  197. package/src/features/sheetMetal/UNFOLD_NEUTRAL_REQUIREMENTS.md +153 -0
  198. package/src/features/sheetMetal/contour-flange-rebuild-spec.md +261 -0
  199. package/src/features/sheetMetal/profileUtils.js +25 -0
  200. package/src/features/sheetMetal/sheetMetalCleanup.js +9 -0
  201. package/src/features/sheetMetal/sheetMetalFaceTypes.js +146 -0
  202. package/src/features/sheetMetal/sheetMetalMetadata.js +165 -0
  203. package/src/features/sheetMetal/sheetMetalPipeline.js +169 -0
  204. package/src/features/sheetMetal/sheetMetalProfileUtils.js +216 -0
  205. package/src/features/sheetMetal/sheetMetalTabUtils.js +29 -0
  206. package/src/features/sheetMetal/sheetMetalTree.js +210 -0
  207. package/src/features/sketch/SketchFeature.js +955 -0
  208. package/src/features/sketch/sketchSolver2D/ConstraintEngine.js +800 -0
  209. package/src/features/sketch/sketchSolver2D/constraintDefinitions.js +704 -0
  210. package/src/features/sketch/sketchSolver2D/mathHelpersMod.js +307 -0
  211. package/src/features/spline/SplineEditorSession.js +988 -0
  212. package/src/features/spline/SplineFeature.js +1388 -0
  213. package/src/features/spline/splineUtils.js +218 -0
  214. package/src/features/sweep/SweepFeature.js +110 -0
  215. package/src/features/transform/TransformFeature.js +152 -0
  216. package/src/features/tube/TubeFeature.js +635 -0
  217. package/src/fs.proxy.js +625 -0
  218. package/src/idbStorage.js +254 -0
  219. package/src/index.js +12 -0
  220. package/src/main.js +15 -0
  221. package/src/metadataManager.js +64 -0
  222. package/src/path.proxy.js +277 -0
  223. package/src/plugins/ghLoader.worker.js +151 -0
  224. package/src/plugins/pluginManager.js +286 -0
  225. package/src/pmi/PMIViewsManager.js +134 -0
  226. package/src/services/componentLibrary.js +198 -0
  227. package/src/tests/ConsoleCapture.js +189 -0
  228. package/src/tests/S7-diagnostics-2025-12-23T18-37-23-570Z.json +630 -0
  229. package/src/tests/browserTests.js +597 -0
  230. package/src/tests/debugBoolean.js +225 -0
  231. package/src/tests/partFiles/badBoolean.json +957 -0
  232. package/src/tests/partFiles/extrudeTest.json +88 -0
  233. package/src/tests/partFiles/filletFail.json +58 -0
  234. package/src/tests/partFiles/import_TEst.part.part.json +646 -0
  235. package/src/tests/partFiles/sheetMetalHem.BREP.json +734 -0
  236. package/src/tests/test_boolean_subtract.js +27 -0
  237. package/src/tests/test_chamfer.js +17 -0
  238. package/src/tests/test_extrudeFace.js +24 -0
  239. package/src/tests/test_fillet.js +17 -0
  240. package/src/tests/test_fillet_nonClosed.js +45 -0
  241. package/src/tests/test_filletsMoreDifficult.js +46 -0
  242. package/src/tests/test_history_features_basic.js +149 -0
  243. package/src/tests/test_hole.js +282 -0
  244. package/src/tests/test_mirror.js +16 -0
  245. package/src/tests/test_offsetShellGrouping.js +85 -0
  246. package/src/tests/test_plane.js +4 -0
  247. package/src/tests/test_primitiveCone.js +11 -0
  248. package/src/tests/test_primitiveCube.js +7 -0
  249. package/src/tests/test_primitiveCylinder.js +8 -0
  250. package/src/tests/test_primitivePyramid.js +9 -0
  251. package/src/tests/test_primitiveSphere.js +17 -0
  252. package/src/tests/test_primitiveTorus.js +21 -0
  253. package/src/tests/test_pushFace.js +126 -0
  254. package/src/tests/test_sheetMetalContourFlange.js +125 -0
  255. package/src/tests/test_sheetMetal_features.js +80 -0
  256. package/src/tests/test_sketch_openLoop.js +45 -0
  257. package/src/tests/test_solidMetrics.js +58 -0
  258. package/src/tests/test_stlLoader.js +1889 -0
  259. package/src/tests/test_sweepFace.js +55 -0
  260. package/src/tests/test_tube.js +45 -0
  261. package/src/tests/test_tube_closedLoop.js +67 -0
  262. package/src/tests/tests.js +493 -0
  263. package/src/tools/assemblyConstraintDialogCapturePage.js +56 -0
  264. package/src/tools/dialogCapturePageFactory.js +227 -0
  265. package/src/tools/featureDialogCapturePage.js +47 -0
  266. package/src/tools/pmiAnnotationDialogCapturePage.js +60 -0
  267. package/src/utils/axisHelpers.js +99 -0
  268. package/src/utils/deepClone.js +69 -0
  269. package/src/utils/geometryTolerance.js +37 -0
  270. package/src/utils/normalizeTypeString.js +8 -0
  271. 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
+ }