0

给定 y = mx + c 形式的两条线方程,必须过滤掉不在两条线之间的所有点。

目前我正在使用一个通过过滤器,它大致过滤掉了这些点。相反,这可以使用两条线方程更精确地完成吗?

4

1 回答 1

0

假设您有一条由 定义的线y = mx + c1和另一条由 定义的线y = mx + c2。如您所见,我假设m两行的系数相同,否则短语

必须过滤掉不在两条线之间的所有点

会毫无意义。

现在,对行进行排序c2 <= c1,即

if (c1 < c2) std:;swap(c1, c2);

现在您确定该c1线等于或高于该c2线。

取任意一点 ( xx, yy)。代xx入第一行的方程, y = m * xx + c1。如果结果小于yy,则 ( xx, yy) 位于c1直线上方。您应该将其从云中删除。

对 c2 行执行相同操作:y = m * xx + c2. 如果结果大于 yy,则点 ( xx, yy) 位于直线下方c2,应从集合中删除。

换句话说,你应该只保留那些满足的点 (x, y)

  m * x + c1 >= y and m * x + c2 <= y; // assuming c1 >= c2

例子:

假设你有y = x + 3并且 y = x + 1。假设你有一个点 (2,4)。你应该保留它还是过滤掉它?

我们有c1= 3, c2= 1。让我们在第一行插入 2。y = 1*2 + c1 = 5. 5 >= 4. 第一个测试通过。

现在是第二行。y = 1*2 + 1 = 3. 3 <= 4. 第二个条件也满足。结论:保持它,与图完全一致。

两条平行线

于 2021-05-11T20:16:35.693 回答