public void UpdateDiffusionValues() { //cria cópia DiffTile[,] old_matrix = new DiffTile[NX, NZ]; Array.Copy(matrix, old_matrix, matrix.Length); for (int i = 0; i < NX; i++) { for (int j = 0; j < NZ; j++) { if (matrix[i, j].ignore) //é uma parede ou coisa assim, ignora { } else if (i == playerPosX && j == playerPosZ) //o player está aqui { //decaimento pela exponecial matrix[i, j].value = ValueAtObjective; // * Mathf.Exp(decayFactor * (lastTimeSeen - Time.frameCount)); } else if (agentPositions.ContainsValue(new Vector2Int(i, j))) // senão, tentamos ver no dicionario se ha um agente nessa posição { matrix[i, j].value = -ValueAtObjective; } else { //fórmula da difusão float sum = 0.0f; //tenta pegar os valores de: //cima if (j - 1 >= 0) { sum += matrix[i, j - 1].value - matrix[i, j].value; } //baixo if (j + 1 < NZ) { sum += matrix[i, j + 1].value - matrix[i, j].value; } //direita if (i + 1 < NX) { sum += matrix[i + 1, j].value - matrix[i, j].value; } //esquerda if (i - 1 >= 0) { sum += matrix[i - 1, j].value - matrix[i, j].value; } matrix[i, j].value = matrix[i, j].value + DiffCoefficient * sum / 4.0f; } } } }
public void SetMatrixPositions() { coll = GetComponent <BoxCollider>(); dx = coll.bounds.size.x / NX; dz = coll.bounds.size.z / NZ; matrix = new DiffTile[NX, NZ]; var min = coll.transform.TransformPoint(coll.center - coll.size * 0.5f) - transform.position; var max = coll.transform.TransformPoint(coll.center + coll.size * 0.5f) - transform.position; x0 = (float)(transform.position.x + min.x + dx / 2.0); z0 = (float)(transform.position.z + min.z + dz / 2.0); //inicializa matriz com os valores da difusão for (int i = 0; i < NX; i++) { for (int j = 0; j < NZ; j++) { Vector3 position = new Vector3(x0 + i * dx, coll.center.y, z0 + j * dz); DiffTile tile = new DiffTile(); //se tem uma parede em cima desse tile, ele deve ser excluído do cálculo da difusão if (Physics.Raycast(position, Vector3.up, 100f, LayerMask.GetMask("Obstacle"))) { tile.ignore = true; } else { tile.ignore = false; } tile.value = 0.0f; matrix[i, j] = tile; Debug.Log(matrix[i, j]); } } Debug.Log("Matrix set succesfully"); }