21#if defined(MANIFOLD_DEBUG) || defined(MANIFOLD_TIMING)
63constexpr double kPi = 3.14159265358979323846264338327950288;
64constexpr double kTwoPi = 6.28318530717958647692528676655900576;
65constexpr double kHalfPi = 1.57079632679489661923132169163975144;
72constexpr double radians(
double a) {
return a * kPi / 180; }
79constexpr double degrees(
double a) {
return a * 180 / kPi; }
88constexpr double smoothstep(
double edge0,
double edge1,
double a) {
89 const double x = la::clamp((a - edge0) / (edge1 - edge0), 0, 1);
90 return x * x * (3 - 2 * x);
98inline double sind(
double x) {
99 if (!la::isfinite(x))
return NAN;
100 if (x < 0.0)
return -
sind(-x);
102 x = std::remquo(std::fabs(x), 90.0, &quo);
106 return math::sin(xr);
108 return math::cos(xr);
110 return -math::sin(xr);
112 return -math::cos(xr);
122inline double cosd(
double x) {
return sind(x + 90.0); }
215class ExecutionContext {
219 ExecutionContext(
const ExecutionContext&);
220 ExecutionContext(ExecutionContext&&)
noexcept;
221 ExecutionContext& operator=(
const ExecutionContext&);
222 ExecutionContext& operator=(ExecutionContext&&)
noexcept;
235 std::shared_ptr<Impl> impl_;
242 vec3 min = vec3(std::numeric_limits<double>::infinity());
243 vec3 max = vec3(-std::numeric_limits<double>::infinity());
253 constexpr Box(
const vec3 p1,
const vec3 p2) {
254 min = la::min(p1, p2);
255 max = la::max(p1, p2);
261 constexpr vec3
Size()
const {
return max - min; }
266 constexpr vec3
Center()
const {
return 0.5 * (max + min); }
273 vec3 absMax = la::max(la::abs(min), la::abs(max));
274 return la::max(absMax.x, la::max(absMax.y, absMax.z));
281 return la::all(la::gequal(p, min)) && la::all(la::gequal(max, p));
288 return la::all(la::gequal(box.min, min)) &&
289 la::all(la::gequal(max, box.max));
296 return la::all(la::equal(box.min, min)) && la::all(la::equal(max, box.max));
308 min = la::min(min, p);
309 max = la::max(max, p);
317 out.min = la::min(min, box.min);
318 out.max = la::max(max, box.max);
331 vec3 minT = transform * vec4(min, 1.0);
332 vec3 maxT = transform * vec4(max, 1.0);
333 out.min = la::min(minT, maxT);
334 out.max = la::max(minT, maxT);
343 out.min = min + shift;
344 out.max = max + shift;
362 out.min = min * scale;
363 out.max = max * scale;
380 return min.x <= box.max.x && min.y <= box.max.y && min.z <= box.max.z &&
381 max.x >= box.min.x && max.y >= box.min.y && max.z >= box.min.z;
389 return p.x <= max.x && p.x >= min.x && p.y <= max.y && p.y >= min.y;
396 return la::all(la::isfinite(min)) && la::all(la::isfinite(max));
404 vec2 min = vec2(std::numeric_limits<double>::infinity());
405 vec2 max = vec2(-std::numeric_limits<double>::infinity());
415 constexpr Rect(
const vec2 a,
const vec2 b) {
428 constexpr vec2
Size()
const {
return max - min; }
433 constexpr double Area()
const {
443 vec2 absMax = la::max(la::abs(min), la::abs(max));
444 return la::max(absMax.x, absMax.y);
450 constexpr vec2
Center()
const {
return 0.5 * (max + min); }
456 return la::all(la::gequal(p, min)) && la::all(la::gequal(max, p));
463 return la::all(la::gequal(rect.min, min)) &&
464 la::all(la::gequal(max, rect.max));
471 return min.x <= rect.max.x && min.y <= rect.max.y && max.x >= rect.min.x &&
478 constexpr bool IsEmpty()
const {
return max.y <= min.y || max.x <= min.x; }
484 return la::all(la::isfinite(min)) && la::all(la::isfinite(max));
497 min = la::min(min, p);
498 max = la::max(max, p);
506 out.min = la::min(min, rect.min);
507 out.max = la::max(max, rect.max);
516 out.min = min + shift;
517 out.max = max + shift;
535 out.min = min * scale;
536 out.max = max * scale;
558 rect.min = m * vec3(min, 1);
559 rect.max = m * vec3(max, 1);
569enum class OpType :
char { Add, Subtract, Intersect };
571constexpr int DEFAULT_SEGMENTS = 0;
572constexpr double DEFAULT_ANGLE = 10.0;
573constexpr double DEFAULT_LENGTH = 1.0;
629inline std::ostream& operator<<(std::ostream& stream,
const Box& box) {
630 return stream <<
"min: " << box.min <<
", " <<
"max: " << box.max;
633inline std::ostream& operator<<(std::ostream& stream,
const Rect& box) {
634 return stream <<
"min: " << box.min <<
", " <<
"max: " << box.max;
637inline std::ostream& operator<<(std::ostream& stream,
const Smoothness& s) {
638 return stream <<
"halfedge: " << s.halfedge <<
", "
639 <<
"smoothness: " << s.smoothness;
647void Dump(
const std::vector<T>& vec) {
648 std::cout <<
"Vec = " << std::endl;
649 for (
size_t i = 0; i < vec.size(); ++i) {
650 std::cout << i <<
", " << vec[i] <<
", " << std::endl;
652 std::cout << std::endl;
656void Diff(
const std::vector<T>& a,
const std::vector<T>& b) {
657 std::cout <<
"Diff = " << std::endl;
658 if (a.size() != b.size()) {
659 std::cout <<
"a and b must have the same length, aborting Diff"
663 for (
size_t i = 0; i < a.size(); ++i) {
665 std::cout << i <<
": " << a[i] <<
", " << b[i] << std::endl;
667 std::cout << std::endl;
672#if defined(MANIFOLD_DEBUG) || defined(MANIFOLD_TIMING)
674 std::chrono::high_resolution_clock::time_point start, end;
676 void Start() { start = std::chrono::high_resolution_clock::now(); }
678 void Stop() { end = std::chrono::high_resolution_clock::now(); }
681 return std::chrono::duration_cast<std::chrono::milliseconds>(end - start)
684 void Print(std::string message) {
685 std::cout <<
"----------- " << std::round(Elapsed()) <<
" ms for "
686 << message << std::endl;
bool Cancelled() const
Has cancellation been requested?
void Cancel()
Request cancellation. Can be called from any thread. Idempotent.
These static properties control how circular shapes are quantized by default on construction.
Definition common.h:584
static void SetMinCircularAngle(double angle)
Definition manifold.cpp:57
static void ResetToDefaults()
Definition manifold.cpp:111
static void SetCircularSegments(int number)
Definition manifold.cpp:85
static int GetCircularSegments(double radius)
Definition manifold.cpp:97
static void SetMinCircularEdgeLength(double length)
Definition manifold.cpp:71
int verbose
Definition common.h:623
bool suppressErrors
Definition common.h:615
bool processOverlaps
Definition common.h:612
bool cleanupTriangles
Definition common.h:618
bool selfIntersectionChecks
Definition common.h:609
bool intermediateChecks
Definition common.h:606
Global parameters that control debugging output. Only has an effect when compiled with the MANIFOLD_D...
Definition common.h:603
constexpr double smoothstep(double edge0, double edge1, double a)
Definition common.h:88
constexpr double degrees(double a)
Definition common.h:79
double cosd(double x)
Definition common.h:122
double sind(double x)
Definition common.h:98
constexpr double radians(double a)
Definition common.h:72
vec3 position
The 3D position of the hit point.
Definition common.h:170
uint64_t faceID
The triangle index that was hit.
Definition common.h:164
double distance
Definition common.h:168
vec3 normal
The geometric face normal at the hit.
Definition common.h:172
size_t halfedge
The halfedge index = 3 * tri + i, referring to Mesh.triVerts[tri][i].
Definition common.h:152
double smoothness
Definition common.h:156
OpType
Boolean operation type: Add (Union), Subtract (Difference), and Intersect.
Definition common.h:569
std::vector< SimplePolygon > Polygons
Set of polygons with holes. Order of contours is arbitrary. Can contain any depth of nested holes and...
Definition common.h:144
std::vector< vec2 > SimplePolygon
Single polygon contour, wound CCW. First and last point are implicitly connected. Should ensure all i...
Definition common.h:136
Result of a ray cast query against a Manifold.
Definition common.h:162
Defines which edges to sharpen and how much for the Manifold.Smooth() constructor.
Definition common.h:150
Axis-aligned 3D box, primarily for bounding.
Definition common.h:241
constexpr Box Transform(const mat3x4 &transform) const
Definition common.h:329
constexpr Box operator+(vec3 shift) const
Definition common.h:341
constexpr bool Contains(const Box &box) const
Definition common.h:287
constexpr vec3 Center() const
Definition common.h:266
constexpr bool DoesOverlap(const Box &box) const
Definition common.h:379
constexpr double Scale() const
Definition common.h:272
constexpr Box Union(const Box &box) const
Definition common.h:315
constexpr bool DoesOverlap(vec3 p) const
Definition common.h:388
void Union(const vec3 p)
Definition common.h:307
constexpr bool operator==(const Box &box) const
Definition common.h:295
constexpr bool operator!=(const Box &box) const
Definition common.h:302
Box & operator*=(vec3 scale)
Definition common.h:370
constexpr bool IsFinite() const
Definition common.h:395
constexpr vec3 Size() const
Definition common.h:261
constexpr Box operator*(vec3 scale) const
Definition common.h:360
Box & operator+=(vec3 shift)
Definition common.h:351
constexpr Box(const vec3 p1, const vec3 p2)
Definition common.h:253
constexpr Box()
Definition common.h:248
constexpr bool Contains(const vec3 &p) const
Definition common.h:280
Rect & operator*=(const vec2 scale)
Definition common.h:543
constexpr bool Contains(const Rect &rect) const
Definition common.h:462
constexpr bool Contains(const vec2 &p) const
Definition common.h:455
constexpr bool IsEmpty() const
Definition common.h:478
constexpr Rect(const vec2 a, const vec2 b)
Definition common.h:415
constexpr vec2 Size() const
Definition common.h:428
constexpr double Area() const
Definition common.h:433
constexpr double Scale() const
Definition common.h:442
constexpr vec2 Center() const
Definition common.h:450
constexpr Rect operator*(const vec2 scale) const
Definition common.h:533
constexpr Rect operator+(const vec2 shift) const
Definition common.h:514
constexpr Rect Transform(const mat2x3 &m) const
Definition common.h:556
void Union(const vec2 p)
Definition common.h:496
constexpr Rect()
Definition common.h:410
constexpr bool IsFinite() const
Definition common.h:483
constexpr Rect Union(const Rect &rect) const
Definition common.h:504
constexpr bool DoesOverlap(const Rect &rect) const
Definition common.h:470
Rect & operator+=(const vec2 shift)
Definition common.h:524