【发布时间】:2020-06-20 04:02:23
【问题描述】:
给定二维平面中的一组点,是否有可能在二维平面中找到一组所有可能的非共线点? 时间复杂度目前并不重要,只要解决方案正确即可。
【问题讨论】:
-
你不是说非共线点triples吗?
标签: graphics geometry computer-science computational-geometry convex-hull
给定二维平面中的一组点,是否有可能在二维平面中找到一组所有可能的非共线点? 时间复杂度目前并不重要,只要解决方案正确即可。
【问题讨论】:
标签: graphics geometry computer-science computational-geometry convex-hull
您的要求可能需要澄清。任何两点彼此共线,因为一条线将它们连接起来。为了使这个问题可以回答,看来我必须解释您要表达的意思:如果任何数量大于或等于三的点都彼此共线,那么我们的一组非共线点只能包含一个共线点。
鉴于此,我们可以执行以下操作:
对于每对点,将它们之间的斜率计算为 (y - y') / (x - x')。如果 x = x',只需将斜率记为 V。
接下来,对于每一对点和斜率,检查涉及该对中任一点的所有其他点对,并查看对应的斜率是否与被检查的斜率相同。将所有如此确定的点添加到一个集合中,然后将该集合添加到一个集合中。
完成后,您将拥有一个集合集合,并且集合中每个集合中的所有点都将由彼此共线的点组成。
现在的问题如下:找到可以选择的最大点数,以使两个集合中不存在两个点。如果您选择了其中一个集合中的两个点,那么您将选择与至少一个其他点共线的两个点。
此时,我们可以简单地尝试 n 个点的所有 2^n 个子集,并检查每个子集是否可以接受(因为子集和任何集合的交集的大小最多为 1)。
例子:
p = (1, 1), q = (2, 2), r = (3, 3), s = (2, 3)
m = [ - 1 1 2]
[ 1 - 1 V]
[ 1 1 - 0]
[ 2 V 0 -]
(p, q): r yes, s no; collection (p, q, r)
(p, r): q yes, s no; collection (p, q, r)
(p, s): q no, r no; no collection
(q, p): r yes, s no; collection (p, q, r)
(q, r): p yes, s no; collection (p, q, r)
(q, s): p no, r no; no collection
(r, p): q yes, s no; collection (p, q, r)
(r, q): p yes, s no; collection (p, q, r)
(r, s): p no, q no; no collection
(s, p): q no, r no; no collection
(s, q): p no, r no; no collection
(s, r): p no, q no; no collection
Try candidate (p, q, r, s): intersection with (p, q, r) has size > 1, reject
Try candidate (p, q, r): intersection with (p, q, r) has size > 1, reject
Try candidate (p, q, s): intersection with (p, q, r) has size > 1, reject
…
Try candidate (p, s): intersection with (p, q, r) has size = 1, accept
这显然是时间和空间上的指数,但这将解决问题。
【讨论】: