探索完美共线性判定算法的历程
1. 斜率比较法判定共线性
在判定三个点是否共线时,一种思路是通过比较直线的斜率来实现。原本我们可能会通过连接两点画直线,再看第三点是否在这条直线上,但这里我们可以换个方式,只需要比较两条直线的斜率。因为如果直线 pq 与直线 qr 相同,那么它必然也和直线 pr 相同。而且,我们只需要比较斜率,而不用考虑 y 轴截距。
以下是用 Lisp 语言实现的代码:
(defun mm-collinear (px py qx qy rx ry)
(equalp (slope px py qx qy)
(slope qx qy rx ry)))
这个版本看起来简洁了很多,没有了对垂直线特殊处理的 if 表达式,所有点集都以相同的方式处理。不过,这种简洁和表面上的统一其实是一种假象,它依赖于 Lisp 背后的一些技巧。这里使用 equalp 而不是 = 来比较斜率,是因为 equalp 能正确处理 slope 函数返回数字或 nil 的情况。如果使用类型系统更严格的语言,代码可能会变成这样:
(defun typed-mm-collinear (px py qx qy rx ry)
(let ((pq-slope (slope px py qx qy))
(qr-slop
超级会员免费看
订阅专栏 解锁全文
1922

被折叠的 条评论
为什么被折叠?



