我的游戏中有以下地图,
x-------------
y +3 +5 +2 -1 -2
| -1 +4 +2 +1 -1
| -2 +1 -1 -1 -1
| -1 -1 -2 -1 +2
| +2 +2 +2 +2 +4
我想将积极点作为多边形绘制,如下所示:
我该怎么做,我应该使用什么算法/方式?
答案 0 :(得分:1)
你还没有告诉我们你需要多边形的东西,所以我只是假设多边形应该可视化岛屿而不是别的。
您的值似乎是高度图。低于零的高度低于海平面。然后,您可以使用此信息绘制海平面的分段高度线:将地图细分为方块,其中地图图块的中心是角点。对于这些正方形的任何边缘,其中一个终点位于海平面以下,另一个终点位于海平面以下,您可以通过线性插值找到高度为零的点。那么你有两个或两个这样的积分。
如果您有两个点,请用线连接它们。如果你有四个点,通过查看相邻的图块并连接它们来找出哪些对属于一起。你应该得到你的岛屿的等高线图:
这是你添加了一个高度为-1的人工边框的例子。因为高度值不仅仅被视为岛屿/海洋标准,而是作为物理高度值,所以创建了岸的不均匀外观。如果你希望你的岛屿看起来更规则,你可以将所有负高度都视为-1,将所有正高度视为1.你会得到一个更规则的外观,其中所有点都在正方形的中间。边缘:
请注意,此方法不会创建多边形(因此我的答案可能完全忽略了这一点),因为这些线未连接。您可以通过查找辅助网格的所有垂直和水平部分的交点来改进算法,然后沿着正方形漂移以构建闭合多边形,然后您可以根据需要进行简化。
答案 1 :(得分:1)
您的示例不正确。
算法不能在每个步骤中使用独立决策产生不同的结果。
但我明白你的目标和可能的解决方案是:
1.使用BFS(或洪水填充,在不同阵列中保存阳性细胞组),我发现有不同的名称用不同的名称来调用相同的东西。您可以使用负值作为边框。
N,M - 地图的大小
board [] [] - 你的地图。
访问[] [] - bool数组。 bfs()将单元格添加到某个组
后将其标记为已访问groups [] - 具有一些结构的动态数组(mb另一个数组)以保持单元格组
groupsCount = 0;
for row = 1..N do
for col = 1..M do
if( board[row][col] > 0 && !visited[row][col] ) {
bfs(row,col,board,visited,groups[groupsCount]);
++groupsCount;
}
2.1。使用O(N ^ 2)或O(N logN)凸包,你会发现每个组的周长最小的包络(就像你在几个钉子上拉一条松紧带一样)。
2.2。最小的信封可能无法以适当的方式解决您的任务,例如
当你想看到像这样的smth时
在这种情况下,可能的解决方案是在负数附近标记正单元格并以某种特殊优先级运行DFS。例如 - "选择最近的未访问单元格"。它将产生上面显示的结果(但我不确定所有情况)。
答案 2 :(得分:1)
这是轮廓追踪问题的一个实例。 http://www.imageprocessingplace.com/downloads_V3/root_downloads/tutorials/contour_tracing_Abeer_George_Ghuneim/alg.html
您应该逐行扫描地图,直到找到正值。然后使用轮廓跟踪算法,连接轮廓顶点,并将它们标记为已访问过。然后继续扫描,直到找到非正值(退出当前岛),然后找到未标记的正值(下一个岛)。等等...