知道点相对于直线的相对位置的最佳方法是什么?

时间:2014-05-28 17:34:41

标签: c++ geometry

假设我现在在2D坐标系中有一条直线,可以写成:

ax+by+c=0 

现在我有一个点,其坐标为(x0,y0),我的问题是如何判断点相对于线(上方或下方)的相对位置。我能弄清楚的一个解决方案如下:

// set up the line
a = ..;
b = ..;
c = ..;
// make sure that b is negative
if (b>0)
{
  a = -a;
  b = -b;
  c= -c;
}
// set the point
x0 = ..;
y0 = ..;

temp = a*x0+b*y0+c;

if (temp<0)
// the point is above the line
else
// the point is under the line.

在上面的代码中,我没有考虑直线(水平或垂直)的特殊情况,但基本思路是先确保b为负,然后计算函数的值({{1 }},并根据其值确定点的位置。我不确定这是否是一个很好的解决方案。任何想法将不胜感激。

2 个答案:

答案 0 :(得分:3)

是的,您的解决方案是正确的。可能的优化 - 不要否定系数,只评估表达式b*(a*x+b*y+c)的符号。 +对于上面, - 对于低于,0对于在线点和对于不确定的情况 - 垂直线。

说明:公共线方程

a*x+b*y+c=0 

可以转换为正规方程

x*cos(t)+y*sin(t)-p=0

(除以-sign(c)*Sqrt(a^2+b^2)
其中p是坐标原点(O)的法线长度,t是OX轴和此法线之间的角度。

表达的标志

XX*cos(t)+YY*sin(t)-p=0 
当点(XX,YY)和坐标原点除以此线时,

为正,否则为负。所以对于0范围内的t,Pi是正的,而表达式的正值表示该点位于该行之上(原点位于其下),依此类推......

答案 1 :(得分:2)

更正版本

您不必反转任何迹象。只需将点(x,y)的坐标插入到行ax + by + c的表单中即可生成一个值,请调用此h。 另外,计算d = -c/b。如果hd具有相同的符号,并且'd&gt; 0',然后(x,y)“低于”。

bool isBelow( double a, double b, double c, double x0, double y0 ){
  double d = -c/b;
  if( d == 0 ){
    return -a/b*x0 > y0;
  } else {
    double h0 = a*x0 + b*y0 + c;
    return d > 0 && (d > 0 == h0 > 0);
  }
}

它也适用于水平线,但不适用于垂直线(b==0)。