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
43 public:
50
51 CrossSection(const CrossSection& other);
52 CrossSection& operator=(const CrossSection& other);
53 CrossSection(CrossSection&&) noexcept;
54 CrossSection& operator=(CrossSection&&) noexcept;
56
57 // Adapted from Clipper2 docs:
58 // http://www.angusj.com/clipper2/Docs/Units/Clipper/Types/FillRule.htm
59 // (Copyright © 2010-2023 Angus Johnson)
73
74 // Adapted from Clipper2 docs:
75 // http://www.angusj.com/clipper2/Docs/Units/Clipper/Types/JoinType.htm
76 // (Copyright © 2010-2023 Angus Johnson)
106
110 CrossSection(const SimplePolygon& contour,
111 FillRule fillrule = FillRule::Positive);
112 CrossSection(const Polygons& contours,
113 FillRule fillrule = FillRule::Positive);
114 CrossSection(const Rect& rect);
115 Polygons ToPolygons() const;
117
122 std::vector<CrossSection> Decompose() const;
123 static CrossSection Compose(const std::vector<CrossSection>&);
124 static CrossSection Square(const vec2 dims, bool center = false);
125 static CrossSection Circle(double radius, int circularSegments = 0);
127
132 bool IsEmpty() const;
133 size_t NumVert() const;
134 size_t NumContour() const;
135 Rect Bounds() const;
136 double Area() const;
138
142 CrossSection Translate(const vec2 v) const;
143 CrossSection Rotate(double degrees) const;
144 CrossSection Scale(const vec2 s) const;
145 CrossSection Mirror(const vec2 ax) const;
146 CrossSection Transform(const mat2x3& m) const;
147 CrossSection Warp(std::function<void(vec2&)> warpFunc) const;
148 CrossSection WarpBatch(std::function<void(VecView<vec2>)> warpFunc) const;
149 CrossSection Simplify(double epsilon = 1e-6) const;
150 CrossSection Offset(double delta, JoinType jt = JoinType::Round,
151 double miter_limit = 2.0, int circularSegments = 0) const;
153
158 CrossSection Boolean(const CrossSection& second, OpType op) const;
160 const std::vector<CrossSection>& crossSections, OpType op);
161 CrossSection operator+(const CrossSection&) const;
163 CrossSection operator-(const CrossSection&) const;
165 CrossSection operator^(const CrossSection&) const;
168
172 CrossSection Hull() const;
173 static CrossSection Hull(const std::vector<CrossSection>& crossSections);
174 static CrossSection Hull(const SimplePolygon pts);
175 static CrossSection Hull(const Polygons polys);
177
178 private:
179 mutable std::shared_ptr<std::mutex> pathsMutex_ =
180 std::make_shared<std::mutex>();
181 mutable std::shared_ptr<const PathImpl> paths_;
182 mutable mat2x3 transform_ = la::identity;
183 CrossSection(std::shared_ptr<const PathImpl> paths);
184 std::shared_ptr<const PathImpl> GetPaths() const;
185};
186
187} // namespace manifold
Two-dimensional cross sections guaranteed to be without self-intersections, or overlaps between polyg...
Definition cross_section.h:42
CrossSection Boolean(const CrossSection &second, OpType op) const
Definition cross_section.cpp:365
CrossSection & operator+=(const CrossSection &)
Definition cross_section.cpp:423
Polygons ToPolygons() const
Definition cross_section.cpp:792
CrossSection WarpBatch(std::function< void(VecView< vec2 >)> warpFunc) const
Definition cross_section.cpp:592
CrossSection operator+(const CrossSection &) const
Definition cross_section.cpp:415
CrossSection operator^(const CrossSection &) const
Definition cross_section.cpp:448
CrossSection Translate(const vec2 v) const
Definition cross_section.cpp:502
CrossSection Mirror(const vec2 ax) const
Definition cross_section.cpp:545
CrossSection & operator-=(const CrossSection &)
Definition cross_section.cpp:440
static CrossSection Square(const vec2 dims, bool center=false)
Definition cross_section.cpp:317
std::vector< CrossSection > Decompose() const
Definition cross_section.cpp:475
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:674
CrossSection Rotate(double degrees) const
Definition cross_section.cpp:515
static CrossSection BatchBoolean(const std::vector< CrossSection > &crossSections, OpType op)
Definition cross_section.cpp:377
size_t NumContour() const
Definition cross_section.cpp:773
bool IsEmpty() const
Definition cross_section.cpp:778
FillRule
Definition cross_section.h:67
@ Positive
Only sub-regions with winding counts > 0 are filled.
Definition cross_section.h:70
@ NonZero
Only non-zero sub-regions are filled.
Definition cross_section.h:69
@ EvenOdd
Only odd numbered sub-regions are filled.
Definition cross_section.h:68
@ Negative
Only sub-regions with winding counts < 0 are filled.
Definition cross_section.h:71
CrossSection & operator^=(const CrossSection &)
Definition cross_section.cpp:456
CrossSection Simplify(double epsilon=1e-6) const
Definition cross_section.cpp:628
CrossSection Hull() const
Definition cross_section.cpp:719
CrossSection Warp(std::function< void(vec2 &)> warpFunc) const
Definition cross_section.cpp:577
double Area() const
Definition cross_section.cpp:755
size_t NumVert() const
Definition cross_section.cpp:760
CrossSection()
Definition cross_section.cpp:215
CrossSection Scale(const vec2 s) const
Definition cross_section.cpp:530
static CrossSection Compose(const std::vector< CrossSection > &)
Definition cross_section.cpp:465
Rect Bounds() const
Definition cross_section.cpp:784
JoinType
Definition cross_section.h:83
@ Bevel
Definition cross_section.h:95
@ Round
Definition cross_section.h:87
@ Miter
Definition cross_section.h:90
CrossSection operator-(const CrossSection &) const
Definition cross_section.cpp:432
static CrossSection Circle(double radius, int circularSegments=0)
Definition cross_section.cpp:348
Definition vec_view.h:32
constexpr double degrees(double a)
Definition common.h:79
OpType
Boolean operation type: Add (Union), Subtract (Difference), and Intersect.
Definition common.h:569
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:144
std::vector< vec2 > SimplePolygon
Single polygon contour, wound CCW. First and last point are implicitly connected. Should ensure all i...
Definition common.h:136
Definition cross_section.cpp:27
Axis-aligned 2D box, primarily for bounding.
Definition common.h:403