61constexpr double kPi = 3.14159265358979323846264338327950288;
62constexpr double kTwoPi = 6.28318530717958647692528676655900576;
63constexpr double kHalfPi = 1.57079632679489661923132169163975144;
70constexpr double radians(
double a) {
return a * kPi / 180; }
77constexpr double degrees(
double a) {
return a * 180 / kPi; }
86constexpr double smoothstep(
double edge0,
double edge1,
double a) {
87 const double x = la::clamp((a - edge0) / (edge1 - edge0), 0, 1);
88 return x * x * (3 - 2 * x);
96inline double sind(
double x) {
97 if (!la::isfinite(x))
return NAN;
98 if (x < 0.0)
return -
sind(-x);
100 x = std::remquo(std::fabs(x), 90.0, &quo);
104 return math::sin(xr);
106 return math::cos(xr);
108 return -math::sin(xr);
110 return -math::cos(xr);
120inline double cosd(
double x) {
return sind(x + 90.0); }
161 vec3 min = vec3(std::numeric_limits<double>::infinity());
162 vec3 max = vec3(-std::numeric_limits<double>::infinity());
172 constexpr Box(
const vec3 p1,
const vec3 p2) {
173 min = la::min(p1, p2);
174 max = la::max(p1, p2);
180 constexpr vec3
Size()
const {
return max - min; }
185 constexpr vec3
Center()
const {
return 0.5 * (max + min); }
192 vec3 absMax = la::max(la::abs(min), la::abs(max));
193 return la::max(absMax.x, la::max(absMax.y, absMax.z));
200 return la::all(la::gequal(p, min)) && la::all(la::gequal(max, p));
207 return la::all(la::gequal(box.min, min)) &&
208 la::all(la::gequal(max, box.max));
215 min = la::min(min, p);
216 max = la::max(max, p);
224 out.min = la::min(min, box.min);
225 out.max = la::max(max, box.max);
238 vec3 minT = transform * vec4(min, 1.0);
239 vec3 maxT = transform * vec4(max, 1.0);
240 out.min = la::min(minT, maxT);
241 out.max = la::max(minT, maxT);
250 out.min = min + shift;
251 out.max = max + shift;
269 out.min = min * scale;
270 out.max = max * scale;
287 return min.x <= box.max.x && min.y <= box.max.y && min.z <= box.max.z &&
288 max.x >= box.min.x && max.y >= box.min.y && max.z >= box.min.z;
296 return p.x <= max.x && p.x >= min.x && p.y <= max.y && p.y >= min.y;
303 return la::all(la::isfinite(min)) && la::all(la::isfinite(max));
311 vec2 min = vec2(std::numeric_limits<double>::infinity());
312 vec2 max = vec2(-std::numeric_limits<double>::infinity());
322 constexpr Rect(
const vec2 a,
const vec2 b) {
335 constexpr vec2
Size()
const {
return max - min; }
340 constexpr double Area()
const {
350 vec2 absMax = la::max(la::abs(min), la::abs(max));
351 return la::max(absMax.x, absMax.y);
357 constexpr vec2
Center()
const {
return 0.5 * (max + min); }
363 return la::all(la::gequal(p, min)) && la::all(la::gequal(max, p));
370 return la::all(la::gequal(rect.min, min)) &&
371 la::all(la::gequal(max, rect.max));
378 return min.x <= rect.max.x && min.y <= rect.max.y && max.x >= rect.min.x &&
385 constexpr bool IsEmpty()
const {
return max.y <= min.y || max.x <= min.x; }
391 return la::all(la::isfinite(min)) && la::all(la::isfinite(max));
404 min = la::min(min, p);
405 max = la::max(max, p);
413 out.min = la::min(min, rect.min);
414 out.max = la::max(max, rect.max);
423 out.min = min + shift;
424 out.max = max + shift;
442 out.min = min * scale;
443 out.max = max * scale;
465 rect.min = m * vec3(min, 1);
466 rect.max = m * vec3(max, 1);
476enum class OpType :
char { Add, Subtract, Intersect };
478constexpr int DEFAULT_SEGMENTS = 0;
479constexpr double DEFAULT_ANGLE = 10.0;
480constexpr double DEFAULT_LENGTH = 1.0;
536inline std::ostream& operator<<(std::ostream& stream,
const Box& box) {
537 return stream <<
"min: " << box.min <<
", " <<
"max: " << box.max;
540inline std::ostream& operator<<(std::ostream& stream,
const Rect& box) {
541 return stream <<
"min: " << box.min <<
", " <<
"max: " << box.max;
544inline std::ostream& operator<<(std::ostream& stream,
const Smoothness& s) {
545 return stream <<
"halfedge: " << s.halfedge <<
", "
546 <<
"smoothness: " << s.smoothness;
554void Dump(
const std::vector<T>& vec) {
555 std::cout <<
"Vec = " << std::endl;
556 for (
size_t i = 0; i < vec.size(); ++i) {
557 std::cout << i <<
", " << vec[i] <<
", " << std::endl;
559 std::cout << std::endl;
563void Diff(
const std::vector<T>& a,
const std::vector<T>& b) {
564 std::cout <<
"Diff = " << std::endl;
565 if (a.size() != b.size()) {
566 std::cout <<
"a and b must have the same length, aborting Diff"
570 for (
size_t i = 0; i < a.size(); ++i) {
572 std::cout << i <<
": " << a[i] <<
", " << b[i] << std::endl;
574 std::cout << std::endl;
578 std::chrono::high_resolution_clock::time_point start, end;
580 void Start() { start = std::chrono::high_resolution_clock::now(); }
582 void Stop() { end = std::chrono::high_resolution_clock::now(); }
585 return std::chrono::duration_cast<std::chrono::milliseconds>(end - start)
588 void Print(std::string message) {
589 std::cout <<
"----------- " << std::round(Elapsed()) <<
" ms for "
590 << message << std::endl;
These static properties control how circular shapes are quantized by default on construction.
Definition common.h:491
static void SetMinCircularAngle(double angle)
Definition manifold.cpp:56
static void ResetToDefaults()
Definition manifold.cpp:110
static void SetCircularSegments(int number)
Definition manifold.cpp:84
static int GetCircularSegments(double radius)
Definition manifold.cpp:96
static void SetMinCircularEdgeLength(double length)
Definition manifold.cpp:70
int verbose
Definition common.h:530
bool suppressErrors
Definition common.h:522
bool processOverlaps
Definition common.h:519
bool cleanupTriangles
Definition common.h:525
bool selfIntersectionChecks
Definition common.h:516
bool intermediateChecks
Definition common.h:513
Global parameters that control debugging output. Only has an effect when compiled with the MANIFOLD_D...
Definition common.h:510
constexpr double smoothstep(double edge0, double edge1, double a)
Definition common.h:86
constexpr double degrees(double a)
Definition common.h:77
double cosd(double x)
Definition common.h:120
double sind(double x)
Definition common.h:96
constexpr double radians(double a)
Definition common.h:70
size_t halfedge
The halfedge index = 3 * tri + i, referring to Mesh.triVerts[tri][i].
Definition common.h:150
double smoothness
Definition common.h:154
OpType
Boolean operation type: Add (Union), Subtract (Difference), and Intersect.
Definition common.h:476
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:142
std::vector< vec2 > SimplePolygon
Single polygon contour, wound CCW. First and last point are implicitly connected. Should ensure all i...
Definition common.h:134
Defines which edges to sharpen and how much for the Manifold.Smooth() constructor.
Definition common.h:148
Axis-aligned 3D box, primarily for bounding.
Definition common.h:160
constexpr Box Transform(const mat3x4 &transform) const
Definition common.h:236
constexpr Box operator+(vec3 shift) const
Definition common.h:248
constexpr bool Contains(const Box &box) const
Definition common.h:206
constexpr vec3 Center() const
Definition common.h:185
constexpr bool DoesOverlap(const Box &box) const
Definition common.h:286
constexpr double Scale() const
Definition common.h:191
constexpr Box Union(const Box &box) const
Definition common.h:222
constexpr bool DoesOverlap(vec3 p) const
Definition common.h:295
void Union(const vec3 p)
Definition common.h:214
Box & operator*=(vec3 scale)
Definition common.h:277
constexpr bool IsFinite() const
Definition common.h:302
constexpr vec3 Size() const
Definition common.h:180
constexpr Box operator*(vec3 scale) const
Definition common.h:267
Box & operator+=(vec3 shift)
Definition common.h:258
constexpr Box(const vec3 p1, const vec3 p2)
Definition common.h:172
constexpr Box()
Definition common.h:167
constexpr bool Contains(const vec3 &p) const
Definition common.h:199
Rect & operator*=(const vec2 scale)
Definition common.h:450
constexpr bool Contains(const Rect &rect) const
Definition common.h:369
constexpr bool Contains(const vec2 &p) const
Definition common.h:362
constexpr bool IsEmpty() const
Definition common.h:385
constexpr Rect(const vec2 a, const vec2 b)
Definition common.h:322
constexpr vec2 Size() const
Definition common.h:335
constexpr double Area() const
Definition common.h:340
constexpr double Scale() const
Definition common.h:349
constexpr vec2 Center() const
Definition common.h:357
constexpr Rect operator*(const vec2 scale) const
Definition common.h:440
constexpr Rect operator+(const vec2 shift) const
Definition common.h:421
constexpr Rect Transform(const mat2x3 &m) const
Definition common.h:463
void Union(const vec2 p)
Definition common.h:403
constexpr Rect()
Definition common.h:317
constexpr bool IsFinite() const
Definition common.h:390
constexpr Rect Union(const Rect &rect) const
Definition common.h:411
constexpr bool DoesOverlap(const Rect &rect) const
Definition common.h:377
Rect & operator+=(const vec2 shift)
Definition common.h:431