Manifold 3.0
Robust geometry
Loading...
Searching...
No Matches
cross_section.h
1// Copyright 2023 The Manifold Authors.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#pragma once
16
17#include <functional>
18#include <memory>
19#include <mutex>
20#include <vector>
21
22#include "manifold/common.h"
23#include "manifold/vec_view.h"
24
25namespace manifold {
26
32
33struct PathImpl;
34
42 public:
49
50 CrossSection(const CrossSection& other);
51 CrossSection& operator=(const CrossSection& other);
52 CrossSection(CrossSection&&) noexcept;
53 CrossSection& operator=(CrossSection&&) noexcept;
55
62
66 CrossSection(const SimplePolygon& contour);
67 CrossSection(const Polygons& contours);
68 CrossSection(const Rect& rect);
69 static CrossSection EvenOdd(const SimplePolygon& contour);
70 static CrossSection EvenOdd(const Polygons& contours);
71 Polygons ToPolygons() const;
73
78 std::vector<CrossSection> Decompose() const;
79 static CrossSection Square(const vec2 dims, bool center = false);
80 static CrossSection Circle(double radius, int circularSegments = 0);
82
87 bool IsEmpty() const;
88 size_t NumVert() const;
89 size_t NumContour() const;
90 Rect Bounds() const;
91 double Area() const;
92 double GetTolerance() const;
93 CrossSection SetTolerance(double tolerance) const;
95
99 CrossSection Translate(const vec2 v) const;
100 CrossSection Rotate(double degrees) const;
101 CrossSection Scale(const vec2 s) const;
102 CrossSection Mirror(const vec2 ax) const;
103 CrossSection Transform(const mat2x3& m) const;
104 CrossSection Warp(std::function<void(vec2&)> warpFunc) const;
105 CrossSection WarpBatch(std::function<void(VecView<vec2>)> warpFunc) const;
106 CrossSection Simplify(double tolerance = 0) const;
107 CrossSection Offset(double delta, JoinType jt = JoinType::Round,
108 double miter_limit = 2.0, int circularSegments = 0) const;
110
115 CrossSection Boolean(const CrossSection& second, OpType op) const;
117 const std::vector<CrossSection>& crossSections, OpType op);
118 CrossSection operator+(const CrossSection&) const;
120 CrossSection operator-(const CrossSection&) const;
122 CrossSection operator^(const CrossSection&) const;
125
129 CrossSection Hull() const;
130 static CrossSection Hull(const std::vector<CrossSection>& crossSections);
131 static CrossSection Hull(const SimplePolygon& pts);
132 static CrossSection Hull(const Polygons& polys);
134
135 private:
136 mutable std::mutex pathsMutex_;
137 mutable std::shared_ptr<const PathImpl> paths_;
138 mutable mat2x3 transform_ = la::identity;
139 // Propagated drift budget, analogous to Manifold::Impl::tolerance_.
140 mutable double tolerance_ = 0.0;
141 CrossSection(std::shared_ptr<const PathImpl> paths);
142 std::shared_ptr<const PathImpl> GetPaths() const;
143};
144
145} // namespace manifold
CrossSection Boolean(const CrossSection &second, OpType op) const
Definition cross_section.cpp:382
CrossSection & operator+=(const CrossSection &)
Definition cross_section.cpp:447
Polygons ToPolygons() const
Definition cross_section.cpp:817
CrossSection WarpBatch(std::function< void(VecView< vec2 >)> warpFunc) const
Definition cross_section.cpp:595
CrossSection operator+(const CrossSection &) const
Definition cross_section.cpp:439
CrossSection operator^(const CrossSection &) const
Definition cross_section.cpp:472
CrossSection Translate(const vec2 v) const
Definition cross_section.cpp:510
CrossSection Mirror(const vec2 ax) const
Definition cross_section.cpp:547
::manifold::JoinType JoinType
Definition cross_section.h:61
CrossSection & operator-=(const CrossSection &)
Definition cross_section.cpp:464
static CrossSection Square(const vec2 dims, bool center=false)
Definition cross_section.cpp:349
std::vector< CrossSection > Decompose() const
Definition cross_section.cpp:490
CrossSection Transform(const mat2x3 &m) const
Definition cross_section.cpp:561
CrossSection Offset(double delta, JoinType jt=JoinType::Round, double miter_limit=2.0, int circularSegments=0) const
Definition cross_section.cpp:693
CrossSection Rotate(double degrees) const
Definition cross_section.cpp:521
static CrossSection BatchBoolean(const std::vector< CrossSection > &crossSections, OpType op)
Definition cross_section.cpp:399
size_t NumContour() const
Definition cross_section.cpp:795
static CrossSection EvenOdd(const SimplePolygon &contour)
Definition cross_section.cpp:276
bool IsEmpty() const
Definition cross_section.cpp:800
CrossSection SetTolerance(double tolerance) const
Definition cross_section.cpp:666
CrossSection & operator^=(const CrossSection &)
Definition cross_section.cpp:480
CrossSection Hull() const
Definition cross_section.cpp:741
CrossSection Simplify(double tolerance=0) const
Definition cross_section.cpp:634
CrossSection Warp(std::function< void(vec2 &)> warpFunc) const
Definition cross_section.cpp:582
double Area() const
Definition cross_section.cpp:778
size_t NumVert() const
Definition cross_section.cpp:785
CrossSection()
Definition cross_section.cpp:197
double GetTolerance() const
Definition cross_section.cpp:659
CrossSection Scale(const vec2 s) const
Definition cross_section.cpp:534
Rect Bounds() const
Definition cross_section.cpp:806
CrossSection operator-(const CrossSection &) const
Definition cross_section.cpp:456
static CrossSection Circle(double radius, int circularSegments=0)
Definition cross_section.cpp:365
Definition vec_view.h:32
constexpr double degrees(double a)
Definition common.h:90
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
@ Round
Definition common.h:641
Definition cross_section.cpp:32
Axis-aligned 2D box, primarily for bounding.
Definition common.h:460