18 #ifndef viskores_exec_ParametricCoordinates_h
19 #define viskores_exec_ParametricCoordinates_h
37 template <
typename ParametricCoordType,
typename CellShapeTag>
43 auto lclTag =
typename viskores::internal::CellShapeTagViskoresToVtkc<CellShapeTag>::Type{};
46 if (numPoints != lclTag.numberOfPoints())
51 return viskores::internal::LclErrorToViskoresError(lcl::parametricCenter(lclTag, pcoords));
54 template <
typename ParametricCoordType>
68 template <
typename ParametricCoordType>
82 template <
typename ParametricCoordType>
101 template <
typename ParametricCoordType>
120 return viskores::internal::LclErrorToViskoresError(
121 lcl::parametricCenter(lcl::Polygon(numPoints), pcoords));
133 template <
typename ParametricCoordType>
143 status = ParametricCoordinatesCenter(numPoints, CellShapeTag(), pcoords));
152 template <
typename ParametricCoordType,
typename CellShapeTag>
159 auto lclTag =
typename viskores::internal::CellShapeTagViskoresToVtkc<CellShapeTag>::Type{};
161 if (numPoints != lclTag.numberOfPoints())
166 if ((pointIndex < 0) || (pointIndex >= numPoints))
173 return viskores::internal::LclErrorToViskoresError(
174 lcl::parametricPoint(lclTag, pointIndex, pcoords));
177 template <
typename ParametricCoordType>
184 pcoords[0] = pcoords[1] = pcoords[2] = 0;
188 template <
typename ParametricCoordType>
207 template <
typename ParametricCoordType>
222 return ParametricCoordinatesPoint(
225 return ParametricCoordinatesPoint(
229 static_cast<ParametricCoordType
>(pointIndex) /
static_cast<ParametricCoordType
>(numPoints - 1);
235 template <
typename ParametricCoordType>
245 return ParametricCoordinatesPoint(
248 return ParametricCoordinatesPoint(
252 return viskores::internal::LclErrorToViskoresError(
253 lcl::parametricPoint(lcl::Polygon(numPoints), pointIndex, pcoords));
267 template <
typename ParametricCoordType>
278 status = ParametricCoordinatesPoint(numPoints, pointIndex, CellShapeTag(), pcoords));
280 pcoords[0] = pcoords[1] = pcoords[2] = 0;
290 template <
typename LclCellShapeTag,
typename WorldCoordVector,
typename PCoordType>
293 const WorldCoordVector& pointWCoords,
294 const PCoordType& pcoords,
295 typename WorldCoordVector::ComponentType& wcoords)
297 return viskores::internal::LclErrorToViskoresError(lcl::parametricToWorld(
298 tag, lcl::makeFieldAccessorNestedSOA(pointWCoords, 3), pcoords, wcoords));
303 template <
typename WorldCoordVector,
typename PCoordType,
typename CellShapeTag>
305 const WorldCoordVector& pointWCoords,
308 typename WorldCoordVector::ComponentType& result)
310 auto numPoints = pointWCoords.GetNumberOfComponents();
311 return internal::ParametricCoordinatesToWorldCoordinatesImpl(
312 viskores::internal::make_LclCellShapeTag(shape, numPoints), pointWCoords, pcoords, result);
315 template <
typename WorldCoordVector,
typename PCoordType>
317 const WorldCoordVector& pointWCoords,
320 typename WorldCoordVector::ComponentType& result)
325 template <
typename WorldCoordVector,
typename PCoordType>
327 const WorldCoordVector& pointWCoords,
330 typename WorldCoordVector::ComponentType& result)
335 template <
typename WorldCoordVector,
typename PCoordType>
337 const WorldCoordVector& pointWCoords,
340 typename WorldCoordVector::ComponentType& result)
342 auto numPoints = pointWCoords.GetNumberOfComponents();
346 return ParametricCoordinatesToWorldCoordinates(
349 return ParametricCoordinatesToWorldCoordinates(
352 return internal::ParametricCoordinatesToWorldCoordinatesImpl(
353 lcl::Polygon(numPoints), pointWCoords, pcoords, result);
357 template <
typename WorldCoordVector,
typename PCoordType>
362 typename WorldCoordVector::ComponentType& result)
364 return internal::ParametricCoordinatesToWorldCoordinatesImpl(
365 lcl::Pixel{}, pointWCoords, pcoords, result);
368 template <
typename WorldCoordVector,
typename PCoordType>
373 typename WorldCoordVector::ComponentType& result)
375 return internal::ParametricCoordinatesToWorldCoordinatesImpl(
376 lcl::Voxel{}, pointWCoords, pcoords, result);
391 template <
typename WorldCoordVector,
typename PCoordType>
393 const WorldCoordVector& pointWCoords,
396 typename WorldCoordVector::ComponentType& result)
402 pointWCoords, pcoords, CellShapeTag(), result));
414 template <
typename LclCellShapeTag,
typename WorldCoordVector>
417 const WorldCoordVector& pointWCoords,
418 const typename WorldCoordVector::ComponentType& wcoords,
419 typename WorldCoordVector::ComponentType& result)
421 if (pointWCoords.GetNumberOfComponents() != tag.numberOfPoints())
428 return viskores::internal::LclErrorToViskoresError(
429 lcl::worldToParametric(tag, lcl::makeFieldAccessorNestedSOA(pointWCoords, 3), wcoords, result));
434 template <
typename WorldCoordVector,
typename CellShapeTag>
436 const WorldCoordVector& pointWCoords,
437 const typename WorldCoordVector::ComponentType& wcoords,
439 typename WorldCoordVector::ComponentType& result)
441 auto numPoints = pointWCoords.GetNumberOfComponents();
442 return internal::WorldCoordinatesToParametricCoordinatesImpl(
443 viskores::internal::make_LclCellShapeTag(shape, numPoints), pointWCoords, wcoords, result);
446 template <
typename WorldCoordVector>
448 const WorldCoordVector&,
449 const typename WorldCoordVector::ComponentType&,
451 typename WorldCoordVector::ComponentType& result)
457 template <
typename WorldCoordVector>
459 const WorldCoordVector& pointWCoords,
460 const typename WorldCoordVector::ComponentType&,
462 typename WorldCoordVector::ComponentType& result)
464 if (pointWCoords.GetNumberOfComponents() != 1)
469 result =
typename WorldCoordVector::ComponentType(0, 0, 0);
473 template <
typename WorldCoordVector>
475 const WorldCoordVector& pointWCoords,
476 const typename WorldCoordVector::ComponentType& wcoords,
478 typename WorldCoordVector::ComponentType& result)
489 return WorldCoordinatesToParametricCoordinates(
493 using Vector3 =
typename WorldCoordVector::ComponentType;
494 using T =
typename Vector3::ComponentType;
498 Vector3 vec = pointWCoords[0] - wcoords;
499 T minDistSq = viskores::Dot(vec, vec);
502 vec = pointWCoords[i] - wcoords;
503 T d = viskores::Dot(vec, vec);
526 T dParam =
static_cast<T
>(1) /
static_cast<T
>(numPoints - 1);
527 T polyLineParam =
static_cast<T
>(idx - 1) * dParam + lpc[0] * dParam;
529 result = Vector3(polyLineParam, 0, 0);
533 template <
typename WorldCoordVector>
535 const WorldCoordVector& pointWCoords,
536 const typename WorldCoordVector::ComponentType& wcoords,
538 typename WorldCoordVector::ComponentType& result)
540 auto numPoints = pointWCoords.GetNumberOfComponents();
544 return WorldCoordinatesToParametricCoordinates(
547 return WorldCoordinatesToParametricCoordinates(
550 return internal::WorldCoordinatesToParametricCoordinatesImpl(
551 lcl::Polygon(numPoints), pointWCoords, wcoords, result);
561 return internal::WorldCoordinatesToParametricCoordinatesImpl(
562 lcl::Pixel{}, pointWCoords, wcoords, result);
571 return internal::WorldCoordinatesToParametricCoordinatesImpl(
572 lcl::Voxel{}, pointWCoords, wcoords, result);
588 template <
typename WorldCoordVector>
590 const WorldCoordVector& pointWCoords,
591 const typename WorldCoordVector::ComponentType& wcoords,
593 typename WorldCoordVector::ComponentType& result)
599 pointWCoords, wcoords, CellShapeTag(), result));
610 #endif //viskores_exec_ParametricCoordinates_h