208{
209
211 Idx *current = cmp <= 0 ? &ia : &ib, *other = cmp <= 0 ? &ib : &ia;
212 Idx *initial = current;
213 bool visitor_continue = true;
214
215 size_t start = initial->
idx();
216 bool finished = false;
217
218 while (visitor_continue && !finished) {
219 Point current_dir_a = current == &ia ? current->
dir() : -current->
dir();
220 visitor_continue = fn(ia.
idx(), ib.
idx(), current_dir_a);
221
222
223
224 if constexpr (mode == AntipodalVisitMode::Full)
225 if (cmp == 0 && visitor_continue) {
226 visitor_continue = fn(current == &ia ? ia.
idx() : ia.next(),
227 current == &ib ? ib.idx() : ib.next(),
228 current_dir_a);
229 }
230
231 cmp = cmp_angles(current->
dir(), current->
next_dir(), other->dir());
232
234 if (cmp > 0) {
235 std::swap(current, other);
236 }
237
238 if (initial->
idx() == start) finished =
true;
239 }
240}
Definition ConvexHull.cpp:174
size_t idx() const
Definition ConvexHull.cpp:181
size_t inc()
Definition ConvexHull.cpp:184
Point prev_dir() const
Definition ConvexHull.cpp:185
const Point next_dir() const
Definition ConvexHull.cpp:191
const Point dir() const
Definition ConvexHull.cpp:190
int cmp_angles(const Point &dir, const Point &dirA, const Point &dirB)
Definition ConvexHull.cpp:160