10 #ifndef vtk_m_exec_CellMeasure_h
11 #define vtk_m_exec_CellMeasure_h
29 template <
typename OutType,
typename Po
intCoordVecType,
typename CellShapeType>
31 const PointCoordVecType& pts,
43 template <
typename OutType,
typename Po
intCoordVecType>
45 const PointCoordVecType& pts,
46 vtkm::CellShapeTagLine,
49 OutType arcLength(0.0);
56 arcLength =
static_cast<OutType
>(
Magnitude(pts[1] - pts[0]));
57 for (
int ii = 2; ii < numPts; ++ii)
59 arcLength +=
static_cast<OutType
>(
Magnitude(pts[ii] - pts[ii - 1]));
67 template <
typename OutType,
typename Po
intCoordVecType>
69 const PointCoordVecType& pts,
70 vtkm::CellShapeTagTriangle,
78 typename PointCoordVecType::ComponentType v1 = pts[1] - pts[0];
79 typename PointCoordVecType::ComponentType v2 = pts[2] - pts[0];
80 OutType area = OutType(0.5) *
static_cast<OutType
>(
Magnitude(
Cross(v1, v2)));
85 template <
typename OutType,
typename Po
intCoordVecType>
87 const PointCoordVecType& pts,
88 vtkm::CellShapeTagQuad,
97 typename PointCoordVecType::ComponentType edges[4] = {
110 typename PointCoordVecType::ComponentType cornerNormals[4] = {
111 Cross(edges[3], edges[0]),
112 Cross(edges[0], edges[1]),
113 Cross(edges[1], edges[2]),
114 Cross(edges[2], edges[3]),
118 typename PointCoordVecType::ComponentType principalAxes[2] = {
124 typename PointCoordVecType::ComponentType unitCenterNormal =
125 Cross(principalAxes[0], principalAxes[1]);
129 static_cast<OutType
>(
130 (Dot(unitCenterNormal, cornerNormals[0]) + Dot(unitCenterNormal, cornerNormals[1]) +
131 Dot(unitCenterNormal, cornerNormals[2]) + Dot(unitCenterNormal, cornerNormals[3]))) *
136 template <
typename OutType,
typename Po
intCoordVecType>
138 const PointCoordVecType&,
139 vtkm::CellShapeTagPolygon,
149 template <
typename OutType,
typename Po
intCoordVecType>
151 const PointCoordVecType& pts,
152 vtkm::CellShapeTagTetra,
161 typename PointCoordVecType::ComponentType v1 = pts[1] - pts[0];
162 typename PointCoordVecType::ComponentType v2 = pts[2] - pts[0];
163 typename PointCoordVecType::ComponentType v3 = pts[3] - pts[0];
164 OutType volume =
static_cast<OutType
>(Dot(
Cross(v1, v2), v3)) / OutType(6.0);
169 template <
typename OutType,
typename Po
intCoordVecType>
171 const PointCoordVecType& pts,
172 vtkm::CellShapeTagHexahedron,
208 OutType volume =
static_cast<OutType
>(Dot(
Cross(efg2, efg3), efg1)) / OutType(64.0);
213 template <
typename OutType,
typename Po
intCoordVecType>
215 const PointCoordVecType& pts,
216 vtkm::CellShapeTagWedge,
225 typename PointCoordVecType::ComponentType v0 = pts[1] - pts[0];
226 typename PointCoordVecType::ComponentType v1 = pts[2] - pts[0];
227 typename PointCoordVecType::ComponentType v2 = pts[3] - pts[0];
228 OutType volume =
static_cast<OutType
>(Dot(
Cross(v0, v1), v2)) / OutType(6.0);
230 typename PointCoordVecType::ComponentType v3 = pts[4] - pts[1];
231 typename PointCoordVecType::ComponentType v4 = pts[5] - pts[1];
232 typename PointCoordVecType::ComponentType v5 = pts[3] - pts[1];
233 volume +=
static_cast<OutType
>(Dot(
Cross(v3, v4), v5)) / OutType(6.0);
235 typename PointCoordVecType::ComponentType v6 = pts[5] - pts[1];
236 typename PointCoordVecType::ComponentType v7 = pts[2] - pts[1];
237 typename PointCoordVecType::ComponentType v8 = pts[3] - pts[1];
238 volume +=
static_cast<OutType
>(Dot(
Cross(v6, v7), v8)) / OutType(6.0);
244 template <
typename OutType,
typename Po
intCoordVecType>
246 const PointCoordVecType& pts,
247 vtkm::CellShapeTagPyramid,
256 typename PointCoordVecType::ComponentType v1 = pts[1] - pts[0];
257 typename PointCoordVecType::ComponentType v2 = pts[3] - pts[0];
258 typename PointCoordVecType::ComponentType v3 = pts[4] - pts[0];
259 OutType volume =
static_cast<OutType
>(Dot(
Cross(v1, v2), v3)) / OutType(6.0);
261 typename PointCoordVecType::ComponentType v4 = pts[1] - pts[2];
262 typename PointCoordVecType::ComponentType v5 = pts[3] - pts[2];
263 typename PointCoordVecType::ComponentType v6 = pts[4] - pts[2];
264 volume +=
static_cast<OutType
>(Dot(
Cross(v5, v4), v6)) / OutType(6.0);
271 #endif // vtk_m_exec_CellMeasure_h