24#include "optional_assert.h"
60constexpr double kPi = 3.14159265358979323846264338327950288;
61constexpr double kTwoPi = 6.28318530717958647692528676655900576;
62constexpr double kHalfPi = 1.57079632679489661923132169163975144;
69constexpr double radians(
double a) {
return a * kPi / 180; }
76constexpr double degrees(
double a) {
return a * 180 / kPi; }
85constexpr double smoothstep(
double edge0,
double edge1,
double a) {
86 const double x = la::clamp((a - edge0) / (edge1 - edge0), 0, 1);
87 return x * x * (3 - 2 * x);
95inline double sind(
double x) {
96 if (!la::isfinite(x))
return sin(x);
97 if (x < 0.0)
return -
sind(-x);
99 x = remquo(fabs(x), 90.0, &quo);
118inline double cosd(
double x) {
return sind(x + 90.0); }
159 vec3 min = vec3(std::numeric_limits<double>::infinity());
160 vec3 max = vec3(-std::numeric_limits<double>::infinity());
170 constexpr Box(
const vec3 p1,
const vec3 p2) {
171 min = la::min(p1, p2);
172 max = la::max(p1, p2);
178 constexpr vec3
Size()
const {
return max - min; }
183 constexpr vec3
Center()
const {
return 0.5 * (max + min); }
190 vec3 absMax = la::max(la::abs(min), la::abs(max));
191 return la::max(absMax.x, la::max(absMax.y, absMax.z));
198 return la::all(la::gequal(p, min)) && la::all(la::gequal(max, p));
205 return la::all(la::gequal(box.min, min)) &&
206 la::all(la::gequal(max, box.max));
213 min = la::min(min, p);
214 max = la::max(max, p);
222 out.min = la::min(min, box.min);
223 out.max = la::max(max, box.max);
236 vec3 minT = transform * vec4(min, 1.0);
237 vec3 maxT = transform * vec4(max, 1.0);
238 out.min = la::min(minT, maxT);
239 out.max = la::max(minT, maxT);
248 out.min = min + shift;
249 out.max = max + shift;
267 out.min = min * scale;
268 out.max = max * scale;
285 return min.x <= box.max.x && min.y <= box.max.y && min.z <= box.max.z &&
286 max.x >= box.min.x && max.y >= box.min.y && max.z >= box.min.z;
294 return p.x <= max.x && p.x >= min.x && p.y <= max.y && p.y >= min.y;
301 return la::all(la::isfinite(min)) && la::all(la::isfinite(max));
309 vec2 min = vec2(std::numeric_limits<double>::infinity());
310 vec2 max = vec2(-std::numeric_limits<double>::infinity());
320 constexpr Rect(
const vec2 a,
const vec2 b) {
333 constexpr vec2
Size()
const {
return max - min; }
338 constexpr double Area()
const {
348 vec2 absMax = la::max(la::abs(min), la::abs(max));
349 return la::max(absMax.x, absMax.y);
355 constexpr vec2
Center()
const {
return 0.5 * (max + min); }
361 return la::all(la::gequal(p, min)) && la::all(la::gequal(max, p));
368 return la::all(la::gequal(rect.min, min)) &&
369 la::all(la::gequal(max, rect.max));
376 return min.x <= rect.max.x && min.y <= rect.max.y && max.x >= rect.min.x &&
383 constexpr bool IsEmpty()
const {
return max.y <= min.y || max.x <= min.x; };
389 return la::all(la::isfinite(min)) && la::all(la::isfinite(max));
402 min = la::min(min, p);
403 max = la::max(max, p);
411 out.min = la::min(min, rect.min);
412 out.max = la::max(max, rect.max);
421 out.min = min + shift;
422 out.max = max + shift;
440 out.min = min * scale;
441 out.max = max * scale;
463 rect.min = m * vec3(min, 1);
464 rect.max = m * vec3(max, 1);
474enum class OpType { Add, Subtract, Intersect };
476constexpr int DEFAULT_SEGMENTS = 0;
477constexpr double DEFAULT_ANGLE = 10.0;
478constexpr double DEFAULT_LENGTH = 1.0;
491 inline static int circularSegments_ = DEFAULT_SEGMENTS;
492 inline static double circularAngle_ = DEFAULT_ANGLE;
493 inline static double circularEdgeLength_ = DEFAULT_LENGTH;
507 if (angle <= 0)
return;
508 circularAngle_ = angle;
521 if (length <= 0)
return;
522 circularEdgeLength_ = length;
535 if (number < 3 && number != 0)
return;
536 circularSegments_ = number;
547 if (circularSegments_ > 0)
return circularSegments_;
548 int nSegA = 360.0 / circularAngle_;
549 int nSegL = 2.0 * radius * kPi / circularEdgeLength_;
550 int nSeg = fmin(nSegA, nSegL) + 3;
552 return std::max(nSeg, 4);
561 circularSegments_ = DEFAULT_SEGMENTS;
562 circularAngle_ = DEFAULT_ANGLE;
563 circularEdgeLength_ = DEFAULT_LENGTH;
604std::ostream& operator<<(std::ostream& out,
const la::vec<T, 1>& v) {
605 return out <<
'{' << v[0] <<
'}';
608std::ostream& operator<<(std::ostream& out,
const la::vec<T, 2>& v) {
609 return out <<
'{' << v[0] <<
',' << v[1] <<
'}';
612std::ostream& operator<<(std::ostream& out,
const la::vec<T, 3>& v) {
613 return out <<
'{' << v[0] <<
',' << v[1] <<
',' << v[2] <<
'}';
616std::ostream& operator<<(std::ostream& out,
const la::vec<T, 4>& v) {
617 return out <<
'{' << v[0] <<
',' << v[1] <<
',' << v[2] <<
',' << v[3] <<
'}';
620template <
class T,
int M>
622 return out <<
'{' << m[0] <<
'}';
624template <
class T,
int M>
626 return out <<
'{' << m[0] <<
',' << m[1] <<
'}';
628template <
class T,
int M>
630 return out <<
'{' << m[0] <<
',' << m[1] <<
',' << m[2] <<
'}';
632template <
class T,
int M>
634 return out <<
'{' << m[0] <<
',' << m[1] <<
',' << m[2] <<
',' << m[3] <<
'}';
637inline std::ostream& operator<<(std::ostream& stream,
const Box& box) {
638 return stream <<
"min: " << box.min <<
", "
639 <<
"max: " << box.max;
642inline std::ostream& operator<<(std::ostream& stream,
const Rect& box) {
643 return stream <<
"min: " << box.min <<
", "
644 <<
"max: " << box.max;
647inline std::ostream& operator<<(std::ostream& stream,
const Smoothness& s) {
648 return stream <<
"halfedge: " << s.halfedge <<
", "
649 <<
"smoothness: " << s.smoothness;
657void Dump(
const std::vector<T>& vec) {
658 std::cout <<
"Vec = " << std::endl;
659 for (
size_t i = 0; i < vec.size(); ++i) {
660 std::cout << i <<
", " << vec[i] <<
", " << std::endl;
662 std::cout << std::endl;
666void Diff(
const std::vector<T>& a,
const std::vector<T>& b) {
667 std::cout <<
"Diff = " << std::endl;
668 if (a.size() != b.size()) {
669 std::cout <<
"a and b must have the same length, aborting Diff"
673 for (
size_t i = 0; i < a.size(); ++i) {
675 std::cout << i <<
": " << a[i] <<
", " << b[i] << std::endl;
677 std::cout << std::endl;
681 std::chrono::high_resolution_clock::time_point start, end;
683 void Start() { start = std::chrono::high_resolution_clock::now(); }
685 void Stop() { end = std::chrono::high_resolution_clock::now(); }
688 return std::chrono::duration_cast<std::chrono::milliseconds>(end - start)
691 void Print(std::string message) {
692 std::cout <<
"----------- " << std::round(Elapsed()) <<
" ms for "
693 << message << std::endl;
These static properties control how circular shapes are quantized by default on construction.
Definition common.h:489
static void ResetToDefaults()
Definition common.h:560
static void SetCircularSegments(int number)
Definition common.h:534
static void SetMinCircularAngle(double angle)
Definition common.h:506
static int GetCircularSegments(double radius)
Definition common.h:546
static void SetMinCircularEdgeLength(double length)
Definition common.h:520
int verbose
Definition common.h:598
bool suppressErrors
Definition common.h:589
bool processOverlaps
Definition common.h:586
bool cleanupTriangles
Definition common.h:592
bool selfIntersectionChecks
Definition common.h:583
bool intermediateChecks
Definition common.h:580
Global parameters that control debugging output. Only has an effect when compiled with the MANIFOLD_D...
Definition common.h:577
constexpr double smoothstep(double edge0, double edge1, double a)
Definition common.h:85
constexpr double degrees(double a)
Definition common.h:76
double cosd(double x)
Definition common.h:118
double sind(double x)
Definition common.h:95
constexpr double radians(double a)
Definition common.h:69
size_t halfedge
The halfedge index = 3 * tri + i, referring to Mesh.triVerts[tri][i].
Definition common.h:148
double smoothness
Definition common.h:152
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:140
OpType
Boolean operation type: Add (Union), Subtract (Difference), and Intersect.
Definition common.h:474
std::vector< vec2 > SimplePolygon
Single polygon contour, wound CCW. First and last point are implicitly connected. Should ensure all i...
Definition common.h:132
Defines which edges to sharpen and how much for the Manifold.Smooth() constructor.
Definition common.h:146
Axis-aligned 3D box, primarily for bounding.
Definition common.h:158
constexpr Box Transform(const mat3x4 &transform) const
Definition common.h:234
constexpr Box operator+(vec3 shift) const
Definition common.h:246
constexpr bool Contains(const Box &box) const
Definition common.h:204
constexpr vec3 Center() const
Definition common.h:183
constexpr bool DoesOverlap(const Box &box) const
Definition common.h:284
constexpr double Scale() const
Definition common.h:189
constexpr Box Union(const Box &box) const
Definition common.h:220
constexpr bool DoesOverlap(vec3 p) const
Definition common.h:293
void Union(const vec3 p)
Definition common.h:212
Box & operator*=(vec3 scale)
Definition common.h:275
constexpr bool IsFinite() const
Definition common.h:300
constexpr vec3 Size() const
Definition common.h:178
constexpr Box operator*(vec3 scale) const
Definition common.h:265
Box & operator+=(vec3 shift)
Definition common.h:256
constexpr Box(const vec3 p1, const vec3 p2)
Definition common.h:170
constexpr Box()
Definition common.h:165
constexpr bool Contains(const vec3 &p) const
Definition common.h:197
Axis-aligned 2D box, primarily for bounding.
Definition common.h:308
Rect & operator*=(const vec2 scale)
Definition common.h:448
constexpr bool Contains(const Rect &rect) const
Definition common.h:367
constexpr bool Contains(const vec2 &p) const
Definition common.h:360
constexpr bool IsEmpty() const
Definition common.h:383
constexpr Rect(const vec2 a, const vec2 b)
Definition common.h:320
constexpr vec2 Size() const
Definition common.h:333
constexpr double Area() const
Definition common.h:338
constexpr double Scale() const
Definition common.h:347
constexpr vec2 Center() const
Definition common.h:355
constexpr Rect operator*(const vec2 scale) const
Definition common.h:438
constexpr Rect operator+(const vec2 shift) const
Definition common.h:419
constexpr Rect Transform(const mat2x3 &m) const
Definition common.h:461
void Union(const vec2 p)
Definition common.h:401
constexpr Rect()
Definition common.h:315
constexpr bool IsFinite() const
Definition common.h:388
constexpr Rect Union(const Rect &rect) const
Definition common.h:409
constexpr bool DoesOverlap(const Rect &rect) const
Definition common.h:375
Rect & operator+=(const vec2 shift)
Definition common.h:429