直线下的二维点

时间:2011-12-23 11:09:14

标签: c++ algorithm data-structures

我有很多点(x,y),例如(15, 176) (65, 97) (72, 43) (102, 6) (191, 189) (90, 163) (44, 168) (39, 47) (123, 37)我需要找到适合(0,0) to (max-x, max-y)的所有点。在这个例子中,这些点将是(0,0 ) and (191,189),所以我绘制了所有点,我需要找到来自(0,0) to (191,189)的线下的所有点。是否有任何标准算法来执行此操作。 / p>

4 个答案:

答案 0 :(得分:3)

如果y * X <1,则点(x,y)在从(0,0)到(X,Y)的线下面。 Y * x。

答案 1 :(得分:2)

(我假设'适合'你'的意思是'在......之下'覆盖''。

一种方法是使用例如确定线上的点。 Bresenham的行算法(http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm)然后使用std::set_intersectionhttp://www.cplusplus.com/reference/algorithm/set_intersection/)来查找哪些点都在行中以及原始点集中。

答案 2 :(得分:2)

在线段(0,0)下 - &gt;(191,189)等于

  • 具有x <= 191
  • y < x *(const 189/191)

播种这些是您必须检查每个点的两个条件。 您有1个整数比较的成本,2个浮点数的int,1个浮点乘法,每个点1个浮点数比较

答案 3 :(得分:0)

对于任何线y = mx + c,其中m是斜率,c是y截距

使用这些值 a = y-mx-c,x = 0,y = 0 b = y-mx-c为一般点

如果a和b具有相同的符号,则意味着这些点位于同一侧 否则他们就在这条线的另一边

我保留(0,0)找到一个可以比较一般点的位置w.r.t.起源。你也可以在其中输入任何其他点..

希望完全有助于解决您的问题