在Heightmap数组中查找边和顶点

时间:2015-04-19 22:51:44

标签: java arrays algorithm terrain

让我们说我已经生成了一个高度图数组,为了简单起见,其中只有三个高度值:012。例如,它可能如下所示:

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

我想要做的就是找到'顶点'在这个高度图中,并以逻辑顺序输出它们(因此我可以绘制一条线到达每个连续点,最终将跟踪形状的轮廓)。例如,对于第一个组'在右上角的1 s:

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

第二张图中的数字是我需要找到的坐标(按照正确的顺序),点和短划线是我从每个点追踪的线,以获得形状的轮廓。

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

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

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

修改 我从评论中意识到使用顶点会让我失去一些形状区域。我认为,而不是顶点,我需要找到的是全部形状边缘上的点,但顺序正确。所以我的例子应该是:

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

很抱歉这个混乱。

2 个答案:

答案 0 :(得分:2)

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

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


(在澄清编辑之前回答问题:) 听起来像你想要每个“岛屿”的convex hull。通过图遍历找到连续的组(你的“岛”)(我最喜欢BFS,但味道不同;当它们包含相同的值并且相邻时,考虑两个单元属于同一个岛),然后应用一些{ {3}}

答案 1 :(得分:0)

您可以尝试alpha形状。 Alpha形状被定义为delaunay三角测量,没有边缘超过alpha。