18template <
typename T, cgv::type::u
int32_type N>
19T point_line_distance(
const fvec<T, N>& point,
const fvec<T, N>& p0,
const fvec<T, N>& direction) {
20 return length(closest_point_on_line_to_point(p0, direction), point) - point);
31T point_box_distance(
const fvec<T, 3>& point,
const fvec<T, 3>& extent) {
32 fvec<T, 3> q = abs(point) - T(0.5) * extent;
33 return length(max(q, T(0))) + std::min(std::max(q.x(), std::max(q.y(), q.z())), T(0));
45T point_plane_distance(
const fvec<T, 3>& point,
const fvec<T, 3>& origin,
const fvec<T, 3>& normal) {
46 return dot(point - origin, normal);
58template <
typename T, cgv::type::u
int32_type N>
59T point_sphere_distance(
const fvec<T, N>& point,
const fvec<T, N>& center, T radius) {
60 return length(center - point) - radius;
72static 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) {
74 using vec_type = fvec<T, 3>;
76 vec_type b = p0 - T(2) * p1 + p2;
77 vec_type c = a * T(2);
78 vec_type d = p0 - point;
80 T kk = T(1) / dot(b, b);
81 T kx = kk * dot(a, b);
82 T ky = kk * (T(2) * dot(a, a) + dot(d, b)) / T(3);
83 T kz = kk * dot(d, a);
90 T q = kx * (T(2) * kx * kx - T(3) * ky) + kz;
91 T h = q * q + T(4) * p3;
95 fvec<T, 2> x = (
vec2(h, -h) - q) / T(2);
96 fvec<T, 2> uv = sign(x) * pow(abs(x),
vec2(T(1) / T(3)));
97 t = clamp(uv.x() + uv.y() - kx, T(0), T(1));
100 dist = sqr_length(d + (c + b * t) * t);
103 T v = std::acos(q / (p * z * T(2))) / T(3);
105 T n = std::sin(v) * T(1.732050808);
106 vec_type ts = clamp(vec_type(m + m, -n - m, n - m) * z - kx, T(0), T(1));
109 T dt = sqr_length(d + (c + b * ts.x()) * ts.x());
113 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