Prusa Slicer 2.6.0
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 = typedef boost::multiprecision::int128_t

◆ int256_t

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

Enumeration Type Documentation

◆ AntipodalVisitMode

Function Documentation

◆ cmp_angles()

int Slic3r::Geometry::rotcalip::cmp_angles ( const Point dir,
const Point dirA,
const Point dirB 
)
160 {
161 int128_t dotA = dot(dir, dirA);
162 int128_t dotB = dot(-dir, dirB);
163 int256_t dcosa = int256_t(magnsq(dirB)) * int256_t(abs(dotA)) * dotA;
164 int256_t dcosb = int256_t(magnsq(dirA)) * int256_t(abs(dotB)) * dotB;
165 int256_t diff = dcosa - dcosb;
166
167 return diff > 0? -1 : (diff < 0 ? 1 : 0);
168}
boost::multiprecision::int256_t int256_t
Definition ConvexHull.cpp:133
boost::multiprecision::int128_t int128_t
Definition ConvexHull.cpp:134
Slic3r::Polygons diff(const Slic3r::Polygon &subject, const Slic3r::Polygon &clip, ApplySafetyOffset do_safety_offset)
Definition ClipperUtils.cpp:672

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
144{
145 return Scalar(a.x()) * b.x() + Scalar(a.y()) * b.y();
146}

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
150{
151 return Scalar(a.x()) * b.y() - Scalar(a.y()) * b.x();
152}

◆ magnsq()

template<class Scalar = int64_t>
Scalar Slic3r::Geometry::rotcalip::magnsq ( const Point p)
inline
138{
139 return Scalar(p.x()) * p.x() + Scalar(p.y()) * p.y();
140}

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 
)
208{
209 // Set current caliper direction to be the lower edge angle from X axis
210 int cmp = cmp_angles(ia.prev_dir(), ia.dir(), ib.dir());
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 // Parallel edges encountered. An additional pair of antipodals
223 // can be yielded.
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
233 current->inc();
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
Definition Point.hpp:158
int cmp_angles(const Point &dir, const Point &dirA, const Point &dirB)
Definition ConvexHull.cpp:160

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: