给定 y = mx + c 形式的两条线方程,必须过滤掉不在两条线之间的所有点。
目前我正在使用一个通过过滤器,它大致过滤掉了这些点。相反,这可以使用两条线方程更精确地完成吗?
假设您有一条由 定义的线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. 第二个条件也满足。结论:保持它,与图完全一致。