#include "shape/sphere.h" #include "common/common.h" template const real Sphere::ComputeSignedDistanceAndGradients(const std::array& point, std::vector& grad) const { Eigen::Matrix p; for (int i = 0; i < dim; ++i) p(i) = point[i]; // dist = r - |c - p|. real cp_norm = (center_ - p).norm(); const real dist = radius_ - cp_norm; // Compute gradients. Eigen::Matrix radius_grad, cp_norm_grad; radius_grad.setZero(); radius_grad(dim) = 1; cp_norm_grad.setZero(); // Avoid division-by-zero. const real eps = Epsilon(); if (cp_norm <= eps) cp_norm += eps; cp_norm_grad.head(dim) = (center_ - p) / cp_norm; grad = ToStdVector(radius_grad - cp_norm_grad); return dist; } template void Sphere::InitializeCustomizedData() { CheckError(ParametricShape::param_num() == dim + 1, "Inconsistent number of parameters."); for (int i = 0; i < dim; ++i) center_(i) = ParametricShape::params()[i]; radius_ = ParametricShape::params()[dim]; } template class Sphere<2>; template class Sphere<3>;