点是否在线段上
需要注意的p_p1, p_p2共线,但p不在线段上的情况

public static bool IsPointOnSegment(Vector2 p, Vector2 p1, Vector2 p2) { var p_p1 = p1 - p; var p_p2 = p2 - p; var cross = p_p1.x * p_p2.y - p_p1.y * p_p2.x; //叉乘结果如果为0, 说明平行或共线 if (Mathf.Approximately(cross, 0)) { //x,y方向都在线段端点范围内 return (p.x - p1.x) * (p.x - p2.x) <= 0 && (p.y - p1.y) * (p.y - p2.y) <= 0; } return false; }
点是否在直线上
把p点的x值代入直线方程算出y,如果和p点的y值相同则在直线上
public static bool IsPointOnLine(Vector2 p, float k, float t) { //y=kx+t float y = k * p.x + t; return Mathf.Approximately(p.y, y); }
参考