18 #ifndef viskores_exec_CellMeasure_h
19 #define viskores_exec_CellMeasure_h
37 template <
typename OutType,
typename Po
intCoordVecType,
typename CellShapeType>
39 const PointCoordVecType& pts,
51 template <
typename OutType,
typename Po
intCoordVecType>
53 const PointCoordVecType& pts,
57 OutType arcLength(0.0);
64 arcLength =
static_cast<OutType
>(
Magnitude(pts[1] - pts[0]));
65 for (
int ii = 2; ii < numPts; ++ii)
67 arcLength +=
static_cast<OutType
>(
Magnitude(pts[ii] - pts[ii - 1]));
75 template <
typename OutType,
typename Po
intCoordVecType>
77 const PointCoordVecType& pts,
86 typename PointCoordVecType::ComponentType v1 = pts[1] - pts[0];
87 typename PointCoordVecType::ComponentType v2 = pts[2] - pts[0];
88 OutType area = OutType(0.5) *
static_cast<OutType
>(
Magnitude(
Cross(v1, v2)));
93 template <
typename OutType,
typename Po
intCoordVecType>
95 const PointCoordVecType& pts,
105 typename PointCoordVecType::ComponentType edges[4] = {
118 typename PointCoordVecType::ComponentType cornerNormals[4] = {
119 Cross(edges[3], edges[0]),
120 Cross(edges[0], edges[1]),
121 Cross(edges[1], edges[2]),
122 Cross(edges[2], edges[3]),
126 typename PointCoordVecType::ComponentType principalAxes[2] = {
132 typename PointCoordVecType::ComponentType unitCenterNormal =
133 Cross(principalAxes[0], principalAxes[1]);
137 static_cast<OutType
>(
138 (Dot(unitCenterNormal, cornerNormals[0]) + Dot(unitCenterNormal, cornerNormals[1]) +
139 Dot(unitCenterNormal, cornerNormals[2]) + Dot(unitCenterNormal, cornerNormals[3]))) *
144 template <
typename OutType,
typename Po
intCoordVecType>
146 const PointCoordVecType&,
157 template <
typename OutType,
typename Po
intCoordVecType>
159 const PointCoordVecType& pts,
169 typename PointCoordVecType::ComponentType v1 = pts[1] - pts[0];
170 typename PointCoordVecType::ComponentType v2 = pts[2] - pts[0];
171 typename PointCoordVecType::ComponentType v3 = pts[3] - pts[0];
172 OutType volume =
static_cast<OutType
>(Dot(
Cross(v1, v2), v3)) / OutType(6.0);
177 template <
typename OutType,
typename Po
intCoordVecType>
179 const PointCoordVecType& pts,
216 OutType volume =
static_cast<OutType
>(Dot(
Cross(efg2, efg3), efg1)) / OutType(64.0);
221 template <
typename OutType,
typename Po
intCoordVecType>
223 const PointCoordVecType& pts,
233 typename PointCoordVecType::ComponentType v0 = pts[1] - pts[0];
234 typename PointCoordVecType::ComponentType v1 = pts[2] - pts[0];
235 typename PointCoordVecType::ComponentType v2 = pts[3] - pts[0];
236 OutType volume =
static_cast<OutType
>(Dot(
Cross(v0, v1), v2)) / OutType(6.0);
238 typename PointCoordVecType::ComponentType v3 = pts[4] - pts[1];
239 typename PointCoordVecType::ComponentType v4 = pts[5] - pts[1];
240 typename PointCoordVecType::ComponentType v5 = pts[3] - pts[1];
241 volume +=
static_cast<OutType
>(Dot(
Cross(v3, v4), v5)) / OutType(6.0);
243 typename PointCoordVecType::ComponentType v6 = pts[5] - pts[1];
244 typename PointCoordVecType::ComponentType v7 = pts[2] - pts[1];
245 typename PointCoordVecType::ComponentType v8 = pts[3] - pts[1];
246 volume +=
static_cast<OutType
>(Dot(
Cross(v6, v7), v8)) / OutType(6.0);
252 template <
typename OutType,
typename Po
intCoordVecType>
254 const PointCoordVecType& pts,
264 typename PointCoordVecType::ComponentType v1 = pts[1] - pts[0];
265 typename PointCoordVecType::ComponentType v2 = pts[3] - pts[0];
266 typename PointCoordVecType::ComponentType v3 = pts[4] - pts[0];
267 OutType volume =
static_cast<OutType
>(Dot(
Cross(v1, v2), v3)) / OutType(6.0);
269 typename PointCoordVecType::ComponentType v4 = pts[1] - pts[2];
270 typename PointCoordVecType::ComponentType v5 = pts[3] - pts[2];
271 typename PointCoordVecType::ComponentType v6 = pts[4] - pts[2];
272 volume +=
static_cast<OutType
>(Dot(
Cross(v5, v4), v6)) / OutType(6.0);
279 #endif // viskores_exec_CellMeasure_h