Manifold 1.0
Robust computational 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 <vector>
20
21#include "manifold/common.h"
22#include "manifold/vec_view.h"
23
24namespace manifold {
25
30struct PathImpl;
31
39 public:
44
47
48 CrossSection(const CrossSection& other);
49 CrossSection& operator=(const CrossSection& other);
50 CrossSection(CrossSection&&) noexcept;
51 CrossSection& operator=(CrossSection&&) noexcept;
52
53 // Adapted from Clipper2 docs:
54 // http://www.angusj.com/clipper2/Docs/Units/Clipper/Types/FillRule.htm
55 // (Copyright © 2010-2023 Angus Johnson)
63 enum class FillRule {
64 EvenOdd,
65 NonZero,
66 Positive,
68 };
69
70 CrossSection(const SimplePolygon& contour,
71 FillRule fillrule = FillRule::Positive);
72 CrossSection(const Polygons& contours,
73 FillRule fillrule = FillRule::Positive);
74 CrossSection(const Rect& rect);
75 static CrossSection Square(const vec2 dims, bool center = false);
76 static CrossSection Circle(double radius, int circularSegments = 0);
78
83 double Area() const;
84 int NumVert() const;
85 int NumContour() const;
86 bool IsEmpty() const;
87 Rect Bounds() const;
89
93 CrossSection Translate(const vec2 v) const;
94 CrossSection Rotate(double degrees) const;
95 CrossSection Scale(const vec2 s) const;
96 CrossSection Mirror(const vec2 ax) const;
97 CrossSection Transform(const mat2x3& m) const;
98 CrossSection Warp(std::function<void(vec2&)> warpFunc) const;
99 CrossSection WarpBatch(std::function<void(VecView<vec2>)> warpFunc) const;
100 CrossSection Simplify(double epsilon = 1e-6) const;
101
102 // Adapted from Clipper2 docs:
103 // http://www.angusj.com/clipper2/Docs/Units/Clipper/Types/JoinType.htm
104 // (Copyright © 2010-2023 Angus Johnson)
111 enum class JoinType {
112 Square,
115 Round,
118 Miter
123 };
124
125 CrossSection Offset(double delta, JoinType jt, double miter_limit = 2.0,
126 int circularSegments = 0) const;
128
133 CrossSection Boolean(const CrossSection& second, OpType op) const;
135 const std::vector<CrossSection>& crossSections, OpType op);
136 CrossSection operator+(const CrossSection&) const;
138 CrossSection operator-(const CrossSection&) const;
140 CrossSection operator^(const CrossSection&) const;
143
147 static CrossSection Compose(std::vector<CrossSection>&);
148 std::vector<CrossSection> Decompose() const;
150
154 CrossSection Hull() const;
155 static CrossSection Hull(const std::vector<CrossSection>& crossSections);
156 static CrossSection Hull(const SimplePolygon poly);
157 static CrossSection Hull(const Polygons polys);
160
163 Polygons ToPolygons() const;
165
166 private:
167 mutable std::shared_ptr<const PathImpl> paths_;
168 mutable mat2x3 transform_ = Identity2x3();
169 CrossSection(std::shared_ptr<const PathImpl> paths);
170 std::shared_ptr<const PathImpl> GetPaths() const;
171};
173} // namespace manifold
Definition cross_section.h:38
CrossSection Boolean(const CrossSection &second, OpType op) const
Definition cross_section.cpp:359
CrossSection & operator+=(const CrossSection &)
Definition cross_section.cpp:407
Polygons ToPolygons() const
Definition cross_section.cpp:775
CrossSection WarpBatch(std::function< void(VecView< vec2 >)> warpFunc) const
Definition cross_section.cpp:574
CrossSection operator+(const CrossSection &) const
Definition cross_section.cpp:399
CrossSection operator^(const CrossSection &) const
Definition cross_section.cpp:432
CrossSection Translate(const vec2 v) const
Definition cross_section.cpp:485
CrossSection Mirror(const vec2 ax) const
Definition cross_section.cpp:528
CrossSection & operator-=(const CrossSection &)
Definition cross_section.cpp:424
std::vector< CrossSection > Decompose() const
Definition cross_section.cpp:458
CrossSection Transform(const mat2x3 &m) const
Definition cross_section.cpp:544
static CrossSection Compose(std::vector< CrossSection > &)
Definition cross_section.cpp:449
CrossSection Rotate(double degrees) const
Definition cross_section.cpp:498
static CrossSection BatchBoolean(const std::vector< CrossSection > &crossSections, OpType op)
Definition cross_section.cpp:371
int NumVert() const
Definition cross_section.cpp:743
bool IsEmpty() const
Definition cross_section.cpp:761
CrossSection Offset(double delta, JoinType jt, double miter_limit=2.0, int circularSegments=0) const
Definition cross_section.cpp:656
FillRule
Definition cross_section.h:63
@ Positive
Only sub-regions with winding counts > 0 are filled.
@ NonZero
Only non-zero sub-regions are filled.
@ EvenOdd
Only odd numbered sub-regions are filled.
@ Negative
Only sub-regions with winding counts < 0 are filled.
CrossSection & operator^=(const CrossSection &)
Definition cross_section.cpp:440
CrossSection Simplify(double epsilon=1e-6) const
Definition cross_section.cpp:610
CrossSection Hull() const
Definition cross_section.cpp:702
CrossSection Warp(std::function< void(vec2 &)> warpFunc) const
Definition cross_section.cpp:559
double Area() const
Definition cross_section.cpp:738
CrossSection()
Definition cross_section.cpp:212
CrossSection Scale(const vec2 s) const
Definition cross_section.cpp:513
Rect Bounds() const
Definition cross_section.cpp:767
JoinType
Definition cross_section.h:111
CrossSection operator-(const CrossSection &) const
Definition cross_section.cpp:416
int NumContour() const
Definition cross_section.cpp:756
static CrossSection Circle(double radius, int circularSegments=0)
Definition cross_section.cpp:342
Definition vec_view.h:32
OpType
Definition common.h:447
Definition common.h:22
std::vector< SimplePolygon > Polygons
Definition common.h:105
std::vector< vec2 > SimplePolygon
Definition common.h:97
Definition common.h:277