@@ -149,9 +149,6 @@ inline bool in_circle(
149
149
constexpr double EPSILON = std::numeric_limits<double >::epsilon();
150
150
constexpr std::size_t INVALID_INDEX = std::numeric_limits<std::size_t >::max();
151
151
152
- // @see https://stackoverflow.com/questions/30208196/maximum-recursive-function-calls-in-c-c-before-stack-is-full-and-gives-a-segme
153
- constexpr std::size_t EDGE_STACK_SIZE = 1024 ;
154
-
155
152
inline bool check_pts_equal (double x1, double y1, double x2, double y2) {
156
153
return std::fabs (x1 - x2) <= EPSILON &&
157
154
std::fabs (y1 - y2) <= EPSILON;
@@ -193,7 +190,7 @@ class Delaunator {
193
190
double m_center_x;
194
191
double m_center_y;
195
192
std::size_t m_hash_size;
196
- std::size_t m_edge_stack[EDGE_STACK_SIZE] ;
193
+ std::vector<std:: size_t > m_edge_stack;
197
194
198
195
std::size_t legalize (std::size_t a);
199
196
std::size_t hash_key (double x, double y) const ;
@@ -443,6 +440,7 @@ double Delaunator::get_hull_area() {
443
440
std::size_t Delaunator::legalize (std::size_t a) {
444
441
std::size_t i = 0 ;
445
442
std::size_t ar = 0 ;
443
+ m_edge_stack.clear ();
446
444
447
445
// recursion eliminated with a fixed-size stack
448
446
while (true ) {
@@ -518,9 +516,13 @@ std::size_t Delaunator::legalize(std::size_t a) {
518
516
link (ar, bl);
519
517
std::size_t br = b0 + (b + 1 ) % 3 ;
520
518
521
- if (i + 1 < EDGE_STACK_SIZE) {
522
- m_edge_stack[i++] = br;
519
+ if (i < m_edge_stack.size ()) {
520
+ m_edge_stack[i] = br;
521
+ } else {
522
+ m_edge_stack.push_back (br);
523
523
}
524
+ i++;
525
+
524
526
} else {
525
527
if (i > 0 ) {
526
528
i--;
0 commit comments