Przeglądaj źródła

geometry: implement point-to-segment distance function.

undefined
Sam Hocevar 10 lat temu
rodzic
commit
a66e5c6dab
1 zmienionych plików z 20 dodań i 10 usunięć
  1. +20
    -10
      src/lol/math/geometry.h

+ 20
- 10
src/lol/math/geometry.h Wyświetl plik

@@ -314,24 +314,34 @@ PlaneIntersection TestPointVsPlane(const TV &point, const TV &plane_p, const TV
return PlaneIntersection::Plane;
}

//Project points functions
//Plane
/* Project point on plane */
template <typename TV>
TV ProjectPointOnPlane(TV const &proj_point, TV const &plane_point, TV const &plane_normal)
TV ProjectPointOnPlane(TV const &p, TV const &origin, TV const &normal)
{
return proj_point - dot(proj_point - plane_point, plane_normal) * plane_normal;
return p - dot(p - origin, normal) * normal;
}
//Line

/* Project point on line */
template <typename TV>
TV ProjectPointOnRay(TV const &p, TV const &origin, TV const &direction)
{
return origin + direction * dot(p - origin, direction);
}

/* Distance from point to plane */
template <typename TV>
TV ProjectPointOnRay(TV const &proj_point, TV const &ray_point, TV const &ray_dir)
float PointDistToPlane(TV const &p, TV const &origin, TV const &normal)
{
return ray_point + ray_dir * dot(proj_point - ray_point, ray_dir);
return abs(dot(p - origin, normal));
}
//Point dist to plane

/* Distance from point to segment */
template <typename TV>
float PointDistToPlane(TV const &proj_point, TV const &plane_point, TV const &plane_normal)
float PointDistToSegment(TV const &p, TV const &a, TV const &b)
{
return abs(dot(proj_point - plane_point, plane_normal));
float d2 = sqlength(b - a);
float u = d2 ? dot(p - a, b - a) / d2 : 0.0f;
return distance(p, mix(a, b, clamp(u, 0.0f, 1.0f)));
}

} /* namespace lol */


Ładowanie…
Anuluj
Zapisz