随笔分类 - 2d碰撞检测 / 1_点
摘要:点到线段的最近距离 判断依据 1) 投影结果<0,则线段端点a离p最近 2) 投影结果>线段ab的长度,则线段端点b离p最近 3) 否则p在线段上的垂点为最近点 p与ab不共线时 1) p在线段两侧 2-a) p在线段内侧 2-b) p在线段内侧2 p与ab共线时 1) p在线段两侧 2-a) p在
阅读全文
摘要:1) 在两侧 2) 与端点重合 3) 在端点之间 判断共线 1) 用pa和pb判断 图1:pa和pb为0度,pa•pb=|pa|*|pb|*cos(0)=|pa|*|pb|; pa×pb=|pa|*|pb|*sin(0)=0 图2:p和端点重合,pa•pb=pa.x*pb.x+pa.y*pb.y=0
阅读全文
摘要:效果 //点是否在射线上 public static bool IsPointOnRay(Vector2 o, Vector2 dir, Vector2 p) { var op = p - o; if (Mathf.Approximately(op.sqrMagnitude, 0)) //o和p重叠
阅读全文
摘要:1) 点在三角形的边上时 AP=AE+AF (向量加法) 设AE=v*AB, AF=u*AC; 则AP=v*AB+u*AC(二元一次方程,u, v为我们引入的变量) 根据向量三点共线定理可知:u+v=1 2) 点在三角形内时 AE不变, 让AF变短一些, 当用u*AC表示AF时, u的值肯定也比1)
阅读全文
摘要:原理: 1) 求出向量ao在ab上的投影距离 2) a沿着ab方向移动投影距离就是垂足点的位置 // 获得原点到直线ab的垂点 public static Vector2 GetPerpendicularToOrigin(Vector2 a, Vector2 b) { var ab = b - a;
阅读全文
摘要:直线方程的一般式:ax+by+c=0 点p(x1, y1)到直线的距离: //点到直线的距离(一般式表示直线) public static float PointToLineDistance(Vector2 point, float a, float b, float c) { //直线一般式: a
阅读全文
摘要:ap1×ab与ap2×ab的结果异号,则表示两点在线段两侧;同号则表示在线段同侧 有一个点在线段上或两个点都在线段上,当做在线段同侧处理 //两点是否在线段同侧 public static bool IsTwoPointSameSideOfSegment(Vector2 a, Vector2 b,
阅读全文
摘要:同侧法 点p在三角形三条边的同侧时,点p在三角形内。可以通过叉乘结果是否都为正或负来判断是否同侧 1) 三角形顶点逆时针时 1-a) ab与ap, bc与bp, ca与cp的夹角均为右手逆时针锐角,sin(锐角)>0,即:叉乘结果>0,此时p在三角形内。 1-b) bc与bp的夹角为0度,sin(0
阅读全文
摘要:1) 如果点在以线段ab为对角线的矩形外, 肯定不在线段上 2) 点p和线段端点a或b重叠时, 在线段上 3) ap和ab的夹角为0度,则点在线段上; 否则不在线段上 叉乘判断 //点是否在线段上 public static bool IsPointOnSegment(Vector2 p, Vect
阅读全文
摘要:更推荐这个:点到线段的最近距离, 点与线段的位置关系 - 投影方式 判断依据 点与线段端点组成的三角形,有一个角是钝角或180度时,点在线段外侧 sin(锐角)>0, sin(钝角)>0,无法区分,所以叉乘不行。 cos(锐角)>0, cos(钝角)<0,可以区分,所以用点乘。 1) 在外侧时 a)
阅读全文
摘要:点是否在矩形内 //点是否在矩形内 public static bool IsPointInRect(Vector2 p, Vector2 min, Vector2 max) { if (p.x < min.x || p.x > max.x) return false; if (p.y < min.
阅读全文
摘要:把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.Approxima
阅读全文