22#if defined(MANIFOLD_DEBUG) || defined(MANIFOLD_TIMING)
35template <
typename Precision,
typename I = u
int32_t>
74constexpr double kPi = 3.14159265358979323846264338327950288;
75constexpr double kTwoPi = 6.28318530717958647692528676655900576;
76constexpr double kHalfPi = 1.57079632679489661923132169163975144;
83constexpr double radians(
double a) {
return a * kPi / 180; }
90constexpr double degrees(
double a) {
return a * 180 / kPi; }
99constexpr double smoothstep(
double edge0,
double edge1,
double a) {
100 const double x = la::clamp((a - edge0) / (edge1 - edge0), 0, 1);
101 return x * x * (3 - 2 * x);
110 if (!la::isfinite(x))
return NAN;
111 if (x < 0.0)
return -
sind(-x);
113 x = std::remquo(std::fabs(x), 90.0, &quo);
117 return math::sin(xr);
119 return math::cos(xr);
121 return -math::sin(xr);
123 return -math::cos(xr);
133inline double cosd(
double x) {
return sind(x + 90.0); }
244class ExecutionContext {
248 ExecutionContext(
const ExecutionContext&);
249 ExecutionContext(ExecutionContext&&)
noexcept;
250 ExecutionContext& operator=(
const ExecutionContext&);
251 ExecutionContext& operator=(ExecutionContext&&)
noexcept;
278 const std::vector<Smoothness>& sharpenedEdges = {});
280 const std::vector<Smoothness>& sharpenedEdges = {});
286 double edgeLength,
double level = 0,
double tolerance = -1,
287 bool canParallel =
true);
292 std::shared_ptr<Impl> impl_;
299 vec3 min = vec3(std::numeric_limits<double>::infinity());
300 vec3 max = vec3(-std::numeric_limits<double>::infinity());
310 constexpr Box(
const vec3 p1,
const vec3 p2) {
311 min = la::min(p1, p2);
312 max = la::max(p1, p2);
318 constexpr vec3
Size()
const {
return max - min; }
323 constexpr vec3
Center()
const {
return 0.5 * (max + min); }
330 vec3 absMax = la::max(la::abs(min), la::abs(max));
331 return la::max(absMax.x, la::max(absMax.y, absMax.z));
338 return la::all(la::gequal(p, min)) && la::all(la::gequal(max, p));
345 return la::all(la::gequal(box.min, min)) &&
346 la::all(la::gequal(max, box.max));
353 return la::all(la::equal(box.min, min)) && la::all(la::equal(max, box.max));
365 min = la::min(min, p);
366 max = la::max(max, p);
374 out.min = la::min(min, box.min);
375 out.max = la::max(max, box.max);
388 vec3 minT = transform * vec4(min, 1.0);
389 vec3 maxT = transform * vec4(max, 1.0);
390 out.min = la::min(minT, maxT);
391 out.max = la::max(minT, maxT);
400 out.min = min + shift;
401 out.max = max + shift;
419 out.min = min * scale;
420 out.max = max * scale;
437 return min.x <= box.max.x && min.y <= box.max.y && min.z <= box.max.z &&
438 max.x >= box.min.x && max.y >= box.min.y && max.z >= box.min.z;
446 return p.x <= max.x && p.x >= min.x && p.y <= max.y && p.y >= min.y;
453 return la::all(la::isfinite(min)) && la::all(la::isfinite(max));
461 vec2 min = vec2(std::numeric_limits<double>::infinity());
462 vec2 max = vec2(-std::numeric_limits<double>::infinity());
472 constexpr Rect(
const vec2 a,
const vec2 b) {
485 constexpr vec2
Size()
const {
return max - min; }
490 constexpr double Area()
const {
500 vec2 absMax = la::max(la::abs(min), la::abs(max));
501 return la::max(absMax.x, absMax.y);
507 constexpr vec2
Center()
const {
return 0.5 * (max + min); }
513 return la::all(la::gequal(p, min)) && la::all(la::gequal(max, p));
520 return la::all(la::gequal(rect.min, min)) &&
521 la::all(la::gequal(max, rect.max));
528 return min.x <= rect.max.x && min.y <= rect.max.y && max.x >= rect.min.x &&
535 constexpr bool IsEmpty()
const {
return max.y <= min.y || max.x <= min.x; }
541 return la::all(la::isfinite(min)) && la::all(la::isfinite(max));
554 min = la::min(min, p);
555 max = la::max(max, p);
563 out.min = la::min(min, rect.min);
564 out.max = la::max(max, rect.max);
573 out.min = min + shift;
574 out.max = max + shift;
592 out.min = min * scale;
593 out.max = max * scale;
615 rect.min = m * vec3(min, 1);
616 rect.max = m * vec3(max, 1);
626enum class OpType :
char { Add, Subtract, Intersect };
661constexpr int DEFAULT_SEGMENTS = 0;
662constexpr double DEFAULT_ANGLE = 10.0;
663constexpr double DEFAULT_LENGTH = 1.0;
719inline std::ostream& operator<<(std::ostream& stream,
const Box& box) {
720 return stream <<
"min: " << box.min <<
", " <<
"max: " << box.max;
723inline std::ostream& operator<<(std::ostream& stream,
const Rect& box) {
724 return stream <<
"min: " << box.min <<
", " <<
"max: " << box.max;
727inline std::ostream& operator<<(std::ostream& stream,
const Smoothness& s) {
728 return stream <<
"halfedge: " << s.halfedge <<
", "
729 <<
"smoothness: " << s.smoothness;
737void Dump(
const std::vector<T>& vec) {
738 std::cout <<
"Vec = " << std::endl;
739 for (
size_t i = 0; i < vec.size(); ++i) {
740 std::cout << i <<
", " << vec[i] <<
", " << std::endl;
742 std::cout << std::endl;
746void Diff(
const std::vector<T>& a,
const std::vector<T>& b) {
747 std::cout <<
"Diff = " << std::endl;
748 if (a.size() != b.size()) {
749 std::cout <<
"a and b must have the same length, aborting Diff"
753 for (
size_t i = 0; i < a.size(); ++i) {
755 std::cout << i <<
": " << a[i] <<
", " << b[i] << std::endl;
757 std::cout << std::endl;
762#if defined(MANIFOLD_DEBUG) || defined(MANIFOLD_TIMING)
764 std::chrono::high_resolution_clock::time_point start, end;
766 void Start() { start = std::chrono::high_resolution_clock::now(); }
768 void Stop() { end = std::chrono::high_resolution_clock::now(); }
771 return std::chrono::duration_cast<std::chrono::milliseconds>(end - start)
774 void Print(std::string message) {
775 std::cout <<
"----------- " << std::round(Elapsed()) <<
" ms for "
776 << message << std::endl;
Manifold LevelSet(std::function< double(vec3)> sdf, Box bounds, double edgeLength, double level=0, double tolerance=-1, bool canParallel=true)
Manifold FromMeshGL(const MeshGL &mesh)
bool Cancelled() const
Has cancellation been requested?
void Cancel()
Request cancellation. Can be called from any thread. Idempotent.
Manifold Smooth(const MeshGL &mesh, const std::vector< Smoothness > &sharpenedEdges={})
This library's internal representation of an oriented, 2-manifold, triangle mesh - a simple boundary-...
Definition manifold.h:67
These static properties control how circular shapes are quantized by default on construction.
Definition common.h:674
static void SetMinCircularAngle(double angle)
Definition manifold.cpp:57
static void ResetToDefaults()
Definition manifold.cpp:113
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:713
bool suppressErrors
Definition common.h:705
bool processOverlaps
Definition common.h:702
bool cleanupTriangles
Definition common.h:708
bool selfIntersectionChecks
Definition common.h:699
bool intermediateChecks
Definition common.h:696
Global parameters that control debugging output. Only has an effect when compiled with the MANIFOLD_D...
Definition common.h:693
constexpr double smoothstep(double edge0, double edge1, double a)
Definition common.h:99
constexpr double degrees(double a)
Definition common.h:90
double cosd(double x)
Definition common.h:133
double sind(double x)
Definition common.h:109
constexpr double radians(double a)
Definition common.h:83
vec3 position
The 3D position of the hit point.
Definition common.h:181
uint64_t faceID
The triangle index that was hit.
Definition common.h:175
double distance
Definition common.h:179
vec3 normal
The geometric face normal at the hit.
Definition common.h:183
size_t halfedge
The halfedge index = 3 * tri + i, referring to Mesh.triVerts[tri][i].
Definition common.h:163
double smoothness
Definition common.h:167
OpType
Boolean operation type: Add (Union), Subtract (Difference), and Intersect.
Definition common.h:626
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:155
std::vector< vec2 > SimplePolygon
Single polygon contour, wound CCW. First and last point are implicitly connected. Should ensure all i...
Definition common.h:147
JoinType
Definition common.h:637
@ Bevel
Definition common.h:649
@ Round
Definition common.h:641
@ Square
Definition common.h:638
@ Miter
Definition common.h:644
Result of a ray cast query against a Manifold.
Definition common.h:173
Defines which edges to sharpen and how much for the Manifold.Smooth() constructor.
Definition common.h:161
Axis-aligned 3D box, primarily for bounding.
Definition common.h:298
constexpr Box Transform(const mat3x4 &transform) const
Definition common.h:386
constexpr Box operator+(vec3 shift) const
Definition common.h:398
constexpr bool Contains(const Box &box) const
Definition common.h:344
constexpr vec3 Center() const
Definition common.h:323
constexpr bool DoesOverlap(const Box &box) const
Definition common.h:436
constexpr double Scale() const
Definition common.h:329
constexpr Box Union(const Box &box) const
Definition common.h:372
constexpr bool DoesOverlap(vec3 p) const
Definition common.h:445
void Union(const vec3 p)
Definition common.h:364
constexpr bool operator==(const Box &box) const
Definition common.h:352
constexpr bool operator!=(const Box &box) const
Definition common.h:359
Box & operator*=(vec3 scale)
Definition common.h:427
constexpr bool IsFinite() const
Definition common.h:452
constexpr vec3 Size() const
Definition common.h:318
constexpr Box operator*(vec3 scale) const
Definition common.h:417
Box & operator+=(vec3 shift)
Definition common.h:408
constexpr Box(const vec3 p1, const vec3 p2)
Definition common.h:310
constexpr Box()
Definition common.h:305
constexpr bool Contains(const vec3 &p) const
Definition common.h:337
Mesh input/output suitable for pushing directly into graphics libraries.
Definition mesh.h:102
Rect & operator*=(const vec2 scale)
Definition common.h:600
constexpr bool Contains(const Rect &rect) const
Definition common.h:519
constexpr bool Contains(const vec2 &p) const
Definition common.h:512
constexpr bool IsEmpty() const
Definition common.h:535
constexpr Rect(const vec2 a, const vec2 b)
Definition common.h:472
constexpr vec2 Size() const
Definition common.h:485
constexpr double Area() const
Definition common.h:490
constexpr double Scale() const
Definition common.h:499
constexpr vec2 Center() const
Definition common.h:507
constexpr Rect operator*(const vec2 scale) const
Definition common.h:590
constexpr Rect operator+(const vec2 shift) const
Definition common.h:571
constexpr Rect Transform(const mat2x3 &m) const
Definition common.h:613
void Union(const vec2 p)
Definition common.h:553
constexpr Rect()
Definition common.h:467
constexpr bool IsFinite() const
Definition common.h:540
constexpr Rect Union(const Rect &rect) const
Definition common.h:561
constexpr bool DoesOverlap(const Rect &rect) const
Definition common.h:527
Rect & operator+=(const vec2 shift)
Definition common.h:581