OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::Geometry::rotcalip Namespace Reference

Classes

class  Idx

Typedefs

using int256_t = boost::multiprecision::int256_t
using int128_t = boost::multiprecision::int128_t

Enumerations

enum class  AntipodalVisitMode { Full , EdgesOnly }

Functions

template<class Scalar = int64_t>
Scalar magnsq (const Point &p)
template<class Scalar = int64_t>
Scalar dot (const Point &a, const Point &b)
template<class Scalar = int64_t>
Scalar dotperp (const Point &a, const Point &b)
int cmp_angles (const Point &dir, const Point &dirA, const Point &dirB)
template<AntipodalVisitMode mode = AntipodalVisitMode::Full, class Fn>
void visit_antipodals (Idx &ia, Idx &ib, Fn &&fn)

Typedef Documentation

◆ int128_t

using Slic3r::Geometry::rotcalip::int128_t = boost::multiprecision::int128_t

◆ int256_t

using Slic3r::Geometry::rotcalip::int256_t = boost::multiprecision::int256_t

Enumeration Type Documentation

◆ AntipodalVisitMode

Enumerator
Full 
EdgesOnly 
208{ Full, EdgesOnly };
@ EdgesOnly
Definition ConvexHull.cpp:208
@ Full
Definition ConvexHull.cpp:208

Function Documentation

◆ cmp_angles()

int Slic3r::Geometry::rotcalip::cmp_angles ( const Point & dir,
const Point & dirA,
const Point & dirB )
170 {
171 int128_t dotA = dot(dir, dirA);
172 int128_t dotB = dot(-dir, dirB);
173 int256_t dcosa = int256_t(magnsq(dirB)) * int256_t(abs(dotA)) * dotA;
174 int256_t dcosb = int256_t(magnsq(dirA)) * int256_t(abs(dotB)) * dotB;
175 int256_t diff = dcosa - dcosb;
176
177 return diff > 0? -1 : (diff < 0 ? 1 : 0);
178}
boost::multiprecision::int256_t int256_t
Definition ConvexHull.cpp:143
Scalar dot(const Point &a, const Point &b)
Definition ConvexHull.cpp:153
Scalar magnsq(const Point &p)
Definition ConvexHull.cpp:147
boost::multiprecision::int128_t int128_t
Definition ConvexHull.cpp:144
Slic3r::Polygons diff(const Slic3r::Polygon &subject, const Slic3r::Polygon &clip, ApplySafetyOffset do_safety_offset)
Definition ClipperUtils.cpp:731

References Slic3r::diff(), dot(), and magnsq().

Referenced by visit_antipodals().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ dot()

template<class Scalar = int64_t>
Scalar Slic3r::Geometry::rotcalip::dot ( const Point & a,
const Point & b )
inline
154{
155 return Scalar(a.x()) * b.x() + Scalar(a.y()) * b.y();
156}

Referenced by cmp_angles().

Here is the caller graph for this function:

◆ dotperp()

template<class Scalar = int64_t>
Scalar Slic3r::Geometry::rotcalip::dotperp ( const Point & a,
const Point & b )
inline
160{
161 return Scalar(a.x()) * b.y() - Scalar(a.y()) * b.x();
162}

◆ magnsq()

template<class Scalar = int64_t>
Scalar Slic3r::Geometry::rotcalip::magnsq ( const Point & p)
inline
148{
149 return Scalar(p.x()) * p.x() + Scalar(p.y()) * p.y();
150}

Referenced by cmp_angles().

Here is the caller graph for this function:

◆ visit_antipodals()

template<AntipodalVisitMode mode = AntipodalVisitMode::Full, class Fn>
void Slic3r::Geometry::rotcalip::visit_antipodals ( Idx & ia,
Idx & ib,
Fn && fn )
218{
219 // Set current caliper direction to be the lower edge angle from X axis
220 int cmp = cmp_angles(ia.prev_dir(), ia.dir(), ib.dir());
221 Idx *current = cmp <= 0 ? &ia : &ib, *other = cmp <= 0 ? &ib : &ia;
222 Idx *initial = current;
223 bool visitor_continue = true;
224
225 size_t start = initial->idx();
226 bool finished = false;
227
228 while (visitor_continue && !finished) {
229 Point current_dir_a = current == &ia ? current->dir() : -current->dir();
230 visitor_continue = fn(ia.idx(), ib.idx(), current_dir_a);
231
232 // Parallel edges encountered. An additional pair of antipodals
233 // can be yielded.
234 if constexpr (mode == AntipodalVisitMode::Full)
235 if (cmp == 0 && visitor_continue) {
236 visitor_continue = fn(current == &ia ? ia.idx() : ia.next(),
237 current == &ib ? ib.idx() : ib.next(),
238 current_dir_a);
239 }
240
241 cmp = cmp_angles(current->dir(), current->next_dir(), other->dir());
242
243 current->inc();
244 if (cmp > 0) {
245 std::swap(current, other);
246 }
247
248 if (initial->idx() == start) finished = true;
249 }
250}
Definition ConvexHull.cpp:184
size_t idx() const
Definition ConvexHull.cpp:191
size_t inc()
Definition ConvexHull.cpp:194
size_t next() const
Definition ConvexHull.cpp:193
Point prev_dir() const
Definition ConvexHull.cpp:195
const Point next_dir() const
Definition ConvexHull.cpp:201
const Point dir() const
Definition ConvexHull.cpp:200
Definition Point.hpp:199
int cmp_angles(const Point &dir, const Point &dirA, const Point &dirB)
Definition ConvexHull.cpp:170

References cmp_angles(), Slic3r::Geometry::rotcalip::Idx::dir(), Full, Slic3r::Geometry::rotcalip::Idx::idx(), Slic3r::Geometry::rotcalip::Idx::inc(), Slic3r::Geometry::rotcalip::Idx::next(), Slic3r::Geometry::rotcalip::Idx::next_dir(), and Slic3r::Geometry::rotcalip::Idx::prev_dir().

Here is the call graph for this function: