【问题标题】:Transformation to get rid of collinear points去除共线点的变换
【发布时间】:2010-06-01 04:25:37
【问题描述】:

我正在编写一个程序来解决几何问题。

我的算法没有很好地处理共线点。

我可以对这些点应用任何变换以消除共线性吗?

【问题讨论】:

  • 这完全取决于问题...消除共线性的一种方法是简单地向每个点添加一些噪声,即 (x, y, z) ↦ (x + 0.01*(random() - 0.5), y + 0.01*(random() - 0.5), z + 0.01(random() - 0.5)) 如果 random() 返回一个随机实数 [0, 1[.
  • 你想要一个移除(几乎)共线点的变换,还是你想要所有点被变换成它们更少的方式共线?
  • 我想保留所有要点,但我希望它们不那么共线

标签: math geometry transform transformation


【解决方案1】:

然后我认为噪音实际上可能是解决方案。正如我在上面的评论中所写的那样

消除共线性的一种方法是 只是为了给每个人添加一些噪音 点,即 (x, y, z) ↦ (x + 如果 random() 在 [0, 1[.

【讨论】:

  • 您始终可以在 4 个维度上工作并沿第 4 轴添加噪声。对于某些算法,这将解决投影回 3 维后几乎没有可察觉变化的问题。但不知道最初的问题是什么,谁知道这是否合适。
【解决方案2】:

如果您正在处理大量点集,则向每个集添加噪声可能会在一个集中解决问题,但在另一个集中创建它。

如果是这种情况,您可以在应用噪声之前测试共线性。

共线性条件为:

       x1  y1  1
  det  x2  y2  1  = 0
       x3  y3  1

【讨论】:

  • 计算行列式很慢。更好的测试是形成两个平移向量 v1 := (x3, y3) - (x2, y2) 和 v2 := (x2, y2) - (x1, y1) 并测试它们是否平行,即如果 v1 = ķ v2。 v1 和 v2 是并行的当且仅当 (v1, v2) = |v1| |v2|。
  • @Andreas 行列式在一般情况下很慢。在这里,您只需要 5 次求和和 3 次乘法。您的建议涉及(我可能是错的)4 加一除一乘...没有太大不同! :)
  • @belisarius:不,我意识到五分钟后,评论是只读的。但我认为我的方法更容易实现,至少在 OP 对行列式不太熟悉的情况下。
  • 还有一个选择是,当且仅当三个点共线时,等式在应用于两个平移向量的三角形不等式中成立。
  • 看来四和二乘一比较是最经济的 (y2-y3) (x1-x3) = (y1-y3) (x2-x3) 几何解释是两条直线从一点到另一点的斜率相等
猜你喜欢
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
相关资源
最近更新 更多