假设我现在在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 }},并根据其值确定点的位置。我不确定这是否是一个很好的解决方案。任何想法将不胜感激。
答案 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
。如果h
和d
具有相同的符号,并且'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
)。