37 #include <boost/geometry.hpp> 38 #include <boost/geometry/algorithms/assign.hpp> 39 #include <boost/geometry/geometries/point_xy.hpp> 40 #include <boost/geometry/geometries/polygon.hpp> 42 namespace bg = boost::geometry;
43 typedef bg::model::d2::point_xy<double>
point_xy;
49 namespace NekMeshUtils
57 WARNINGL1(dist < 1e-3,
"large locuv distance");
63 vector<EdgeLoopSharedPtr> &ein)
68 vector<vector<Array<OneD, NekDouble>>> loopt;
69 for (
int i = 0; i < ein.size(); i++)
71 vector<Array<OneD, NekDouble>> loop;
72 for (
int j = 0; j < ein[i]->edges.size(); j++)
75 NekDouble dt = (bnds[1] - bnds[0]) / (np - 1);
78 for (
int k = 0; k < np - 1; k++)
88 for (
int k = np - 1; k > 0; k--)
97 loopt.push_back(loop);
100 vector<bg::model::polygon<point_xy, false, true>> polygons;
102 for (
int i = 0; i < loopt.size(); i++)
104 bg::model::polygon<point_xy, false, true> polygon;
105 vector<point_xy> points;
106 for (
int j = 0; j < loopt[i].size(); j++)
108 points.push_back(
point_xy(loopt[i][j][0], loopt[i][j][1]));
111 points.push_back(
point_xy(loopt[i][0][0], loopt[i][0][1]));
113 bg::assign_points(polygon, points);
120 bg::centroid(polygon, cen);
123 ein[i]->center[0] = cen.x();
124 ein[i]->center[1] = cen.y();
126 polygons.push_back(polygon);
134 for (
int i = 0; i < ein.size() - 1; i++)
136 if (fabs(ein[i]->area) < fabs(ein[i + 1]->area))
139 swap(ein[i], ein[i + 1]);
140 swap(loopt[i], loopt[i + 1]);
141 swap(polygons[i], polygons[i + 1]);
149 for (
int i = 1; i < ein.size(); i++)
151 point_xy p(ein[i]->center[0], ein[i]->center[1]);
153 if (!bg::within(p, polygons[i]))
159 NekDouble mag = sqrt((n1[0] - n2[0]) * (n1[0] - n2[0]) +
160 (n1[1] - n2[1]) * (n1[1] - n2[1]));
162 N[0] = (n2[1] - n1[1]) / mag;
163 N[1] = -1.0 * (n2[0] - n1[0]) / mag;
173 ASSERTL0(boost::geometry::within(p, polygons[i]),
174 "point is not side loop");
std::shared_ptr< CADSurf > CADSurfSharedPtr
#define ASSERTL0(condition, msg)
bg::model::d2::point_xy< double > point_xy
#define WARNINGL1(condition, msg)