Horizon
Loading...
Searching...
No Matches
sweep_context.h
1/*
2 * Poly2Tri Copyright (c) 2009-2018, Poly2Tri Contributors
3 * https://github.com/jhasse/poly2tri
4 *
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without modification,
8 * are permitted provided that the following conditions are met:
9 *
10 * * Redistributions of source code must retain the above copyright notice,
11 * this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above copyright notice,
13 * this list of conditions and the following disclaimer in the documentation
14 * and/or other materials provided with the distribution.
15 * * Neither the name of Poly2Tri nor the names of its contributors may be
16 * used to endorse or promote products derived from this software without specific
17 * prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#ifndef SWEEP_CONTEXT_H
33#define SWEEP_CONTEXT_H
34
35#include <list>
36#include <vector>
37#include <cstddef>
38
39namespace p2t {
40
41// Inital triangle factor, seed triangle will extend 30% of
42// PointSet width to both left and right.
43const double kAlpha = 0.3;
44
45struct Point;
46class Triangle;
47struct Node;
48struct Edge;
49class AdvancingFront;
50
52public:
53
55SweepContext(const std::vector<Point*>& polyline);
58
59void set_head(Point* p1);
60
61Point* head() const;
62
63void set_tail(Point* p1);
64
65Point* tail() const;
66
67size_t point_count() const;
68
69Node& LocateNode(const Point& point);
70
71void RemoveNode(Node* node);
72
73void CreateAdvancingFront();
74
77
78void AddToMap(Triangle* triangle);
79
80Point* GetPoint(size_t index);
81
82Point* GetPoints();
83
84void RemoveFromMap(Triangle* triangle);
85
86void AddHole(const std::vector<Point*>& polyline);
87
88void AddPoint(Point* point);
89
90AdvancingFront* front() const;
91
92void MeshClean(Triangle& triangle);
93
94std::vector<Triangle*> &GetTriangles();
95std::list<Triangle*> &GetMap();
96
97std::vector<Edge*> edge_list;
98
99struct Basin {
100 Node* left_node;
101 Node* bottom_node;
102 Node* right_node;
103 double width;
104 bool left_highest;
105
106 Basin() : left_node(NULL), bottom_node(NULL), right_node(NULL), width(0.0), left_highest(false)
107 {
108 }
109
110 void Clear()
111 {
112 left_node = NULL;
113 bottom_node = NULL;
114 right_node = NULL;
115 width = 0.0;
116 left_highest = false;
117 }
118};
119
120struct EdgeEvent {
121 Edge* constrained_edge;
122 bool right;
123
124 EdgeEvent() : constrained_edge(NULL), right(false)
125 {
126 }
127};
128
129Basin basin;
130EdgeEvent edge_event;
131
132private:
133
134friend class Sweep;
135
136std::vector<Triangle*> triangles_;
137std::list<Triangle*> map_;
138std::vector<Point*> points_;
139
140// Advancing front
141AdvancingFront* front_;
142// head point used with advancing front
143Point* head_;
144// tail point used with advancing front
145Point* tail_;
146
147Node *af_head_, *af_middle_, *af_tail_;
148
149void InitTriangulation();
150void InitEdges(const std::vector<Point*>& polyline);
151
152};
153
154inline AdvancingFront* SweepContext::front() const
155{
156 return front_;
157}
158
159inline size_t SweepContext::point_count() const
160{
161 return points_.size();
162}
163
164inline void SweepContext::set_head(Point* p1)
165{
166 head_ = p1;
167}
168
169inline Point* SweepContext::head() const
170{
171 return head_;
172}
173
174inline void SweepContext::set_tail(Point* p1)
175{
176 tail_ = p1;
177}
178
179inline Point* SweepContext::tail() const
180{
181 return tail_;
182}
183
184}
185
186#endif
Definition advancing_front.h:62
Definition sweep_context.h:51
~SweepContext()
Destructor.
Definition sweep_context.cpp:185
void MapTriangleToNodes(Triangle &t)
Try to map a node to all sides of this triangle that don't have a neighbor.
Definition sweep_context.cpp:149
Definition sweep.h:53
Definition shapes.h:152
Sweep-line, Constrained Delauney Triangulation (CDT) See: Domiter, V.
Definition shapes.cpp:36
Definition shapes.h:125
Definition advancing_front.h:42
Definition shapes.h:45
Definition sweep_context.h:99
Definition sweep_context.h:120