在游戏代码中,经常需要求点到直线线的距离,点到线段的距离,这里简单的记录下
求点到直线的距离:
已知三个点的坐标, 其中A、B是直线上的两个点, P是平面上任意的一个点
-
通过三角形的面积计算,(海伦公式)设三角形三边分别为a,b,c,三角形的面积则为:
其中,p为三角形半周长,即p=(a+b+c)/2;
float getPointLineDis(float2 tex, float2 p1, float2 p2) { if((tex.y - p2.y)*(p1.x - p2.x) == (p1.y - p2.y) * (tex.x - p2.x)) { return 0.0;//共线 } float len1 = length(tex -p1); float len2 = length(tex -p2); float len3 = length(p1 -p2); float half_p = 0.5 * (len1 + len2 + len3); float s = sqrt(half_p * (half_p - len1) * (half_p-len2) * (half_p-len3)); float dis = s * 2 / len3; return dis; }
-
向量计算,推荐这个,在shader里面计算非常简单,消耗低
float getPointLineDis(float2 tex, float2 p1, float2 p2) { float2 v1 = tex - p1; float2 v2 = p2 - p1; float2 v3 = dot(v1,v2) * v2 / (length(v1)*length(v2)); return length(v1 - v3); }