17T point_box_distance(
const fvec<T, 3>& point, fvec<T, 3> extent) {
19 fvec<T, 3> q = abs(point) - T(0.5) * extent;
20 return length(max(q, T(0))) + std::min(std::max(q.x(), std::max(q.y(), q.z())), T(0));
32T point_plane_distance(
const fvec<T, 3>& point,
const fvec<T, 3>& origin,
const fvec<T, 3>& normal) {
34 return dot(point - origin, normal);
46template <
typename T, cgv::type::u
int32_type N>
47T point_sphere_distance(
const fvec<T, N>& point,
const fvec<T, N>& center, T radius) {
49 return length(center - point) - radius;
61static std::pair<T, T> point_quadratic_bezier_distance(
const fvec<T, 3>& point,
const fvec<T, 3>& p0,
const fvec<T, 3>& p1,
const fvec<T, 3>& p2) {
63 using vec_type = fvec<T, 3>;
65 vec_type b = p0 - T(2) * p1 + p2;
66 vec_type c = a * T(2);
67 vec_type d = p0 - point;
69 T kk = T(1) / dot(b, b);
70 T kx = kk * dot(a, b);
71 T ky = kk * (T(2) * dot(a, a) + dot(d, b)) / T(3);
72 T kz = kk * dot(d, a);
79 T q = kx * (T(2) * kx * kx - T(3) * ky) + kz;
80 T h = q * q + T(4) * p3;
84 fvec<T, 2> x = (
vec2(h, -h) - q) / T(2);
85 fvec<T, 2> uv = sign(x) * pow(abs(x),
vec2(T(1) / T(3)));
86 t = clamp(uv.x() + uv.y() - kx, T(0), T(1));
89 dist = sqr_length(d + (c + b * t) * t);
92 T v = std::acos(q / (p * z * T(2))) / T(3);
94 T n = std::sin(v) * T(1.732050808);
95 vec_type ts = clamp(vec_type(m + m, -n - m, n - m) * z - kx, T(0), T(1));
98 T dt = sqr_length(d + (c + b * ts.x()) * ts.x());
102 dt = sqr_length(d + (c + b * ts.y()) * ts.y());
cgv::math::fvec< float, 2 > vec2
declare type of 2d single precision floating point vectors