我有由这两个点定义的线段:A(x1,y1,z1)和B(x2,y2,z2)。我还有一个点p(x,y,z)。如何检查该点是否在线段上?
我有由这两个点定义的线段:A(x1,y1,z1)和B(x2,y2,z2)。我还有一个点p(x,y,z)。如何检查该点是否在线段上?
向量 (B - A) × (p - A) 的叉积应该比向量 B - A 短得多。理想情况下,叉积为零,但在有限精度的浮点数硬件上不太可能实现。
您可以检查点是否位于由point1和point2以及线方向定义的两个平面之间:
/// Returns the closest point from @a point to this line on this line.
vector3 <Type>
line3d <Type>::closest_point (const vector3 <Type> & point) const
{
return this -> point () + direction () * dot (point - this -> point (), direction ());
}
/// Returns true if @a point lies between point1 and point2.
template <class Type>
bool
line_segment3 <Type>::is_between (const vector3 <Type> & point) const
{
const auto closest = line () .closest_point (point);
return abs ((closest - point0 ()) + (closest - point1 ())) <= abs (point0 () - point1 ());
}