62 vector<Triangle> tri_vec;
63 vector<Triangle> temp_tri_vec;
67 MSGUser()->MSG_ERROR(
"Need at least 3 points for triangulation!");
71 vector<int> index_vec;
73 for (
int i = 0; i < p_vec.size(); i++)
74 index_vec.push_back(i);
76 for (
int i = 0; i < index_vec.size() - 1; i++)
78 for (
int j = i + 1; j < index_vec.size(); j++)
80 if (p_vec[index_vec[i]].X() > p_vec[index_vec[j]].X())
82 int temp = index_vec[i];
83 index_vec[i] = index_vec[j];
89 double XMax = p_vec[0].X();
90 double XMin = p_vec[0].X();
91 double YMax = p_vec[0].Y();
92 double YMin = p_vec[0].Y();
94 for (
int i = 1; i < p_vec.size(); i++)
96 if (p_vec[i].X() > XMax)
98 if (p_vec[i].X() < XMin)
100 if (p_vec[i].Y() > YMax)
102 if (p_vec[i].Y() < YMin)
106 double DX = XMax - XMin;
107 double DY = YMax - YMin;
110 Point((XMax + XMin) / 2 + 2.5 * DX, YMin - 2 * DY),
111 Point((XMax + XMin) / 2 - 2.5 * DX, YMin - 2 * DY));
114 for (
int i = 0; i < p_vec.size(); i++)
116 if (!p_vec[i].IsInside(super))
117 MSGUser()->MSG_ERROR(
"Point ", i,
" is outside the super triangle!");
120 temp_tri_vec.push_back(super);
122 for (
int i = 0; i < index_vec.size(); i++)
124 vector<Edge> edg_vec;
125 Point P = p_vec[index_vec[i]];
126 for (
int j = 0; j < temp_tri_vec.size(); j++)
128 Circle outcir = temp_tri_vec[j].CircumscribedCircle();
132 tri_vec.push_back(temp_tri_vec[j]);
133 temp_tri_vec.erase(temp_tri_vec.begin() + j);
139 edg_vec.push_back(
Edge(temp_tri_vec[j].Vertex(0), temp_tri_vec[j].Vertex(1)));
140 edg_vec.push_back(
Edge(temp_tri_vec[j].Vertex(1), temp_tri_vec[j].Vertex(2)));
141 edg_vec.push_back(
Edge(temp_tri_vec[j].Vertex(0), temp_tri_vec[j].Vertex(2)));
143 temp_tri_vec.erase(temp_tri_vec.begin() + j);
153 if (edg_vec.size() > 1)
155 for (
int j = 0; j < edg_vec.size() - 1; j++)
157 for (
int k = j + 1; k < edg_vec.size(); k++)
159 if ((edg_vec[j].Start().Distance(edg_vec[k].Start()) <
PRECISION) &&
160 (edg_vec[j].End().Distance(edg_vec[k].End()) <
PRECISION))
162 edg_vec.erase(edg_vec.begin() + k);
166 if ((edg_vec[j].Start().Distance(edg_vec[k].End()) <
PRECISION) &&
167 (edg_vec[j].End().Distance(edg_vec[k].Start()) <
PRECISION))
169 edg_vec.erase(edg_vec.begin() + k);
177 if (edg_vec.size() > 0)
179 for (
int j = 0; j < edg_vec.size(); j++)
180 temp_tri_vec.push_back(
Triangle(edg_vec[j], P));
184 tri_vec.insert(tri_vec.end(), temp_tri_vec.begin(), temp_tri_vec.end());
186 for (
int i = 0; i < tri_vec.size(); i++)
188 bool toremove =
false;
189 for (
int j = 0; j < 3; j++)
191 for (
int k = 0; k < 3; k++)
197 for (
int j = 0; j < p_vec.size(); j++)
199 bool isOnEdge =
false;
200 for (
int k = 0; k < 3; k++)
202 if (p_vec[j].Distance(tri_vec[i].Vertex(k)) <
PRECISION)
207 if (p_vec[j].IsInside(tri_vec[i].CircumscribedCircle()))
212 tri_vec.erase(tri_vec.begin() + i);