Math Lib: add dist_signed_squared_to_corner_v3v3v3

Can be used to check if a point is inside the 2-planes defined by a face-corner.
This commit is contained in:
2015-02-16 18:47:15 +11:00
parent 81be1c7a21
commit 421d0f3bde
2 changed files with 61 additions and 0 deletions

View File

@@ -104,6 +104,10 @@ float dist_squared_to_line_segment_v3(const float p[3], const float l1[3], const
float dist_to_line_segment_v3(const float p[3], const float l1[3], const float l2[3]);
float dist_squared_to_line_v3(const float p[3], const float l1[3], const float l2[3]);
float dist_to_line_v3(const float p[3], const float l1[3], const float l2[3]);
float dist_signed_squared_to_corner_v3v3v3(
const float p[3],
const float v1[3], const float v2[3], const float v3[3],
const float axis_fallback[3]);
float closest_to_line_v3(float r[3], const float p[3], const float l1[3], const float l2[3]);
float closest_to_line_v2(float r[2], const float p[2], const float l1[2], const float l2[2]);
void closest_to_line_segment_v3(float r_close[3], const float p[3], const float l1[3], const float l2[3]);

View File

@@ -477,6 +477,63 @@ float dist_to_line_v3(const float v1[3], const float l1[3], const float l2[3])
return sqrtf(dist_squared_to_line_v3(v1, l1, l2));
}
/**
* Check if \a p is inside the 2x planes defined by ``(v1, v2, v3)``
* where the 3x points define 2x planes.
*
* \param axis_fallback used when v1,v2,v3 form a line.
*
* \note the distance from \a v1 & \a v3 to \a v2 doesnt matter
* (it just defines the planes).
*
* \return the lowest squared distance to eithe of the planes.
* where ``(return < 0.0)`` is outside.
*
* <pre>
* v1
* +
* /
* x - out / x - inside
* /
* +----+
* v2 v3
* x - also outside
* </pre>
*/
float dist_signed_squared_to_corner_v3v3v3(
const float p[3],
const float v1[3], const float v2[3], const float v3[3],
const float axis_fallback[3])
{
float dir_a[3], dir_b[3];
float plane_a[4], plane_b[4];
float axis[3];
sub_v3_v3v3(dir_a, v1, v2);
sub_v3_v3v3(dir_b, v3, v2);
cross_v3_v3v3(axis, dir_a, dir_b);
if ((len_squared_v3(axis) < FLT_EPSILON) && axis_fallback) {
copy_v3_v3(axis, axis_fallback);
}
cross_v3_v3v3(plane_a, axis, dir_a);
cross_v3_v3v3(plane_b, dir_b, axis);
#if 0
plane_from_point_normal_v3(plane_a, center, l1);
plane_from_point_normal_v3(plane_b, center, l2);
#else
/* do inline */
plane_a[3] = -dot_v3v3(plane_a, v2);
plane_b[3] = -dot_v3v3(plane_b, v2);
#endif
return min_ff(dist_signed_squared_to_plane_v3(p, plane_a),
dist_signed_squared_to_plane_v3(p, plane_b));
}
/* Adapted from "Real-Time Collision Detection" by Christer Ericson,
* published by Morgan Kaufmann Publishers, copyright 2005 Elsevier Inc.
*