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.
- netgen/NgOCC.py +7 -0
- netgen/__init__.py +114 -0
- netgen/__init__.pyi +22 -0
- netgen/__main__.py +53 -0
- netgen/cmake/NetgenConfig.cmake +79 -0
- netgen/cmake/netgen-targets-release.cmake +69 -0
- netgen/cmake/netgen-targets.cmake +146 -0
- netgen/config/__init__.py +1 -0
- netgen/config/__init__.pyi +52 -0
- netgen/config/__main__.py +4 -0
- netgen/config/config.py +68 -0
- netgen/config/config.pyi +54 -0
- netgen/csg.py +25 -0
- netgen/geom2d.py +178 -0
- netgen/gui.py +82 -0
- netgen/include/core/archive.hpp +1256 -0
- netgen/include/core/array.hpp +1760 -0
- netgen/include/core/autodiff.hpp +1131 -0
- netgen/include/core/autodiffdiff.hpp +733 -0
- netgen/include/core/bitarray.hpp +240 -0
- netgen/include/core/concurrentqueue.h +3619 -0
- netgen/include/core/exception.hpp +145 -0
- netgen/include/core/flags.hpp +199 -0
- netgen/include/core/hashtable.hpp +1281 -0
- netgen/include/core/localheap.hpp +318 -0
- netgen/include/core/logging.hpp +117 -0
- netgen/include/core/memtracer.hpp +221 -0
- netgen/include/core/mpi4py_pycapi.h +245 -0
- netgen/include/core/mpi_wrapper.hpp +643 -0
- netgen/include/core/ng_mpi.hpp +94 -0
- netgen/include/core/ng_mpi_generated_declarations.hpp +155 -0
- netgen/include/core/ng_mpi_native.hpp +25 -0
- netgen/include/core/ngcore.hpp +32 -0
- netgen/include/core/ngcore_api.hpp +152 -0
- netgen/include/core/ngstream.hpp +115 -0
- netgen/include/core/paje_trace.hpp +279 -0
- netgen/include/core/profiler.hpp +382 -0
- netgen/include/core/python_ngcore.hpp +457 -0
- netgen/include/core/ranges.hpp +109 -0
- netgen/include/core/register_archive.hpp +100 -0
- netgen/include/core/signal.hpp +82 -0
- netgen/include/core/simd.hpp +160 -0
- netgen/include/core/simd_arm64.hpp +407 -0
- netgen/include/core/simd_avx.hpp +394 -0
- netgen/include/core/simd_avx512.hpp +285 -0
- netgen/include/core/simd_generic.hpp +1053 -0
- netgen/include/core/simd_math.hpp +178 -0
- netgen/include/core/simd_sse.hpp +289 -0
- netgen/include/core/statushandler.hpp +37 -0
- netgen/include/core/symboltable.hpp +153 -0
- netgen/include/core/table.hpp +810 -0
- netgen/include/core/taskmanager.hpp +1161 -0
- netgen/include/core/type_traits.hpp +65 -0
- netgen/include/core/utils.hpp +385 -0
- netgen/include/core/version.hpp +102 -0
- netgen/include/core/xbool.hpp +47 -0
- netgen/include/csg/algprim.hpp +563 -0
- netgen/include/csg/brick.hpp +150 -0
- netgen/include/csg/csg.hpp +43 -0
- netgen/include/csg/csgeom.hpp +389 -0
- netgen/include/csg/csgparser.hpp +101 -0
- netgen/include/csg/curve2d.hpp +67 -0
- netgen/include/csg/edgeflw.hpp +112 -0
- netgen/include/csg/explicitcurve2d.hpp +113 -0
- netgen/include/csg/extrusion.hpp +185 -0
- netgen/include/csg/gencyl.hpp +70 -0
- netgen/include/csg/geoml.hpp +16 -0
- netgen/include/csg/identify.hpp +213 -0
- netgen/include/csg/manifold.hpp +29 -0
- netgen/include/csg/meshsurf.hpp +46 -0
- netgen/include/csg/polyhedra.hpp +121 -0
- netgen/include/csg/revolution.hpp +180 -0
- netgen/include/csg/singularref.hpp +84 -0
- netgen/include/csg/solid.hpp +295 -0
- netgen/include/csg/specpoin.hpp +194 -0
- netgen/include/csg/spline3d.hpp +99 -0
- netgen/include/csg/splinesurface.hpp +85 -0
- netgen/include/csg/surface.hpp +394 -0
- netgen/include/csg/triapprox.hpp +63 -0
- netgen/include/csg/vscsg.hpp +34 -0
- netgen/include/general/autodiff.hpp +356 -0
- netgen/include/general/autoptr.hpp +39 -0
- netgen/include/general/gzstream.h +121 -0
- netgen/include/general/hashtabl.hpp +1692 -0
- netgen/include/general/myadt.hpp +48 -0
- netgen/include/general/mystring.hpp +226 -0
- netgen/include/general/netgenout.hpp +205 -0
- netgen/include/general/ngarray.hpp +797 -0
- netgen/include/general/ngbitarray.hpp +149 -0
- netgen/include/general/ngpython.hpp +74 -0
- netgen/include/general/optmem.hpp +44 -0
- netgen/include/general/parthreads.hpp +138 -0
- netgen/include/general/seti.hpp +50 -0
- netgen/include/general/sort.hpp +47 -0
- netgen/include/general/spbita2d.hpp +59 -0
- netgen/include/general/stack.hpp +114 -0
- netgen/include/general/table.hpp +280 -0
- netgen/include/general/template.hpp +509 -0
- netgen/include/geom2d/csg2d.hpp +750 -0
- netgen/include/geom2d/geometry2d.hpp +280 -0
- netgen/include/geom2d/spline2d.hpp +234 -0
- netgen/include/geom2d/vsgeom2d.hpp +28 -0
- netgen/include/gprim/adtree.hpp +1392 -0
- netgen/include/gprim/geom2d.hpp +858 -0
- netgen/include/gprim/geom3d.hpp +749 -0
- netgen/include/gprim/geomfuncs.hpp +212 -0
- netgen/include/gprim/geomobjects.hpp +544 -0
- netgen/include/gprim/geomops.hpp +404 -0
- netgen/include/gprim/geomtest3d.hpp +101 -0
- netgen/include/gprim/gprim.hpp +33 -0
- netgen/include/gprim/spline.hpp +778 -0
- netgen/include/gprim/splinegeometry.hpp +73 -0
- netgen/include/gprim/transform3d.hpp +216 -0
- netgen/include/include/acisgeom.hpp +3 -0
- netgen/include/include/csg.hpp +1 -0
- netgen/include/include/geometry2d.hpp +1 -0
- netgen/include/include/gprim.hpp +1 -0
- netgen/include/include/incopengl.hpp +62 -0
- netgen/include/include/inctcl.hpp +13 -0
- netgen/include/include/incvis.hpp +6 -0
- netgen/include/include/linalg.hpp +1 -0
- netgen/include/include/meshing.hpp +1 -0
- netgen/include/include/myadt.hpp +1 -0
- netgen/include/include/mydefs.hpp +70 -0
- netgen/include/include/mystdlib.h +59 -0
- netgen/include/include/netgen_config.hpp +27 -0
- netgen/include/include/netgen_version.hpp +9 -0
- netgen/include/include/nginterface_v2_impl.hpp +395 -0
- netgen/include/include/ngsimd.hpp +1 -0
- netgen/include/include/occgeom.hpp +1 -0
- netgen/include/include/opti.hpp +1 -0
- netgen/include/include/parallel.hpp +1 -0
- netgen/include/include/stlgeom.hpp +1 -0
- netgen/include/include/visual.hpp +1 -0
- netgen/include/interface/rw_medit.hpp +11 -0
- netgen/include/interface/writeuser.hpp +80 -0
- netgen/include/linalg/densemat.hpp +414 -0
- netgen/include/linalg/linalg.hpp +29 -0
- netgen/include/linalg/opti.hpp +142 -0
- netgen/include/linalg/polynomial.hpp +47 -0
- netgen/include/linalg/vector.hpp +217 -0
- netgen/include/meshing/adfront2.hpp +274 -0
- netgen/include/meshing/adfront3.hpp +332 -0
- netgen/include/meshing/basegeom.hpp +370 -0
- netgen/include/meshing/bcfunctions.hpp +53 -0
- netgen/include/meshing/bisect.hpp +72 -0
- netgen/include/meshing/boundarylayer.hpp +113 -0
- netgen/include/meshing/classifyhpel.hpp +1984 -0
- netgen/include/meshing/clusters.hpp +46 -0
- netgen/include/meshing/curvedelems.hpp +274 -0
- netgen/include/meshing/delaunay2d.hpp +73 -0
- netgen/include/meshing/fieldlines.hpp +103 -0
- netgen/include/meshing/findip.hpp +198 -0
- netgen/include/meshing/findip2.hpp +103 -0
- netgen/include/meshing/geomsearch.hpp +69 -0
- netgen/include/meshing/global.hpp +54 -0
- netgen/include/meshing/hpref_hex.hpp +330 -0
- netgen/include/meshing/hpref_prism.hpp +3405 -0
- netgen/include/meshing/hpref_pyramid.hpp +154 -0
- netgen/include/meshing/hpref_quad.hpp +2082 -0
- netgen/include/meshing/hpref_segm.hpp +122 -0
- netgen/include/meshing/hpref_tet.hpp +4230 -0
- netgen/include/meshing/hpref_trig.hpp +848 -0
- netgen/include/meshing/hprefinement.hpp +366 -0
- netgen/include/meshing/improve2.hpp +178 -0
- netgen/include/meshing/improve3.hpp +151 -0
- netgen/include/meshing/localh.hpp +223 -0
- netgen/include/meshing/meshclass.hpp +1076 -0
- netgen/include/meshing/meshfunc.hpp +47 -0
- netgen/include/meshing/meshing.hpp +63 -0
- netgen/include/meshing/meshing2.hpp +163 -0
- netgen/include/meshing/meshing3.hpp +123 -0
- netgen/include/meshing/meshtool.hpp +90 -0
- netgen/include/meshing/meshtype.hpp +1930 -0
- netgen/include/meshing/msghandler.hpp +62 -0
- netgen/include/meshing/paralleltop.hpp +172 -0
- netgen/include/meshing/python_mesh.hpp +206 -0
- netgen/include/meshing/ruler2.hpp +172 -0
- netgen/include/meshing/ruler3.hpp +211 -0
- netgen/include/meshing/soldata.hpp +141 -0
- netgen/include/meshing/specials.hpp +17 -0
- netgen/include/meshing/surfacegeom.hpp +73 -0
- netgen/include/meshing/topology.hpp +1003 -0
- netgen/include/meshing/validate.hpp +21 -0
- netgen/include/meshing/visual_interface.hpp +71 -0
- netgen/include/mydefs.hpp +70 -0
- netgen/include/nginterface.h +474 -0
- netgen/include/nginterface_v2.hpp +406 -0
- netgen/include/nglib.h +697 -0
- netgen/include/nglib_occ.h +50 -0
- netgen/include/occ/occ_edge.hpp +47 -0
- netgen/include/occ/occ_face.hpp +52 -0
- netgen/include/occ/occ_solid.hpp +23 -0
- netgen/include/occ/occ_utils.hpp +376 -0
- netgen/include/occ/occ_vertex.hpp +30 -0
- netgen/include/occ/occgeom.hpp +659 -0
- netgen/include/occ/occmeshsurf.hpp +168 -0
- netgen/include/occ/vsocc.hpp +33 -0
- netgen/include/pybind11/LICENSE +29 -0
- netgen/include/pybind11/attr.h +722 -0
- netgen/include/pybind11/buffer_info.h +208 -0
- netgen/include/pybind11/cast.h +2361 -0
- netgen/include/pybind11/chrono.h +228 -0
- netgen/include/pybind11/common.h +2 -0
- netgen/include/pybind11/complex.h +74 -0
- netgen/include/pybind11/conduit/README.txt +15 -0
- netgen/include/pybind11/conduit/pybind11_conduit_v1.h +116 -0
- netgen/include/pybind11/conduit/pybind11_platform_abi_id.h +87 -0
- netgen/include/pybind11/conduit/wrap_include_python_h.h +72 -0
- netgen/include/pybind11/critical_section.h +56 -0
- netgen/include/pybind11/detail/class.h +823 -0
- netgen/include/pybind11/detail/common.h +1348 -0
- netgen/include/pybind11/detail/cpp_conduit.h +75 -0
- netgen/include/pybind11/detail/descr.h +226 -0
- netgen/include/pybind11/detail/dynamic_raw_ptr_cast_if_possible.h +39 -0
- netgen/include/pybind11/detail/exception_translation.h +71 -0
- netgen/include/pybind11/detail/function_record_pyobject.h +191 -0
- netgen/include/pybind11/detail/init.h +538 -0
- netgen/include/pybind11/detail/internals.h +799 -0
- netgen/include/pybind11/detail/native_enum_data.h +209 -0
- netgen/include/pybind11/detail/pybind11_namespace_macros.h +82 -0
- netgen/include/pybind11/detail/struct_smart_holder.h +378 -0
- netgen/include/pybind11/detail/type_caster_base.h +1591 -0
- netgen/include/pybind11/detail/typeid.h +65 -0
- netgen/include/pybind11/detail/using_smart_holder.h +22 -0
- netgen/include/pybind11/detail/value_and_holder.h +90 -0
- netgen/include/pybind11/eigen/common.h +9 -0
- netgen/include/pybind11/eigen/matrix.h +723 -0
- netgen/include/pybind11/eigen/tensor.h +521 -0
- netgen/include/pybind11/eigen.h +12 -0
- netgen/include/pybind11/embed.h +320 -0
- netgen/include/pybind11/eval.h +161 -0
- netgen/include/pybind11/functional.h +147 -0
- netgen/include/pybind11/gil.h +199 -0
- netgen/include/pybind11/gil_safe_call_once.h +102 -0
- netgen/include/pybind11/gil_simple.h +37 -0
- netgen/include/pybind11/iostream.h +265 -0
- netgen/include/pybind11/native_enum.h +67 -0
- netgen/include/pybind11/numpy.h +2312 -0
- netgen/include/pybind11/operators.h +202 -0
- netgen/include/pybind11/options.h +92 -0
- netgen/include/pybind11/pybind11.h +3645 -0
- netgen/include/pybind11/pytypes.h +2680 -0
- netgen/include/pybind11/stl/filesystem.h +114 -0
- netgen/include/pybind11/stl.h +666 -0
- netgen/include/pybind11/stl_bind.h +858 -0
- netgen/include/pybind11/subinterpreter.h +299 -0
- netgen/include/pybind11/trampoline_self_life_support.h +65 -0
- netgen/include/pybind11/type_caster_pyobject_ptr.h +61 -0
- netgen/include/pybind11/typing.h +298 -0
- netgen/include/pybind11/warnings.h +75 -0
- netgen/include/stlgeom/meshstlsurface.hpp +67 -0
- netgen/include/stlgeom/stlgeom.hpp +491 -0
- netgen/include/stlgeom/stlline.hpp +193 -0
- netgen/include/stlgeom/stltool.hpp +331 -0
- netgen/include/stlgeom/stltopology.hpp +419 -0
- netgen/include/stlgeom/vsstl.hpp +58 -0
- netgen/include/visualization/meshdoc.hpp +42 -0
- netgen/include/visualization/mvdraw.hpp +325 -0
- netgen/include/visualization/vispar.hpp +128 -0
- netgen/include/visualization/visual.hpp +28 -0
- netgen/include/visualization/visual_api.hpp +10 -0
- netgen/include/visualization/vssolution.hpp +399 -0
- netgen/lib/libnggui.lib +0 -0
- netgen/lib/ngcore.lib +0 -0
- netgen/lib/nglib.lib +0 -0
- netgen/lib/togl.lib +0 -0
- netgen/libnggui.dll +0 -0
- netgen/libngguipy.lib +0 -0
- netgen/libngguipy.pyd +0 -0
- netgen/libngpy/_NgOCC.pyi +1545 -0
- netgen/libngpy/__init__.pyi +7 -0
- netgen/libngpy/_csg.pyi +259 -0
- netgen/libngpy/_geom2d.pyi +323 -0
- netgen/libngpy/_meshing.pyi +1111 -0
- netgen/libngpy/_stl.pyi +131 -0
- netgen/libngpy.lib +0 -0
- netgen/libngpy.pyd +0 -0
- netgen/meshing.py +65 -0
- netgen/ngcore.dll +0 -0
- netgen/nglib.dll +0 -0
- netgen/occ.py +52 -0
- netgen/read_gmsh.py +259 -0
- netgen/read_meshio.py +22 -0
- netgen/stl.py +2 -0
- netgen/togl.dll +0 -0
- netgen/version.py +2 -0
- netgen/webgui.py +529 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/boundarycondition.geo +16 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/boxcyl.geo +32 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/circle_on_cube.geo +27 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cone.geo +13 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cube.geo +16 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubeandring.geo +55 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubeandspheres.geo +21 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubemcyl.geo +18 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubemsphere.geo +19 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cylinder.geo +12 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cylsphere.geo +12 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/doc/ng4.pdf +0 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ellipsoid.geo +8 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ellipticcyl.geo +10 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/extrusion.geo +99 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/fichera.geo +24 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/frame.step +11683 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/hinge.stl +8486 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/lshape3d.geo +26 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/manyholes.geo +26 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/manyholes2.geo +26 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/matrix.geo +27 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ortho.geo +11 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/part1.stl +2662 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/period.geo +33 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/exportNeutral.py +26 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/mesh.py +19 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/shaft.geo +65 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/revolution.geo +18 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/screw.step +1694 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sculpture.geo +13 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/shaft.geo +65 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/shell.geo +10 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sphere.geo +8 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sphereincube.geo +17 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/square.in2d +35 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/squarecircle.in2d +48 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/squarehole.in2d +47 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/torus.geo +8 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/trafo.geo +57 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twobricks.geo +15 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twocubes.geo +18 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twocyl.geo +16 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/METADATA +15 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/RECORD +340 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/WHEEL +5 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/entry_points.txt +2 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/licenses/AUTHORS +1 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/licenses/LICENSE +504 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/top_level.txt +2 -0
- pyngcore/__init__.py +1 -0
- 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
|