【问题标题】:R: Find a shape from a point cloudR:从点云中查找形状
【发布时间】:2016-01-22 17:31:47
【问题描述】:

我有一个像下面这样的点云

df <- data.frame(x=c(2,3,3,5,6,2,6,7,7,4,3,8,9,10,10,12,11,12,14,15),
              y=c(6,5,4,4,4,4,3,3,2,3,7,3,2,3,4,6,5,5,4,6))
plot(df,xlab="",ylab="",pch=20)

将它们视为动物运动的 gps 坐标。我想找到点(动物)所覆盖的空间区域。最明显的解决方案是产生这个的凸包:

df1 <- df[chull(x = df$x,y=df$y),]
polygon(x = df1$x,df1$y)

但这不是我想要的结果。运动区域不是一个封闭的几何形状,而是一种回旋镖的形状。凸包覆盖了动物未覆盖的许多区域,从而高估了该区域。我正在寻找这样的东西:

当然,这是一个提供想法的模拟数据集。原始数据集在点云中有更多的点和不同的几何形状。我一直在考虑 DBSCAN 或最小跨度网络,但它们不太有效。

我不知道如何用几何或数学来描述这一点。如果有人对如何解决这个问题有任何想法(即使它不是一个完整的解决方案),我将非常感激。如果有人对这个问题有更好的标题,那也很好:-) 谢谢。

更新 ---------------------------------- ------------------

(最小生成树)MST 图。我认为这可能是正确的方向。

library(ape)
d <- dist(df)
mstree <-mst(d)
plot(mstree, x1 = df$x, x2 = df$y)

【问题讨论】:

标签: r polygon area point-clouds convex-hull


【解决方案1】:
library(geometry)
polyarea(df$x, df$y)
[1] 18.5

但这需要正确的顺序。

【讨论】:

  • 我认为OP不是在寻找区域的价值,而是在寻找形状。
  • 很抱歉标题令人困惑。这不仅仅是找到多边形的面积。首先要找到正确的多边形是个问题。
  • 啊,对。如何为每个点分配一个特定区域,然后减去重叠部分。
【解决方案2】:

试试 alphahull

library(alphahull)

p <- ahull(df$x, df$y, alpha = 2.5)
plot(p)

不过,像这样的纯几何技巧对动物追踪数据几乎没有帮助。它太临时适用于其他情况,没有任何时间分量或有关环境的信息或位置的不确定性或点样本与真实轨迹之间的关系等。

【讨论】:

    【解决方案3】:

    您可能需要考虑一种基于 TSP 启发式的方法。当所有点都相关时,这种方法接近理想。

    下面是一个从insertion heuristic for TSP 扩展的简单方法,它可能是可行的,但它是 O(N^2) 或最差,除非你对数据结构相当小心。该链接给出了凸包方法的启发式描述。

    凸包,O(n^2*log^2(n))

    1. 找到我们的一组城市的凸包,并将其作为我们的初始子游览。
    2. 对于不在子旅游中的每个城市,找到其最便宜的插入(如最近插入的第 3 步)。然后选择最少的城市 成本/增加比率,并将其插入。
    3. 重复第 2 步,直到没有其他城市。

    在这种情况下,城市是数据点,由于目标不是连接到所有数据点,而是获得大致形状,因此需要额外的步骤来确定数据点何时应该“ t 被添加或不再需要并且可以被删除。但问题是尚不清楚哪些点会被认为是不相关的。

    这个TSP Test Data 站点应该让您了解该启发式的结果将是什么,以及您希望如何从结果“游览”中删除点,您认为这无关紧要。

    虽然可能的解决方案是跟踪原始凸包,并将两个相邻包点之间的距离增加限制为包点之间原始距离的一些(相对较小)倍数,类似于Alpha 外壳如何工作。这将通过限制两个船体点之间可以移动的距离来防止出现底部的形状,TSP Test Case BCL380

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多