/*
判断点是否在线段上
*/
static inline bool IsPointInLine(Point pt_start, Point pt_end, Point pt_hit, int linesize){
if (((pt_hit.x - pt_start.x) * (pt_hit.x - pt_end.x) + (pt_hit.y - pt_start.y) * (pt_hit.y - pt_end.y)) < 0){//必须是钝角
//计算点到直线的距离
float B = -(pt_end.x - pt_start.x);
float A = pt_end.y - pt_start.y;
float C = -(A * pt_start.x + B * pt_start.y);
float t = A * pt_hit.x + B * pt_hit.y + C;
float dd = (t * t) / (A * A + B * B);
if (dd <= linesize * linesize){
return true;
}
}
return false;
}
1. 首先判断点是否在以AB为直径的圆内,这一步通过一个向量点乘即可快速过滤大部分的点。
原理如下图: