Neste mapa, o "continente" é toda a terra que pode ser conectada ao centro do mapa nas quatro direções principais (norte, sul, leste, oeste - não na diagonal).
Gostaria de detectar o continente e preencher os buracos. Eu pensei em três coisas:
Pesquise em cada célula que não seja água (células escuras) se puder ser conectada ao centro do mapa usando um algoritmo de localização de caminho. Muito caro! Mas isso poderia funcionar para as ilhas.
O continente está cheio de um balde de tinta verde. Cada buraco é cercado por tinta ... e agora? Se eu verificar todos os pontos de água dentro do continente em busca de adjacência, excluirei algumas penínsulas e outras características geográficas exibidas na costa.
Algum tipo de detecção de borda para descobrir o continente. Mantenha o que estiver dentro, encha-o se for água, remova o que está do lado de fora. Complexo?
Talvez algum desenvolvedor com experiência em jogos possa me ajudar com isso, possivelmente me dando o nome de algum algoritmo ou técnica conhecida?
Respostas:
Removendo Ilhas
Eu já fiz esse tipo de coisa antes em um dos meus jogos. Para se livrar das ilhas externas, o processo foi basicamente:
Remoção de lagos
Quanto a se livrar dos buracos (ou lagos) dentro da ilha, você faz um processo semelhante, mas partindo dos cantos do mapa e se espalhando pelos ladrilhos "Água". Isso permitirá que você diferencie o "Mar" dos outros ladrilhos de água, e então você pode se livrar deles da mesma maneira que antes.
Exemplo
Deixe-me desenterrar minha implementação do preenchimento de inundação que tenho aqui em algum lugar (isenção de responsabilidade, não me importei com eficiência, por isso tenho certeza de que existem muitas maneiras mais eficientes de implementá-lo):
Eu usei isso como um primeiro passo para me livrar de lagos no meu jogo. Depois de chamar isso, tudo o que eu precisava fazer era algo como:
Editar
Adicionando algumas informações extras com base nos comentários. Caso seu espaço de pesquisa seja muito grande, poderá ocorrer um estouro de pilha ao usar a versão recursiva do algoritmo. Aqui está um link no stackoverflow (trocadilho pretendido :-)) para uma versão não recursiva do algoritmo, usando uma
Stack<T>
alternativa (também em C # para corresponder à minha resposta, mas deve ser fácil de se adaptar a outros idiomas, e há outras implementações nesse link também).fonte
Modifique o algoritmo de preenchimento de inundação de quatro direções http://en.wikipedia.org/wiki/Flood_fill
fonte
Esta é uma operação padrão no processamento de imagens. Você usa uma operação de duas fases.
Comece criando uma cópia do mapa. Nesse mapa, transforme em pixels do mar todos os pixels terrestres que fazem fronteira com o mar. Se você fizer isso uma vez, ele eliminará 2x2 ilhas e encolherá ilhas maiores. Se você fizer isso duas vezes, eliminará ilhas 4x4, etc.
Na fase dois, você faz quase o contrário: transforma em pixels da terra todos os pixels do mar que fazem fronteira com a terra, mas apenas se fossem pixels da terra no mapa original (foi por isso que você fez uma cópia na fase 1). Isso recupera as ilhas para sua forma original, a menos que tenham sido totalmente eliminadas na fase 1.
fonte
Eu tive um problema semelhante, mas não no desenvolvimento de jogos. Eu tive que encontrar pixels em uma imagem adjacentes e com o mesmo valor (regiões conectadas). Tentei usar um preenchimento recursivo, mas continuei causando estouros de pilha (sou um programador iniciante: P). Então tentei este método http://en.wikipedia.org/wiki/Connected-component_labeling , na verdade, era muito mais eficiente, para o meu problema de qualquer maneira.
fonte