20#include "manifold/linalg.h"
47constexpr double kPi = 3.14159265358979323846264338327950288;
48constexpr double kTwoPi = 6.28318530717958647692528676655900576;
49constexpr double kHalfPi = 1.57079632679489661923132169163975144;
51constexpr double radians(
double a) {
return a * kPi / 180; }
52constexpr double degrees(
double a) {
return a * 180 / kPi; }
54constexpr double smoothstep(
double edge0,
double edge1,
double a) {
55 const double x = la::clamp((a - edge0) / (edge1 - edge0), 0, 1);
56 return x * x * (3 - 2 * x);
67inline double sind(
double x) {
68 if (!la::isfinite(x))
return sin(x);
69 if (x < 0.0)
return -
sind(-x);
71 x = remquo(fabs(x), 90.0, &quo);
74 return sin(radians(x));
76 return cos(radians(x));
78 return -sin(radians(x));
80 return -cos(radians(x));
90inline double cosd(
double x) {
return sind(x + 90.0); }
124 double surfaceArea, volume;
128 vec3 min =
vec3(std::numeric_limits<double>::infinity());
129 vec3 max =
vec3(-std::numeric_limits<double>::infinity());
140 min = la::min(p1, p2);
141 max = la::max(p1, p2);
159 vec3 absMax = la::max(la::abs(min), la::abs(max));
160 return la::max(absMax.x, la::max(absMax.y, absMax.z));
167 return la::all(la::gequal(p, min)) && la::all(la::gequal(max, p));
174 return la::all(la::gequal(box.min, min)) &&
175 la::all(la::gequal(max, box.max));
182 min = la::min(min, p);
183 max = la::max(max, p);
191 out.min = la::min(min, box.min);
192 out.max = la::max(max, box.max);
205 vec3 minT = transform *
vec4(min, 1.0);
206 vec3 maxT = transform *
vec4(max, 1.0);
207 out.min = la::min(minT, maxT);
208 out.max = la::max(minT, maxT);
217 out.min = min + shift;
218 out.max = max + shift;
236 out.min = min * scale;
237 out.max = max * scale;
254 return min.x <= box.max.x && min.y <= box.max.y && min.z <= box.max.z &&
255 max.x >= box.min.x && max.y >= box.min.y && max.z >= box.min.z;
263 return p.x <= max.x && p.x >= min.x && p.y <= max.y && p.y >= min.y;
270 return la::all(la::isfinite(min)) && la::all(la::isfinite(max));
278 vec2 min =
vec2(std::numeric_limits<double>::infinity());
279 vec2 max =
vec2(-std::numeric_limits<double>::infinity());
307 constexpr double Area()
const {
317 vec2 absMax = la::max(la::abs(min), la::abs(max));
318 return la::max(absMax.x, absMax.y);
330 return la::all(la::gequal(p, min)) && la::all(la::gequal(max, p));
337 return la::all(la::gequal(rect.min, min)) &&
338 la::all(la::gequal(max, rect.max));
345 return min.x <= rect.max.x && min.y <= rect.max.y && max.x >= rect.min.x &&
352 constexpr bool IsEmpty()
const {
return max.y <= min.y || max.x <= min.x; };
358 return la::all(la::isfinite(min)) && la::all(la::isfinite(max));
371 min = la::min(min, p);
372 max = la::max(max, p);
380 out.min = la::min(min, rect.min);
381 out.max = la::max(max, rect.max);
390 out.min = min + shift;
391 out.max = max + shift;
409 out.min = min * scale;
410 out.max = max * scale;
432 rect.min = m *
vec3(min, 1);
433 rect.max = m *
vec3(max, 1);
447enum class OpType { Add, Subtract, Intersect };
449constexpr int DEFAULT_SEGMENTS = 0;
450constexpr double DEFAULT_ANGLE = 10.0;
451constexpr double DEFAULT_LENGTH = 1.0;
462 inline static int circularSegments_ = DEFAULT_SEGMENTS;
463 inline static double circularAngle_ = DEFAULT_ANGLE;
464 inline static double circularEdgeLength_ = DEFAULT_LENGTH;
478 if (angle <= 0)
return;
479 circularAngle_ = angle;
492 if (length <= 0)
return;
493 circularEdgeLength_ = length;
506 if (number < 3 && number != 0)
return;
507 circularSegments_ = number;
518 if (circularSegments_ > 0)
return circularSegments_;
519 int nSegA = 360.0 / circularAngle_;
520 int nSegL = 2.0 * radius * kPi / circularEdgeLength_;
521 int nSeg = fmin(nSegA, nSegL) + 3;
523 return std::max(nSeg, 3);
532 circularSegments_ = DEFAULT_SEGMENTS;
533 circularAngle_ = DEFAULT_ANGLE;
534 circularEdgeLength_ = DEFAULT_LENGTH;
545struct userErr :
public virtual std::runtime_error {
546 using std::runtime_error::runtime_error;
549 using std::runtime_error::runtime_error;
552 using std::runtime_error::runtime_error;
554using logicErr = std::logic_error;
static void ResetToDefaults()
Definition common.h:531
static void SetCircularSegments(int number)
Definition common.h:505
static void SetMinCircularAngle(double angle)
Definition common.h:477
static int GetCircularSegments(double radius)
Definition common.h:517
static void SetMinCircularEdgeLength(double length)
Definition common.h:491
OpType
Definition common.h:447
bool deterministic
Deterministic outputs. Will disable some parallel optimizations.
Definition common.h:575
bool suppressErrors
Definition common.h:573
std::vector< SimplePolygon > Polygons
Definition common.h:105
bool processOverlaps
Definition common.h:570
bool cleanupTriangles
Perform optional but recommended triangle cleanups in SimplifyTopology()
Definition common.h:577
size_t halfedge
The halfedge index = 3 * tri + i, referring to Mesh.triVerts[tri][i].
Definition common.h:113
bool verbose
Definition common.h:567
double cosd(double x)
Definition common.h:90
std::vector< vec2 > SimplePolygon
Definition common.h:97
double sind(double x)
Definition common.h:67
bool intermediateChecks
Definition common.h:564
double smoothness
Definition common.h:117
constexpr Box Transform(const mat3x4 &transform) const
Definition common.h:203
constexpr Box operator+(vec3 shift) const
Definition common.h:215
constexpr bool Contains(const Box &box) const
Definition common.h:173
constexpr vec3 Center() const
Definition common.h:152
constexpr bool DoesOverlap(const Box &box) const
Definition common.h:253
constexpr double Scale() const
Definition common.h:158
constexpr Box Union(const Box &box) const
Definition common.h:189
constexpr bool DoesOverlap(vec3 p) const
Definition common.h:262
void Union(const vec3 p)
Definition common.h:181
Box & operator*=(vec3 scale)
Definition common.h:244
constexpr bool IsFinite() const
Definition common.h:269
constexpr vec3 Size() const
Definition common.h:147
constexpr Box operator*(vec3 scale) const
Definition common.h:234
Box & operator+=(vec3 shift)
Definition common.h:225
constexpr Box(const vec3 p1, const vec3 p2)
Definition common.h:139
constexpr Box()
Definition common.h:134
constexpr bool Contains(const vec3 &p) const
Definition common.h:166
Rect & operator*=(const vec2 scale)
Definition common.h:417
constexpr bool Contains(const Rect &rect) const
Definition common.h:336
constexpr bool Contains(const vec2 &p) const
Definition common.h:329
constexpr bool IsEmpty() const
Definition common.h:352
constexpr Rect(const vec2 a, const vec2 b)
Definition common.h:289
constexpr vec2 Size() const
Definition common.h:302
constexpr double Area() const
Definition common.h:307
constexpr double Scale() const
Definition common.h:316
constexpr vec2 Center() const
Definition common.h:324
constexpr Rect operator*(const vec2 scale) const
Definition common.h:407
constexpr Rect operator+(const vec2 shift) const
Definition common.h:388
constexpr Rect Transform(const mat2x3 &m) const
Definition common.h:430
void Union(const vec2 p)
Definition common.h:370
constexpr Rect()
Definition common.h:284
constexpr bool IsFinite() const
Definition common.h:357
constexpr Rect Union(const Rect &rect) const
Definition common.h:378
constexpr bool DoesOverlap(const Rect &rect) const
Definition common.h:344
Rect & operator+=(const vec2 shift)
Definition common.h:398