@@ -13,8 +13,6 @@ from libcpp cimport bool
1313from libcpp.unordered_set cimport unordered_set
1414from libcpp.utility cimport pair
1515from libcpp.vector cimport vector
16- from libcpp.unordered_map cimport unordered_map
17- from libcpp.algorithm cimport sort
1816
1917
2018cdef extern from " triangulation/point.hpp" namespace " partsegcore::point" :
@@ -96,6 +94,7 @@ cdef extern from "triangulation/triangulate.hpp" namespace "partsegcore::triangu
9694 pair[vector[Triangle], vector[Point]] triangulate_polygon_face(const vector[Point]& polygon) except + nogil
9795 pair[vector[Triangle], vector[Point]] triangulate_polygon_face(const vector[vector[Point]]& polygon_list) except + nogil
9896 PathTriangulation triangulate_path_edge(const vector[Point]& path, bool closed, float limit, bool bevel) except + nogil
97+ vector[vector[Point]] split_polygon_on_repeated_edges(const vector[Point]& polygon) except + nogil
9998
10099
101100ctypedef fused float_types:
@@ -429,14 +428,15 @@ def triangulate_path_edge_numpy(cnp.ndarray[cnp.float32_t, ndim=2] path, bool cl
429428 )
430429
431430
432- def triangulate_polygon_with_edge_numpy_li (polygon_li: list[np.ndarray]) -> tuple[tuple[np.ndarray , np.ndarray], tuple[np.ndarray , np.ndarray , np.ndarray]]:
431+ def triangulate_polygon_with_edge_numpy_li (polygon_li: list[np.ndarray], split_edges: bool = False ) -> tuple[tuple[np.ndarray , np.ndarray], tuple[np.ndarray , np.ndarray , np.ndarray]]:
433432 """ Triangulate polygon"""
434433 cdef vector[Point] polygon_vector
435- cdef vector[vector[Point]] polygon_vector_list
434+ cdef vector[vector[Point]] polygon_vector_list , edge_split_list
436435 cdef Point p1 , p2
437436 cdef pair[vector[Triangle], vector[Point]] triangulation_result
438437 cdef vector[PathTriangulation] edge_result
439438 cdef cnp.ndarray[cnp.uint32_t , ndim = 2 ] triangles, edge_triangles
439+ cdef size_t triangle_count = 0
440440
441441 cdef cnp.ndarray[cnp.float32_t , ndim = 2 ] points, edge_offsets , edges_centers , polygon
442442 cdef size_t i , j , len_path , edge_triangle_count , edge_center_count , edge_triangle_index , edge_center_index
@@ -457,8 +457,14 @@ def triangulate_polygon_with_edge_numpy_li(polygon_li: list[np.ndarray]) -> tupl
457457 if polygon_vector.size() > 1 and polygon_vector.front() == polygon_vector.back():
458458 polygon_vector.pop_back()
459459 polygon_vector_list.push_back(polygon_vector)
460- with cython.nogil:
461- edge_result.push_back(triangulate_path_edge(polygon_vector, True , 3.0 , False ))
460+ if split_edges:
461+ with cython.nogil:
462+ edge_split_list = split_polygon_on_repeated_edges(polygon_vector)
463+ for edge_li in edge_split_list:
464+ edge_result.push_back(triangulate_path_edge(edge_li, True , 3.0 , False ))
465+ else :
466+ with cython.nogil:
467+ edge_result.push_back(triangulate_path_edge(polygon_vector, True , 3.0 , False ))
462468
463469 with cython.nogil:
464470 triangulation_result = triangulate_polygon_face(polygon_vector_list)
@@ -470,7 +476,7 @@ def triangulate_polygon_with_edge_numpy_li(polygon_li: list[np.ndarray]) -> tupl
470476 triangles[i, 1 ] = triangulation_result.first[i].y
471477 triangles[i, 2 ] = triangulation_result.first[i].z
472478
473- points = np.empty((triangulation_result.second.size(), 2 ), dtype = np.float32)
479+ points = np.empty((triangulation_result.second.size(), 2 ), dtype = np.float32)
474480 for i in range (triangulation_result.second.size()):
475481 points[i, 0 ] = triangulation_result.second[i].x
476482 points[i, 1 ] = triangulation_result.second[i].y
@@ -489,10 +495,11 @@ def triangulate_polygon_with_edge_numpy_li(polygon_li: list[np.ndarray]) -> tupl
489495 edge_center_index = 0
490496 for i in range (edge_result.size()):
491497 for j in range (edge_result[i].triangles.size()):
492- edge_triangles[edge_triangle_index, 0 ] = edge_result[i].triangles[j].x
493- edge_triangles[edge_triangle_index, 1 ] = edge_result[i].triangles[j].y
494- edge_triangles[edge_triangle_index, 2 ] = edge_result[i].triangles[j].z
498+ edge_triangles[edge_triangle_index, 0 ] = edge_result[i].triangles[j].x + triangle_count
499+ edge_triangles[edge_triangle_index, 1 ] = edge_result[i].triangles[j].y + triangle_count
500+ edge_triangles[edge_triangle_index, 2 ] = edge_result[i].triangles[j].z + triangle_count
495501 edge_triangle_index += 1
502+ triangle_count += edge_result[i].centers.size()
496503
497504 for j in range (edge_result[i].centers.size()):
498505 edges_centers[edge_center_index, 0 ] = edge_result[i].centers[j].x
@@ -511,3 +518,20 @@ def triangulate_polygon_with_edge_numpy_li(polygon_li: list[np.ndarray]) -> tupl
511518 edge_triangles,
512519 )
513520 )
521+
522+
523+ def split_polygon_on_repeated_edges_py (polygon: Sequence[Sequence[float]]) -> list[list[tuple[float , float]]]:
524+ """ Split polygon on repeated edges"""
525+ cdef vector[Point] polygon_vector
526+ cdef vector[vector[Point]] result
527+ cdef Point p1 , p2
528+
529+ polygon_vector.reserve(len(polygon ))
530+ for point in polygon:
531+ polygon_vector.push_back(Point(point[0], point[1]))
532+
533+ result = split_polygon_on_repeated_edges(polygon_vector)
534+ return [
535+ [(point.x , point.y ) for point in polygon_vector]
536+ for polygon_vector in result
537+ ]
0 commit comments