netgen-mesher 6.2.2506.post35.dev0__cp314-cp314-win_amd64.whl

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 (340) hide show
  1. netgen/NgOCC.py +7 -0
  2. netgen/__init__.py +114 -0
  3. netgen/__init__.pyi +22 -0
  4. netgen/__main__.py +53 -0
  5. netgen/cmake/NetgenConfig.cmake +79 -0
  6. netgen/cmake/netgen-targets-release.cmake +69 -0
  7. netgen/cmake/netgen-targets.cmake +146 -0
  8. netgen/config/__init__.py +1 -0
  9. netgen/config/__init__.pyi +52 -0
  10. netgen/config/__main__.py +4 -0
  11. netgen/config/config.py +68 -0
  12. netgen/config/config.pyi +54 -0
  13. netgen/csg.py +25 -0
  14. netgen/geom2d.py +178 -0
  15. netgen/gui.py +82 -0
  16. netgen/include/core/archive.hpp +1256 -0
  17. netgen/include/core/array.hpp +1760 -0
  18. netgen/include/core/autodiff.hpp +1131 -0
  19. netgen/include/core/autodiffdiff.hpp +733 -0
  20. netgen/include/core/bitarray.hpp +240 -0
  21. netgen/include/core/concurrentqueue.h +3619 -0
  22. netgen/include/core/exception.hpp +145 -0
  23. netgen/include/core/flags.hpp +199 -0
  24. netgen/include/core/hashtable.hpp +1281 -0
  25. netgen/include/core/localheap.hpp +318 -0
  26. netgen/include/core/logging.hpp +117 -0
  27. netgen/include/core/memtracer.hpp +221 -0
  28. netgen/include/core/mpi4py_pycapi.h +245 -0
  29. netgen/include/core/mpi_wrapper.hpp +643 -0
  30. netgen/include/core/ng_mpi.hpp +94 -0
  31. netgen/include/core/ng_mpi_generated_declarations.hpp +155 -0
  32. netgen/include/core/ng_mpi_native.hpp +25 -0
  33. netgen/include/core/ngcore.hpp +32 -0
  34. netgen/include/core/ngcore_api.hpp +152 -0
  35. netgen/include/core/ngstream.hpp +115 -0
  36. netgen/include/core/paje_trace.hpp +279 -0
  37. netgen/include/core/profiler.hpp +382 -0
  38. netgen/include/core/python_ngcore.hpp +457 -0
  39. netgen/include/core/ranges.hpp +109 -0
  40. netgen/include/core/register_archive.hpp +100 -0
  41. netgen/include/core/signal.hpp +82 -0
  42. netgen/include/core/simd.hpp +160 -0
  43. netgen/include/core/simd_arm64.hpp +407 -0
  44. netgen/include/core/simd_avx.hpp +394 -0
  45. netgen/include/core/simd_avx512.hpp +285 -0
  46. netgen/include/core/simd_generic.hpp +1053 -0
  47. netgen/include/core/simd_math.hpp +178 -0
  48. netgen/include/core/simd_sse.hpp +289 -0
  49. netgen/include/core/statushandler.hpp +37 -0
  50. netgen/include/core/symboltable.hpp +153 -0
  51. netgen/include/core/table.hpp +810 -0
  52. netgen/include/core/taskmanager.hpp +1161 -0
  53. netgen/include/core/type_traits.hpp +65 -0
  54. netgen/include/core/utils.hpp +385 -0
  55. netgen/include/core/version.hpp +102 -0
  56. netgen/include/core/xbool.hpp +47 -0
  57. netgen/include/csg/algprim.hpp +563 -0
  58. netgen/include/csg/brick.hpp +150 -0
  59. netgen/include/csg/csg.hpp +43 -0
  60. netgen/include/csg/csgeom.hpp +389 -0
  61. netgen/include/csg/csgparser.hpp +101 -0
  62. netgen/include/csg/curve2d.hpp +67 -0
  63. netgen/include/csg/edgeflw.hpp +112 -0
  64. netgen/include/csg/explicitcurve2d.hpp +113 -0
  65. netgen/include/csg/extrusion.hpp +185 -0
  66. netgen/include/csg/gencyl.hpp +70 -0
  67. netgen/include/csg/geoml.hpp +16 -0
  68. netgen/include/csg/identify.hpp +213 -0
  69. netgen/include/csg/manifold.hpp +29 -0
  70. netgen/include/csg/meshsurf.hpp +46 -0
  71. netgen/include/csg/polyhedra.hpp +121 -0
  72. netgen/include/csg/revolution.hpp +180 -0
  73. netgen/include/csg/singularref.hpp +84 -0
  74. netgen/include/csg/solid.hpp +295 -0
  75. netgen/include/csg/specpoin.hpp +194 -0
  76. netgen/include/csg/spline3d.hpp +99 -0
  77. netgen/include/csg/splinesurface.hpp +85 -0
  78. netgen/include/csg/surface.hpp +394 -0
  79. netgen/include/csg/triapprox.hpp +63 -0
  80. netgen/include/csg/vscsg.hpp +34 -0
  81. netgen/include/general/autodiff.hpp +356 -0
  82. netgen/include/general/autoptr.hpp +39 -0
  83. netgen/include/general/gzstream.h +121 -0
  84. netgen/include/general/hashtabl.hpp +1692 -0
  85. netgen/include/general/myadt.hpp +48 -0
  86. netgen/include/general/mystring.hpp +226 -0
  87. netgen/include/general/netgenout.hpp +205 -0
  88. netgen/include/general/ngarray.hpp +797 -0
  89. netgen/include/general/ngbitarray.hpp +149 -0
  90. netgen/include/general/ngpython.hpp +74 -0
  91. netgen/include/general/optmem.hpp +44 -0
  92. netgen/include/general/parthreads.hpp +138 -0
  93. netgen/include/general/seti.hpp +50 -0
  94. netgen/include/general/sort.hpp +47 -0
  95. netgen/include/general/spbita2d.hpp +59 -0
  96. netgen/include/general/stack.hpp +114 -0
  97. netgen/include/general/table.hpp +280 -0
  98. netgen/include/general/template.hpp +509 -0
  99. netgen/include/geom2d/csg2d.hpp +750 -0
  100. netgen/include/geom2d/geometry2d.hpp +280 -0
  101. netgen/include/geom2d/spline2d.hpp +234 -0
  102. netgen/include/geom2d/vsgeom2d.hpp +28 -0
  103. netgen/include/gprim/adtree.hpp +1392 -0
  104. netgen/include/gprim/geom2d.hpp +858 -0
  105. netgen/include/gprim/geom3d.hpp +749 -0
  106. netgen/include/gprim/geomfuncs.hpp +212 -0
  107. netgen/include/gprim/geomobjects.hpp +544 -0
  108. netgen/include/gprim/geomops.hpp +404 -0
  109. netgen/include/gprim/geomtest3d.hpp +101 -0
  110. netgen/include/gprim/gprim.hpp +33 -0
  111. netgen/include/gprim/spline.hpp +778 -0
  112. netgen/include/gprim/splinegeometry.hpp +73 -0
  113. netgen/include/gprim/transform3d.hpp +216 -0
  114. netgen/include/include/acisgeom.hpp +3 -0
  115. netgen/include/include/csg.hpp +1 -0
  116. netgen/include/include/geometry2d.hpp +1 -0
  117. netgen/include/include/gprim.hpp +1 -0
  118. netgen/include/include/incopengl.hpp +62 -0
  119. netgen/include/include/inctcl.hpp +13 -0
  120. netgen/include/include/incvis.hpp +6 -0
  121. netgen/include/include/linalg.hpp +1 -0
  122. netgen/include/include/meshing.hpp +1 -0
  123. netgen/include/include/myadt.hpp +1 -0
  124. netgen/include/include/mydefs.hpp +70 -0
  125. netgen/include/include/mystdlib.h +59 -0
  126. netgen/include/include/netgen_config.hpp +27 -0
  127. netgen/include/include/netgen_version.hpp +9 -0
  128. netgen/include/include/nginterface_v2_impl.hpp +395 -0
  129. netgen/include/include/ngsimd.hpp +1 -0
  130. netgen/include/include/occgeom.hpp +1 -0
  131. netgen/include/include/opti.hpp +1 -0
  132. netgen/include/include/parallel.hpp +1 -0
  133. netgen/include/include/stlgeom.hpp +1 -0
  134. netgen/include/include/visual.hpp +1 -0
  135. netgen/include/interface/rw_medit.hpp +11 -0
  136. netgen/include/interface/writeuser.hpp +80 -0
  137. netgen/include/linalg/densemat.hpp +414 -0
  138. netgen/include/linalg/linalg.hpp +29 -0
  139. netgen/include/linalg/opti.hpp +142 -0
  140. netgen/include/linalg/polynomial.hpp +47 -0
  141. netgen/include/linalg/vector.hpp +217 -0
  142. netgen/include/meshing/adfront2.hpp +274 -0
  143. netgen/include/meshing/adfront3.hpp +332 -0
  144. netgen/include/meshing/basegeom.hpp +370 -0
  145. netgen/include/meshing/bcfunctions.hpp +53 -0
  146. netgen/include/meshing/bisect.hpp +72 -0
  147. netgen/include/meshing/boundarylayer.hpp +113 -0
  148. netgen/include/meshing/classifyhpel.hpp +1984 -0
  149. netgen/include/meshing/clusters.hpp +46 -0
  150. netgen/include/meshing/curvedelems.hpp +274 -0
  151. netgen/include/meshing/delaunay2d.hpp +73 -0
  152. netgen/include/meshing/fieldlines.hpp +103 -0
  153. netgen/include/meshing/findip.hpp +198 -0
  154. netgen/include/meshing/findip2.hpp +103 -0
  155. netgen/include/meshing/geomsearch.hpp +69 -0
  156. netgen/include/meshing/global.hpp +54 -0
  157. netgen/include/meshing/hpref_hex.hpp +330 -0
  158. netgen/include/meshing/hpref_prism.hpp +3405 -0
  159. netgen/include/meshing/hpref_pyramid.hpp +154 -0
  160. netgen/include/meshing/hpref_quad.hpp +2082 -0
  161. netgen/include/meshing/hpref_segm.hpp +122 -0
  162. netgen/include/meshing/hpref_tet.hpp +4230 -0
  163. netgen/include/meshing/hpref_trig.hpp +848 -0
  164. netgen/include/meshing/hprefinement.hpp +366 -0
  165. netgen/include/meshing/improve2.hpp +178 -0
  166. netgen/include/meshing/improve3.hpp +151 -0
  167. netgen/include/meshing/localh.hpp +223 -0
  168. netgen/include/meshing/meshclass.hpp +1076 -0
  169. netgen/include/meshing/meshfunc.hpp +47 -0
  170. netgen/include/meshing/meshing.hpp +63 -0
  171. netgen/include/meshing/meshing2.hpp +163 -0
  172. netgen/include/meshing/meshing3.hpp +123 -0
  173. netgen/include/meshing/meshtool.hpp +90 -0
  174. netgen/include/meshing/meshtype.hpp +1930 -0
  175. netgen/include/meshing/msghandler.hpp +62 -0
  176. netgen/include/meshing/paralleltop.hpp +172 -0
  177. netgen/include/meshing/python_mesh.hpp +206 -0
  178. netgen/include/meshing/ruler2.hpp +172 -0
  179. netgen/include/meshing/ruler3.hpp +211 -0
  180. netgen/include/meshing/soldata.hpp +141 -0
  181. netgen/include/meshing/specials.hpp +17 -0
  182. netgen/include/meshing/surfacegeom.hpp +73 -0
  183. netgen/include/meshing/topology.hpp +1003 -0
  184. netgen/include/meshing/validate.hpp +21 -0
  185. netgen/include/meshing/visual_interface.hpp +71 -0
  186. netgen/include/mydefs.hpp +70 -0
  187. netgen/include/nginterface.h +474 -0
  188. netgen/include/nginterface_v2.hpp +406 -0
  189. netgen/include/nglib.h +697 -0
  190. netgen/include/nglib_occ.h +50 -0
  191. netgen/include/occ/occ_edge.hpp +47 -0
  192. netgen/include/occ/occ_face.hpp +52 -0
  193. netgen/include/occ/occ_solid.hpp +23 -0
  194. netgen/include/occ/occ_utils.hpp +376 -0
  195. netgen/include/occ/occ_vertex.hpp +30 -0
  196. netgen/include/occ/occgeom.hpp +659 -0
  197. netgen/include/occ/occmeshsurf.hpp +168 -0
  198. netgen/include/occ/vsocc.hpp +33 -0
  199. netgen/include/pybind11/LICENSE +29 -0
  200. netgen/include/pybind11/attr.h +722 -0
  201. netgen/include/pybind11/buffer_info.h +208 -0
  202. netgen/include/pybind11/cast.h +2361 -0
  203. netgen/include/pybind11/chrono.h +228 -0
  204. netgen/include/pybind11/common.h +2 -0
  205. netgen/include/pybind11/complex.h +74 -0
  206. netgen/include/pybind11/conduit/README.txt +15 -0
  207. netgen/include/pybind11/conduit/pybind11_conduit_v1.h +116 -0
  208. netgen/include/pybind11/conduit/pybind11_platform_abi_id.h +87 -0
  209. netgen/include/pybind11/conduit/wrap_include_python_h.h +72 -0
  210. netgen/include/pybind11/critical_section.h +56 -0
  211. netgen/include/pybind11/detail/class.h +823 -0
  212. netgen/include/pybind11/detail/common.h +1348 -0
  213. netgen/include/pybind11/detail/cpp_conduit.h +75 -0
  214. netgen/include/pybind11/detail/descr.h +226 -0
  215. netgen/include/pybind11/detail/dynamic_raw_ptr_cast_if_possible.h +39 -0
  216. netgen/include/pybind11/detail/exception_translation.h +71 -0
  217. netgen/include/pybind11/detail/function_record_pyobject.h +191 -0
  218. netgen/include/pybind11/detail/init.h +538 -0
  219. netgen/include/pybind11/detail/internals.h +799 -0
  220. netgen/include/pybind11/detail/native_enum_data.h +209 -0
  221. netgen/include/pybind11/detail/pybind11_namespace_macros.h +82 -0
  222. netgen/include/pybind11/detail/struct_smart_holder.h +378 -0
  223. netgen/include/pybind11/detail/type_caster_base.h +1591 -0
  224. netgen/include/pybind11/detail/typeid.h +65 -0
  225. netgen/include/pybind11/detail/using_smart_holder.h +22 -0
  226. netgen/include/pybind11/detail/value_and_holder.h +90 -0
  227. netgen/include/pybind11/eigen/common.h +9 -0
  228. netgen/include/pybind11/eigen/matrix.h +723 -0
  229. netgen/include/pybind11/eigen/tensor.h +521 -0
  230. netgen/include/pybind11/eigen.h +12 -0
  231. netgen/include/pybind11/embed.h +320 -0
  232. netgen/include/pybind11/eval.h +161 -0
  233. netgen/include/pybind11/functional.h +147 -0
  234. netgen/include/pybind11/gil.h +199 -0
  235. netgen/include/pybind11/gil_safe_call_once.h +102 -0
  236. netgen/include/pybind11/gil_simple.h +37 -0
  237. netgen/include/pybind11/iostream.h +265 -0
  238. netgen/include/pybind11/native_enum.h +67 -0
  239. netgen/include/pybind11/numpy.h +2312 -0
  240. netgen/include/pybind11/operators.h +202 -0
  241. netgen/include/pybind11/options.h +92 -0
  242. netgen/include/pybind11/pybind11.h +3645 -0
  243. netgen/include/pybind11/pytypes.h +2680 -0
  244. netgen/include/pybind11/stl/filesystem.h +114 -0
  245. netgen/include/pybind11/stl.h +666 -0
  246. netgen/include/pybind11/stl_bind.h +858 -0
  247. netgen/include/pybind11/subinterpreter.h +299 -0
  248. netgen/include/pybind11/trampoline_self_life_support.h +65 -0
  249. netgen/include/pybind11/type_caster_pyobject_ptr.h +61 -0
  250. netgen/include/pybind11/typing.h +298 -0
  251. netgen/include/pybind11/warnings.h +75 -0
  252. netgen/include/stlgeom/meshstlsurface.hpp +67 -0
  253. netgen/include/stlgeom/stlgeom.hpp +491 -0
  254. netgen/include/stlgeom/stlline.hpp +193 -0
  255. netgen/include/stlgeom/stltool.hpp +331 -0
  256. netgen/include/stlgeom/stltopology.hpp +419 -0
  257. netgen/include/stlgeom/vsstl.hpp +58 -0
  258. netgen/include/visualization/meshdoc.hpp +42 -0
  259. netgen/include/visualization/mvdraw.hpp +325 -0
  260. netgen/include/visualization/vispar.hpp +128 -0
  261. netgen/include/visualization/visual.hpp +28 -0
  262. netgen/include/visualization/visual_api.hpp +10 -0
  263. netgen/include/visualization/vssolution.hpp +399 -0
  264. netgen/lib/libnggui.lib +0 -0
  265. netgen/lib/ngcore.lib +0 -0
  266. netgen/lib/nglib.lib +0 -0
  267. netgen/lib/togl.lib +0 -0
  268. netgen/libnggui.dll +0 -0
  269. netgen/libngguipy.lib +0 -0
  270. netgen/libngguipy.pyd +0 -0
  271. netgen/libngpy/_NgOCC.pyi +1545 -0
  272. netgen/libngpy/__init__.pyi +7 -0
  273. netgen/libngpy/_csg.pyi +259 -0
  274. netgen/libngpy/_geom2d.pyi +323 -0
  275. netgen/libngpy/_meshing.pyi +1111 -0
  276. netgen/libngpy/_stl.pyi +131 -0
  277. netgen/libngpy.lib +0 -0
  278. netgen/libngpy.pyd +0 -0
  279. netgen/meshing.py +65 -0
  280. netgen/ngcore.dll +0 -0
  281. netgen/nglib.dll +0 -0
  282. netgen/occ.py +52 -0
  283. netgen/read_gmsh.py +259 -0
  284. netgen/read_meshio.py +22 -0
  285. netgen/stl.py +2 -0
  286. netgen/togl.dll +0 -0
  287. netgen/version.py +2 -0
  288. netgen/webgui.py +529 -0
  289. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/boundarycondition.geo +16 -0
  290. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/boxcyl.geo +32 -0
  291. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/circle_on_cube.geo +27 -0
  292. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cone.geo +13 -0
  293. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cube.geo +16 -0
  294. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubeandring.geo +55 -0
  295. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubeandspheres.geo +21 -0
  296. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubemcyl.geo +18 -0
  297. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubemsphere.geo +19 -0
  298. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cylinder.geo +12 -0
  299. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cylsphere.geo +12 -0
  300. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/doc/ng4.pdf +0 -0
  301. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ellipsoid.geo +8 -0
  302. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ellipticcyl.geo +10 -0
  303. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/extrusion.geo +99 -0
  304. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/fichera.geo +24 -0
  305. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/frame.step +11683 -0
  306. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/hinge.stl +8486 -0
  307. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/lshape3d.geo +26 -0
  308. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/manyholes.geo +26 -0
  309. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/manyholes2.geo +26 -0
  310. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/matrix.geo +27 -0
  311. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ortho.geo +11 -0
  312. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/part1.stl +2662 -0
  313. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/period.geo +33 -0
  314. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/exportNeutral.py +26 -0
  315. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/mesh.py +19 -0
  316. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/shaft.geo +65 -0
  317. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/revolution.geo +18 -0
  318. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/screw.step +1694 -0
  319. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sculpture.geo +13 -0
  320. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/shaft.geo +65 -0
  321. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/shell.geo +10 -0
  322. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sphere.geo +8 -0
  323. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sphereincube.geo +17 -0
  324. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/square.in2d +35 -0
  325. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/squarecircle.in2d +48 -0
  326. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/squarehole.in2d +47 -0
  327. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/torus.geo +8 -0
  328. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/trafo.geo +57 -0
  329. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twobricks.geo +15 -0
  330. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twocubes.geo +18 -0
  331. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twocyl.geo +16 -0
  332. netgen_mesher-6.2.2506.post35.dev0.dist-info/METADATA +15 -0
  333. netgen_mesher-6.2.2506.post35.dev0.dist-info/RECORD +340 -0
  334. netgen_mesher-6.2.2506.post35.dev0.dist-info/WHEEL +5 -0
  335. netgen_mesher-6.2.2506.post35.dev0.dist-info/entry_points.txt +2 -0
  336. netgen_mesher-6.2.2506.post35.dev0.dist-info/licenses/AUTHORS +1 -0
  337. netgen_mesher-6.2.2506.post35.dev0.dist-info/licenses/LICENSE +504 -0
  338. netgen_mesher-6.2.2506.post35.dev0.dist-info/top_level.txt +2 -0
  339. pyngcore/__init__.py +1 -0
  340. pyngcore/pyngcore.cp314-win_amd64.pyd +0 -0
