【问题标题】:Finding Edges and Vertices Within Heightmap Array在高度图数组中查找边和顶点
【发布时间】:2015-04-19 22:51:43
【问题描述】:

假设我生成了一个高度图数组,为简单起见,其中只有三个高度值:012。例如,它可能看起来像这样:

000000111111110000000000000000000000000000000000
001111111111111111000000000001111111111111000000
000011111111111111100000000000000011122111110000
000000000111111100000000000000000111221110000000
000000000000000000000000000001111122222111111100
000000000000000000000000111111111111111111000000
000000000000000000000111111111100000000000001111
000000000001111111111110000000000000000001111111
000000001111222222211100000000000000000000001110
000000000011112221100000000000000011111000000000
000000000000111111100000000000001111111110000000
000000001111111110000000000000000011111000000000
000000000000000000000000000000000000000000000000

我要做的是在这个高度图中找到“顶点”,并按逻辑顺序输出它们(这样我就可以画一条线到每个连续的点,最终将追踪形状的轮廓) .例如,对于右上角1s 的第一个“组”:

000000111111110000000           .1------2       
001111111111111111000        8-'         `--3   
000011111111111111100  -->    `7---.        .4  
000000000111111100000               6-----5'    
000000000000000000000                           

第二张图中的数字是我需要找到的坐标(按正确的顺序),点和虚线是我从每个点开始绘制的线以获得形状的轮廓。

有什么算法可以用来找到这些顶点吗?如果没有,找到它们的最有效方法是什么?

我目前正在做的是使用递归来找到每个“岛”或“组”数字,然后将此形状的所有外部点作为顶点。但是,我的方法很慢,并且顶点的顺序不正确。

感谢您的帮助,我希望这一切都有意义。

编辑: 我从 cmets 中意识到,使用顶点会使我失去形状的某些区域。我认为我需要找到的不是顶点,而是 all 形状边缘的点,但顺序正确。所以我的例子应该是:

000000111111110000000             12345678       
001111111111111111000         17          9,10   
000011111111111111100  -->     16,15         11  
000000000111111100000               14,13,12     
000000000000000000000                            

很抱歉给您带来了困惑。

【问题讨论】:

  • 假设高度图在数组A中,左上角是单元格A[0][0],为什么A[1][6](第1行,第6列)不是顶点?你如何决定在哪里放置对角线?如果您要计算凸包,那么这些将是顶点,但凸包的侧面不会保留这些凹痕。
  • 只有线条存在,所以更容易看到它们所描绘的形状。我试图让它看起来像从81 的对角线。

标签: java arrays algorithm terrain


【解决方案1】:

(对已编辑问题的回答:)某种形式的图遍历应该可以做到这一点,我只会给出一个非常高级的描述。从高度图的最高层开始,对于任何岛屿,从某个内部点开始。向北走,直到到达岛屿边缘或地图边缘。以顺时针(或逆时针,无论您需要哪种方式)方式,只探索那些可以属于岛屿边缘的细胞。

对于较低级别,从与较高级别岛屿相邻的单元格开始并执行相同操作。


(在澄清编辑之前回答问题:) 在我看来,您想要每个“岛屿”的convex hull。通过图遍历找到连续的组(你的“岛屿”)(我最喜欢BFS,但口味不同;只要两个单元格包含相同的值并且相邻,就认为它们属于同一个岛),然后应用一些convex hull algorithm .

【讨论】:

  • 如果岛屿的形状像字母 c 或甜甜圈会怎样?查看凸包方法的图像,它似乎无法像this 图像中那样得到正确的形状
  • 图像正是您将获得的形状。那不是你想要的吗?然后你必须更清楚地定义形状。
  • 对于弯曲或内部有凹痕的形状,例如字母 c 或字母 s,使用凸包方法不会只给我两个椭圆吗?
  • 你会得到一个椭圆形的,是的。我认为您会想要保留一些凹位,而有些则不会?如果是这种情况,那么您将必须定义保留哪些内容以及掩盖哪些内容,以便其他人能够帮助您。
【解决方案2】:

您可以尝试 alpha 形状。 Alpha 形状定义为边不超过 alpha 的 delaunay 三角剖分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    相关资源
    最近更新 更多