Digamos que você queira criar um jogo em 3D e tenha jogadores ou celulares capazes de atrair outras entidades seguindo suas trilhas de perfume. Existe alguma estrutura de dados conhecida que corresponda a esse caso de uso?
Se você tem apenas alguns indivíduos, provavelmente pode fazer algo como um mapa de coord 3D para o ID da entidade, mas o perfume real funciona de maneira diferente, porque desaparece com o tempo, mas lentamente. E na maioria das vezes, você só pode saber aproximadamente o que foi lá e aproximadamente quantas coisas desse tipo foram lá. E a aproximação se torna pior com o tempo, até que se acabe.
Eu imagino que é como começar com um número exato e perder lentamente os dígitos menos significativos, até você perder o dígito mais significativo também. Mas isso realmente não me ajuda, porque os IDs de entidade normalmente não são codificados para conter o tipo de entidade, além do ID individual.
Respostas:
Há muita variedade em como você pode fazer isso; Vou sugerir as opções "óbvias para mim", mas há muitas variações que podem ser projetadas. Disclaimer: Na verdade, eu não implementei algo assim.
Primeiro, você precisa de uma estrutura de dados que cubra seu mundo. Se você estiver fazendo movimento NPC em um espaço 3D, provavelmente terá ou precisará de uma estrutura desse tipo para fins de busca de caminhos - por exemplo, uma malha de navegação. Então, vamos supor que podemos adicionar um campo para aromas a isso.
Então, o que colocamos nesse campo? Proponho uma lista de registros ( perfume , força , tempo ). Essa lista é mantida no comprimento máximo ou abaixo dele e classificada por força - para que os aromas fracos sejam descartados. O perfume pode ser algo explicitamente definido para cada entidade ou tipo de entidade, ou pode simplesmente ser o tipo de entidade - dependendo do que você deseja poder rastrear de maneira distinta. O horário é um registro de data e hora de quando esse registro de perfume foi atualizado pela última vez.
Quando uma entidade passa por uma área (por exemplo, um determinado triângulo da malha de navegação), é hora de atualizar a lista de aromas. Primeiro, diminua todas as forças de acordo com a quantidade de tempo passado de acordo com o valor do tempo versus o tempo atual - o decaimento exponencial é provavelmente uma escolha razoável aqui. Em seguida, adicione o perfume da entidade atual à lista, talvez com uma força dependente do tipo de entidade. Então, se a lista ficar muito longa, descarte a menor força.
Para obter um resultado de rastreamento, encontre o perfume na lista do local atual, faça o mesmo para todos os seus vizinhos e siga a direção do perfume mais forte (que não é a direção da qual o rastreador veio).
Para realismo extra:
Difusão: transfira periodicamente uma fração do perfume em cada local para seus vizinhos. Isso confunde trilhas, mas também significa que as coisas estacionárias podem ser farejadas (encontrar comida, cadáveres, etc.). (É até um tipo reconhecido de IA para basear ações inteiramente nesse tipo de informação - o cenário fornece informações sobre o caminho a seguir para obter um recurso específico, etc. Eu esqueço o nome dele.) A principal desvantagem é o tempo gasto calculando a difusão em todos os lugares.
Aromas fortes devem impedir a detecção de aromas fracos; divida a força do perfume procurado pela força do perfume mais forte e falhe se for muito pequeno. Isso poderia permitir deliberadamente confundir o rastro de um perfume.
fonte
Eu modificaria uma técnica chamada mapeamento de influência para criar um mapa para aromas. Ele se dissipa e desbota naturalmente, se mistura e disputa com outros aromas, e provavelmente mais. Parece que ele fará exatamente o que você precisa, mas pode ser mais elaborado do que o que você deseja implementar. No mínimo, deve fornecer boas idéias e é muito simples de implementar sobre qualquer estrutura que você esteja usando no momento.
Um tutorial / explicação que achei útil.
fonte