16#ifndef Polygon_geom_tools_included
17#define Polygon_geom_tools_included
28template <
typename CoordTab,
typename IndexFunctor>
32 const IndexFunctor& index_of,
33 bool compute_moment =
false)
39 if (geom_dimension == 2)
41 double sum_cross = 0.;
42 double sum_r_cross = 0.;
43 for (
int i = 0; i < nb_vertices; ++i)
45 const int next = (i + 1 == nb_vertices) ? 0 : (i + 1);
46 const auto si = index_of(i);
47 const auto sj = index_of(next);
49 const double ri = coord(si, 0);
50 const double zi = coord(si, 1);
51 const double rj = coord(sj, 0);
52 const double zj = coord(sj, 1);
54 const double cross = ri * zj - rj * zi;
57 sum_r_cross += (ri + rj) * cross;
60 data.
area_ = 0.5 * std::fabs(sum_cross);
66 assert(geom_dimension == 3);
67 const auto s0 = index_of(0);
68 const double x0 = coord(s0, 0);
69 const double y0 = coord(s0, 1);
70 const double z0 = coord(s0, 2);
75 for (
int i = 1; i < nb_vertices - 1; ++i)
77 const auto s1 = index_of(i);
78 const auto s2 = index_of(i + 1);
80 const double ax = coord(s1, 0) - x0;
81 const double ay = coord(s1, 1) - y0;
82 const double az = coord(s1, 2) - z0;
84 const double bx = coord(s2, 0) - x0;
85 const double by = coord(s2, 1) - y0;
86 const double bz = coord(s2, 2) - z0;
88 nx += ay * bz - az * by;
89 ny += az * bx - ax * bz;
90 nz += ax * by - ay * bx;
93 const double norm = std::sqrt(nx * nx + ny * ny + nz * nz);
94 data.
area_ = 0.5 * norm;