@@ -0,0 +1,750 @@
1
+ #ifndef NETGEN_CSG2D_HPP_INCLUDED
2
+ #define NETGEN_CSG2D_HPP_INCLUDED
3
+
4
+ #include <variant>
5
+
6
+ #include "geometry2d.hpp"
7
+
8
+ namespace netgen
9
+ {
10
+ using namespace std;
11
+ using namespace ngcore;
12
+ using netgen::Point;
13
+ using netgen::Vec;
14
+ using Spline = SplineSeg3<2>;
15
+ using netgen::Box;
16
+
17
+ inline double Area(const Point<2>& P, const Point<2>& Q, const Point<2>& R)
18
+ {
19
+ return (Q[0]-P[0]) * (R[1]-P[1]) - (Q[1]-P[1]) * (R[0]-P[0]);
20
+ }
21
+
22
+ // compute weight of spline such that p lies on it
23
+ void ComputeWeight( Spline & s, Point<2> p );
24
+
25
+ enum IntersectionType
26
+ { // types of intersection (detected in the first phase)
27
+ NO_INTERSECTION = 0,
28
+ X_INTERSECTION,
29
+ T_INTERSECTION_Q,
30
+ T_INTERSECTION_P,
31
+ V_INTERSECTION,
32
+ X_OVERLAP, // Q0 -- P1 -- Q1 -- P0 (different direction)
33
+ T_OVERLAP_Q, // same direction or P inside Q
34
+ T_OVERLAP_P, // same direction or Q inside P
35
+ V_OVERLAP // one common point
36
+ };
37
+
38
+ enum IntersectionLabel
39
+ { // for the classification of intersection vertices in the second phase
40
+ NONE,
41
+ CROSSING,
42
+ BOUNCING,
43
+ LEFT_ON,
44
+ RIGHT_ON,
45
+ ON_ON,
46
+ ON_LEFT,
47
+ ON_RIGHT,
48
+ DELAYED_CROSSING,
49
+ DELAYED_BOUNCING
50
+ };
51
+
52
+ enum EntryExitLabel
53
+ { // for marking intersection vertices as "entry" or "exit"
54
+ EXIT,
55
+ ENTRY,
56
+ NEITHER
57
+ };
58
+
59
+ enum IteratorType
60
+ {
61
+ SOURCE,
62
+ INTERSECTION,
63
+ CROSSING_INTERSECTION,
64
+ ALL
65
+ };
66
+
67
+ inline constexpr const double MAXH_DEFAULT{1e99};
68
+ inline const string POINT_NAME_DEFAULT{""};
69
+ inline const string BC_DEFAULT{""};
70
+ inline const string MAT_DEFAULT{""};
71
+
72
+ struct EdgeInfo
73
+ {
74
+ optional<Point<2>> control_point = nullopt; // for spline segments
75
+ double maxh = MAXH_DEFAULT;
76
+ string bc = BC_DEFAULT;
77
+
78
+ EdgeInfo() = default;
79
+ EdgeInfo(Point<2> p) : control_point(p) {}
80
+ EdgeInfo(double h) : maxh(h) {}
81
+ EdgeInfo(string s) : bc(s) {}
82
+ EdgeInfo(optional<Point<2>> p, double h, string s)
83
+ : control_point(p), maxh(h), bc(s)
84
+ {}
85
+
86
+ void Assign( EdgeInfo other )
87
+ {
88
+ if(other.control_point != nullopt)
89
+ control_point = other.control_point;
90
+ if(other.bc != BC_DEFAULT)
91
+ bc = other.bc;
92
+ if(other.maxh != MAXH_DEFAULT)
93
+ maxh = min(maxh, other.maxh);
94
+ }
95
+ };
96
+
97
+ struct PointInfo
98
+ {
99
+ double maxh = MAXH_DEFAULT;
100
+ string name = POINT_NAME_DEFAULT;
101
+ PointInfo() = default;
102
+ PointInfo(const PointInfo& other) = default;
103
+ PointInfo(double amaxh) : maxh(amaxh) {}
104
+ PointInfo(string aname) : name(aname) {}
105
+ PointInfo(double amaxh, string aname) : maxh(amaxh), name(aname) {}
106
+
107
+ void Assign(const PointInfo& other)
108
+ {
109
+ maxh = min(maxh, other.maxh);
110
+ if(other.name != POINT_NAME_DEFAULT)
111
+ name = other.name;
112
+ }
113
+ };
114
+
115
+ struct Vertex : Point<2>
116
+ {
117
+ Vertex (Point<2> p) : Point<2>(p) {}
118
+ Vertex (const Vertex & v) : Point<2>(v)
119
+ {
120
+ spline = v.spline;
121
+ info = v.info;
122
+ pinfo = v.pinfo;
123
+ is_source = true;
124
+ }
125
+
126
+ Vertex * prev = nullptr;
127
+ Vertex * next = nullptr;
128
+ unique_ptr<Vertex> pnext = nullptr;
129
+ Vertex * neighbour = nullptr; // same vertex in other polygon (at intersections)
130
+ double lam = -1.0;
131
+ bool is_intersection = false;
132
+ bool is_source = false;
133
+
134
+ IntersectionLabel label = NONE; // type of intersection vertex
135
+ EntryExitLabel enex = NEITHER; // entry/exit "flag"
136
+
137
+ // In case the edge this - next is curved, store the spline information here
138
+ optional<Spline> spline = nullopt;
139
+ EdgeInfo info;
140
+ PointInfo pinfo;
141
+
142
+ DLL_HEADER Vertex * Insert(Point<2> p, double lam = -1.0);
143
+
144
+ void Link( Vertex * v )
145
+ {
146
+ neighbour = v;
147
+ v->neighbour = this;
148
+ is_intersection = true;
149
+ v->is_intersection = true;
150
+ }
151
+ };
152
+
153
+ struct VertexIterator
154
+ {
155
+ struct iterator
156
+ {
157
+ iterator(Vertex* root, IteratorType IterType) :
158
+ root(root), V(NULL), iterType(IterType)
159
+ {
160
+ if (root == NULL)
161
+ return;
162
+
163
+ if (nextVertex() == NULL) // no (source/intersection) vertex found
164
+ root = V = NULL; // -> mark iterator as "end"
165
+ }
166
+
167
+ const iterator& operator++()
168
+ {
169
+ nextVertex();
170
+ return *this;
171
+ }
172
+
173
+ Vertex* operator*()
174
+ {
175
+ return V;
176
+ }
177
+
178
+ bool operator!=(const iterator& other) const
179
+ {
180
+ return (root != other.root) || (V != other.V);
181
+ }
182
+
183
+ private:
184
+ Vertex* root;
185
+ Vertex* V;
186
+ IteratorType iterType;
187
+
188
+ //
189
+ // find the next vertex
190
+ // if iterType is ALL, then it is just the next vertex
191
+ // if iterType is SOURCE, then it is the next source vertex
192
+ // if iterType is INTERSECTION, then it is the next intersection vertex
193
+ // if iterType is CROSSING_INTERSECTION, then it is the next intersection vertex with CROSSING label
194
+ //
195
+ Vertex* nextVertex()
196
+ {
197
+ bool nextFound = false;
198
+
199
+ if (V == NULL)
200
+ { // find first (source/intersection) vertex
201
+ V = root;
202
+ switch(iterType)
203
+ {
204
+ case ALL:
205
+ nextFound = true;
206
+ break;
207
+ case SOURCE:
208
+ if (V->is_source)
209
+ nextFound = true;
210
+ break;
211
+ case INTERSECTION:
212
+ if (V->is_intersection)
213
+ nextFound = true;
214
+ break;
215
+ case CROSSING_INTERSECTION:
216
+ if (V->is_intersection && (V->label == CROSSING))
217
+ nextFound = true;
218
+ break;
219
+ }
220
+ }
221
+
222
+ while (!nextFound)
223
+ { // find next (source/intersection) vertex
224
+ switch(iterType)
225
+ {
226
+ case ALL:
227
+ V = V->next;
228
+ break;
229
+ case SOURCE:
230
+ do {
231
+ V = V->next;
232
+ } while (!V->is_source && V != root);
233
+ break;
234
+ case INTERSECTION:
235
+ do {
236
+ V = V->next;
237
+ } while (!V->is_intersection && V != root);
238
+ break;
239
+ case CROSSING_INTERSECTION:
240
+ do {
241
+ V = V->next;
242
+ } while ( ( !V->is_intersection || (V->label != CROSSING) ) && V != root);
243
+ break;
244
+ }
245
+
246
+ if (V == root)
247
+ { // back at the root vertex?
248
+ root = V = NULL; // -> mark iterator as "end"
249
+ return(V);
250
+ }
251
+
252
+ switch(iterType)
253
+ {
254
+ case ALL:
255
+ nextFound = true;
256
+ break;
257
+ case SOURCE:
258
+ if (V->is_source)
259
+ nextFound = true;
260
+ break;
261
+ case INTERSECTION:
262
+ if (V->is_intersection)
263
+ nextFound = true;
264
+ break;
265
+ case CROSSING_INTERSECTION:
266
+ if (V->is_intersection && (V->label == CROSSING))
267
+ nextFound = true;
268
+ break;
269
+ }
270
+ }
271
+ return(V);
272
+ }
273
+ };
274
+
275
+ public:
276
+ VertexIterator() : root(NULL) {};
277
+
278
+ iterator begin() { return iterator(root, iterType); }
279
+ iterator end() { return iterator(NULL, iterType); }
280
+
281
+ Vertex* root;
282
+ IteratorType iterType;
283
+ };
284
+
285
+
286
+ struct Edge
287
+ {
288
+ Vertex * v0 = nullptr;
289
+ Vertex * v1 = nullptr;
290
+
291
+ Edge (Vertex* v, Vertex* w) : v0(v), v1(w) { };
292
+ };
293
+
294
+ struct EdgeIterator
295
+ {
296
+ struct iterator
297
+ {
298
+ iterator(Vertex* root, IteratorType IterType) :
299
+ root(root), one(NULL), two(NULL), iterType(IterType)
300
+ {
301
+ if (root == NULL)
302
+ return;
303
+
304
+ if (nextEdge() == NULL) // no source edge found
305
+ root = one = two = NULL; // -> mark iterator as "end"
306
+ }
307
+
308
+ const iterator& operator++() { nextEdge(); return *this; }
309
+
310
+ Edge operator*()
311
+ {
312
+ return Edge(one,two);
313
+ }
314
+
315
+ bool operator!=(const iterator& other) const
316
+ {
317
+ return (root != other.root) || (one != other.one) || (two != other.two);
318
+ }
319
+
320
+ private:
321
+ Vertex* root;
322
+ Vertex* one;
323
+ Vertex* two;
324
+ IteratorType iterType;
325
+
326
+ //
327
+ // find the next vertex, starting at curr
328
+ // if iterType is ALL, then it is just the next vertex
329
+ // if iterType is SOURCE, then it is the next source vertex
330
+ //
331
+ Vertex* nextVertex(Vertex* curr)
332
+ {
333
+ if (curr == NULL)
334
+ return(NULL);
335
+
336
+ switch(iterType)
337
+ {
338
+ case ALL:
339
+ curr = curr->next;
340
+ break;
341
+
342
+ case SOURCE:
343
+ do {
344
+ curr = curr->next;
345
+ } while (!curr->is_source);
346
+ break;
347
+ default:
348
+ ;
349
+ }
350
+
351
+ return(curr);
352
+ }
353
+
354
+ //
355
+ // find the next edge
356
+ //
357
+ Vertex* nextEdge()
358
+ {
359
+ if (root == NULL) // empty polygon?
360
+ return (NULL);
361
+
362
+ if (one == NULL)
363
+ { // find one (source) vertex
364
+ one = root; // note: root is always a (source) vertex
365
+ two = nextVertex(one);
366
+ if (two == one) // just one (source) vertex
367
+ return(NULL); // -> no (source) edges
368
+ return(one);
369
+ }
370
+
371
+ if (two == root)
372
+ { // back at the root vertex?
373
+ root = one = two = NULL; // -> mark iterator as "end"
374
+ return(NULL);
375
+ }
376
+
377
+ one = two;
378
+ two = nextVertex(one);
379
+
380
+ return (one);
381
+ }
382
+ };
383
+
384
+ public:
385
+ EdgeIterator() : root(NULL) {};
386
+
387
+ iterator begin() { return iterator(root, iterType); }
388
+ iterator end() { return iterator(NULL, iterType); }
389
+
390
+ Vertex* root;
391
+ IteratorType iterType;
392
+ };
393
+
394
+
395
+ inline int CalcSide( const Point<2> & p0, const Point<2> & p1, const Point<2> & r )
396
+ {
397
+ if ( (p0[1] < r[1]) != (p1[1] < r[1]) )
398
+ {
399
+ if (p0[0] >= r[0])
400
+ {
401
+ if (p1[0] > r[0])
402
+ return 2 * (p1[1] > p0[1]) - 1;
403
+ else
404
+ if ( (Area(p0,p1,r) > 0) == (p1[1] > p0[1]) )
405
+ return 2 * (p1[1] > p0[1]) - 1;
406
+ }
407
+ else
408
+ {
409
+ if (p1[0] > r[0])
410
+ if ( (Area(p0,p1,r) > 0) == (p1[1] > p0[1]) )
411
+ return 2 * (p1[1] > p0[1]) - 1;
412
+ }
413
+ }
414
+ return 0;
415
+ }
416
+
417
+ struct Loop
418
+ {
419
+ unique_ptr<Vertex> first = nullptr;
420
+ unique_ptr<Box<2>> bbox = nullptr;
421
+
422
+ Loop() = default;
423
+
424
+ Loop(const Loop & p)
425
+ : first(nullptr)
426
+ {
427
+ for(auto v : p.Vertices(ALL))
428
+ AppendVertex(*v);
429
+ }
430
+
431
+ Loop(Loop && p) = default;
432
+
433
+ Loop & operator=(Loop && p) = default;
434
+
435
+ Loop & operator=(const Loop & p)
436
+ {
437
+ // static Timer t("Loop::operator="); RegionTimer rt(t);
438
+ first = nullptr;
439
+ if(p.first)
440
+ {
441
+ size_t n = p.Size();
442
+ Array<unique_ptr<Vertex>> new_verts(n);
443
+ {
444
+ size_t i = 0;
445
+ for(const auto v : p.Vertices(ALL))
446
+ new_verts[i++] = make_unique<Vertex>(*v);
447
+ }
448
+
449
+ for(auto i : IntRange(n-1))
450
+ {
451
+ Vertex * v = new_verts[i].get();
452
+ Vertex * vn = new_verts[i+1].get();
453
+ v->next = vn;
454
+ vn->prev = v;
455
+ }
456
+ Vertex * vfirst = new_verts[0].get();
457
+ Vertex * vlast = new_verts[n-1].get();
458
+ vfirst->prev = vlast;
459
+ vlast->next = vfirst;
460
+
461
+ for(auto i : IntRange(1,n))
462
+ new_verts[n-1-i]->pnext = std::move(new_verts[n-i]);
463
+
464
+ first = std::move(new_verts[0]);
465
+ }
466
+ bbox = nullptr;
467
+ return *this;
468
+ }
469
+
470
+ void Clear()
471
+ {
472
+ first = nullptr;
473
+ }
474
+
475
+ Vertex & AppendVertex(const Vertex & v)
476
+ {
477
+ auto & vnew = Append( static_cast<Point<2>>(v), true );
478
+ vnew.info = v.info;
479
+ vnew.pinfo = v.pinfo;
480
+ if(v.spline)
481
+ vnew.spline = *v.spline;
482
+ if(bbox)
483
+ bbox->Add(v);
484
+ return vnew;
485
+ }
486
+
487
+ Vertex & Append(Point<2> p, bool source = false)
488
+ {
489
+ Vertex * vnew;
490
+ if(first==nullptr)
491
+ {
492
+ first = make_unique<Vertex>(p);
493
+ first->next = first.get();
494
+ first->prev = first.get();
495
+ vnew = first.get();
496
+ }
497
+ else
498
+ {
499
+ vnew = first->prev->Insert(p);
500
+ }
501
+
502
+ vnew->is_source = source;
503
+ // cout << "size after " << Size() << endl;
504
+ if(bbox)
505
+ bbox->Add(p);
506
+ return *vnew;
507
+ }
508
+
509
+ void Remove (Vertex* v)
510
+ {
511
+ v->prev->next = v->next;
512
+ v->next->prev = v->prev;
513
+ if(first.get() == v)
514
+ first = std::move(v->pnext);
515
+ else
516
+ v->prev->pnext = std::move(v->pnext);
517
+ bbox.reset();
518
+ }
519
+
520
+ bool IsInside( Point<2> r ) const;
521
+ bool IsLeftInside( const Vertex & p0 );
522
+ bool IsRightInside( const Vertex & p0 );
523
+
524
+ EdgeIterator Edges(IteratorType iterType) const
525
+ {
526
+ EdgeIterator it;
527
+ it.iterType = iterType;
528
+ it.root = first.get();
529
+ return it;
530
+ }
531
+
532
+ VertexIterator Vertices(IteratorType iterType, Vertex* first_ = nullptr) const
533
+ {
534
+ VertexIterator it;
535
+ it.iterType = iterType;
536
+ it.root = (first_ == nullptr) ? first.get() : first_;
537
+ return it;
538
+ }
539
+
540
+ //
541
+ // check, if all vertices have the ON_ON label
542
+ //
543
+ bool allOnOn()
544
+ {
545
+ for (Vertex* v : Vertices(ALL))
546
+ if (v->label != ON_ON)
547
+ return(false);
548
+ return(true);
549
+ }
550
+
551
+ //
552
+ // check, if the polygon does not contain any crossing intersection vertex
553
+ // or crossing intersection chain or (if we want to compute the union instead
554
+ // of the intersection) a bouncing vertex or a bouncing intersection chain
555
+ //
556
+ bool noCrossingVertex(bool union_case = false)
557
+ {
558
+ for (Vertex* v : Vertices(ALL))
559
+ if (v->is_intersection)
560
+ {
561
+ if ( (v->label == CROSSING) || (v->label == DELAYED_CROSSING) )
562
+ return(false);
563
+
564
+ if (union_case && ( (v->label == BOUNCING) || (v->label == DELAYED_BOUNCING) ) )
565
+ return(false);
566
+ }
567
+ return(true);
568
+ }
569
+
570
+ //
571
+ // return a non-intersection point
572
+ //
573
+ Point<2> getNonIntersectionPoint()
574
+ {
575
+ for (Vertex* v : Vertices(ALL))
576
+ if (!v->is_intersection)
577
+ return *v;
578
+
579
+ // no non-intersection vertex found -> find suitable edge midpoint
580
+ for (Vertex* v : Vertices(ALL))
581
+ // make sure that edge from V to V->next is not collinear with other polygon
582
+ if ( (v->next->neighbour != v->neighbour->prev) && (v->next->neighbour != v->neighbour->next) )
583
+ // return edge midpoint
584
+ return Center(*v, *v->next);
585
+ throw Exception("no point found");
586
+ }
587
+
588
+ //
589
+ // return and insert a non-intersection vertex
590
+ //
591
+ Vertex* getNonIntersectionVertex();
592
+
593
+ void SetBC(string bc)
594
+ {
595
+ for(auto v : Vertices(ALL))
596
+ v->info.bc = bc;
597
+ }
598
+
599
+ size_t Size() const
600
+ {
601
+ if(first==nullptr) return 0;
602
+
603
+ size_t cnt = 0;
604
+
605
+ for([[maybe_unused]] auto v : Vertices(ALL))
606
+ cnt++;
607
+
608
+ return cnt;
609
+ }
610
+
611
+ const Box<2> & GetBoundingBox()
612
+ {
613
+ if(bbox==nullptr)
614
+ {
615
+ static Timer tall("Loop::GetBoundingBox"); RegionTimer rt(tall);
616
+ bbox = make_unique<Box<2>>(Box<2>::EMPTY_BOX);
617
+ for(auto v : Vertices(ALL))
618
+ {
619
+ bbox->Add(*v);
620
+ if(v->spline)
621
+ bbox->Add(v->spline->TangentPoint());
622
+ }
623
+ }
624
+ return *bbox;
625
+ }
626
+ };
627
+
628
+
629
+ struct Solid2d
630
+ {
631
+ Array<Loop> polys;
632
+
633
+ int layer = 1;
634
+ string name = MAT_DEFAULT;
635
+ double maxh = MAXH_DEFAULT;
636
+
637
+ Solid2d() = default;
638
+ Solid2d(string name_) : name(name_) {}
639
+ DLL_HEADER Solid2d(const Array<std::variant<Point<2>, EdgeInfo, PointInfo>> & points, string name_=MAT_DEFAULT, string bc_=BC_DEFAULT);
640
+ Solid2d(Solid2d && other) = default;
641
+ Solid2d(const Solid2d & other) = default;
642
+
643
+ DLL_HEADER Solid2d operator+(const Solid2d & other) const;
644
+ DLL_HEADER Solid2d operator*(const Solid2d & other) const;
645
+ DLL_HEADER Solid2d operator-(const Solid2d & other) const;
646
+
647
+ Solid2d& operator=(Solid2d && other) = default;
648
+ Solid2d& operator=(const Solid2d & other) = default;
649
+ DLL_HEADER Solid2d& operator+=(const Solid2d & other);
650
+ DLL_HEADER Solid2d& operator*=(const Solid2d & other);
651
+ DLL_HEADER Solid2d& operator-=(const Solid2d & other);
652
+
653
+ void Append( const Loop & poly )
654
+ {
655
+ polys.Append(poly);
656
+ }
657
+
658
+ bool IsInside( Point<2> r ) const;
659
+ bool IsLeftInside( const Vertex & p0 );
660
+ bool IsRightInside( const Vertex & p0 );
661
+
662
+ template<typename TFunc>
663
+ Solid2d & Transform( const TFunc & func )
664
+ {
665
+ for(auto & poly : polys)
666
+ for(auto v : poly.Vertices(ALL))
667
+ {
668
+ auto p = func(*v);
669
+ (*v)[0] = p[0];
670
+ (*v)[1] = p[1];
671
+ if(v->spline)
672
+ {
673
+ auto &s = *v->spline;
674
+ auto pmid = func(s.GetPoint(0.5));
675
+ s = Spline(func(s.StartPI()), func(s.TangentPoint()), func(s.EndPI()));
676
+ ComputeWeight(s, pmid);
677
+ }
678
+ }
679
+ return *this;
680
+ }
681
+
682
+ Solid2d & Move( Vec<2> v );
683
+ Solid2d & Scale( double s );
684
+ Solid2d & Scale( Vec<2> s );
685
+ Solid2d & RotateRad( double ang, Point<2> center = {0,0} );
686
+ Solid2d & RotateDeg( double ang, Point<2> center = {0,0} )
687
+ {
688
+ return RotateRad( ang/180.*M_PI, center );
689
+ }
690
+
691
+ Solid2d & BC(string bc)
692
+ {
693
+ for(auto & p : polys)
694
+ for(auto v : p.Vertices(ALL))
695
+ v->info.bc = bc;
696
+ return *this;
697
+ }
698
+
699
+ Solid2d & Maxh(double maxh)
700
+ {
701
+ this->maxh = maxh;
702
+ for(auto & p : polys)
703
+ for(auto v : p.Vertices(ALL))
704
+ v->info.maxh = maxh;
705
+ return *this;
706
+ }
707
+
708
+ Solid2d & Mat(string mat)
709
+ {
710
+ name = mat;
711
+ return *this;
712
+ }
713
+
714
+ Solid2d & Layer(int layer_)
715
+ {
716
+ layer = layer_;
717
+ return *this;
718
+ }
719
+
720
+ Box<2> GetBoundingBox() const;
721
+ };
722
+
723
+
724
+ class CSG2d
725
+ {
726
+ public:
727
+ Array<Solid2d> solids;
728
+
729
+ void Add ( Solid2d s )
730
+ {
731
+ solids.Append(s);
732
+ }
733
+
734
+ DLL_HEADER shared_ptr<netgen::SplineGeometry2d> GenerateSplineGeometry();
735
+ DLL_HEADER shared_ptr<netgen::Mesh> GenerateMesh(MeshingParameters & mp);
736
+ };
737
+
738
+ DLL_HEADER Solid2d Circle( Point<2> center, double r, string name="", string bc="");
739
+ DLL_HEADER Solid2d Rectangle( Point<2> p0, Point<2> p1, string mat=MAT_DEFAULT, string bc=BC_DEFAULT );
740
+
741
+ DLL_HEADER void AddIntersectionPoints ( Solid2d & s1, Solid2d & s2 );
742
+ DLL_HEADER Solid2d ClipSolids ( const Solid2d & s1, const Solid2d & s2, char op);
743
+ DLL_HEADER Solid2d ClipSolids ( const Solid2d & s1, Solid2d && s2, char op);
744
+ DLL_HEADER Solid2d ClipSolids ( Solid2d && s1, const Solid2d & s2, char op);
745
+ DLL_HEADER Solid2d ClipSolids ( Solid2d && s1, Solid2d && s2, char op);
746
+
747
+ DLL_HEADER IntersectionType intersect(const Point<2> P1, const Point<2> P2, const Point<2> Q1, const Point<2> Q2, double& alpha, double& beta);
748
+
749
+ }
750
+ #endif // NETGEN_CSG2D_HPP_INCLUDED