public void Init(Map worldMap) { world = worldMap; mapA = new ProbMap(); mapA.Init(world.numX, world.numZ); mapA.AllEqualProb(); useMapA = true; probMap = mapA; mapB = new ProbMap(); mapB.Init(world.numX, world.numZ); }
public void Move(int iMoveX, int iMoveZ, float probExact) { if (iMoveX == 0 && iMoveZ == 0) { return; } ProbMap newMap = useMapA ? mapB : mapA; newMap.Zero(); int numX = probMap.numX; int numZ = probMap.numZ; for (int iX = 0; iX < numX; iX++) { for (int iZ = 0; iZ < numZ; iZ++) { int iTargetX = iX + iMoveX; int iTargetZ = iZ + iMoveZ; if (iTargetX < 0 || iTargetX >= numX) { continue; } if (iTargetZ < 0 || iTargetZ >= numZ) { continue; } //int trailX = iMoveX > 0 ? - 1 : (iMoveX == 0 ? 0 : 1); //int trailZ = iMoveZ > 0 ? - 1 : (iMoveZ == 0 ? 0 : 1); //most of old value moves to new float probTarget = probMap.cells[iX, iZ] * probExact; //some probablity that we are still in old cell. //float probTrail = probMap.cells[iX, iZ] * (1.0f - probExact); newMap.cells[iTargetX, iTargetZ] += probTarget; //newMap.cells[iTargetX + trailX, iTargetZ + trailZ] += probTrail; } } probMap = newMap; useMapA = !useMapA; }
public void Visualize(ProbMap pm, Map world) { topCells.Clear(); int numX = pm.numX; int numZ = pm.numZ; float thresh = 0.05f; int iCM = 0; for (int iX = 0; iX < numX; iX++) { for (int iZ = 0; iZ < numZ; iZ++) { float p = pm.cells[iX, iZ]; if (p > thresh) { Vector3 pos = Vector3.zero; pos = world.startPos; pos.x += world.dX * iX; pos.z += world.dZ * iZ; cellMarkers[iCM].transform.position = pos; Vector3 s = Vector3.one; s.y = p * 100f; s.x = world.dX; s.z = world.dZ; cellMarkers[iCM].transform.localScale = s; iCM++; if (iCM == cellMarkers.Count) { break; } } } } for (int iM = iCM; iM < cellMarkers.Count; iM++) { cellMarkers[iM].transform.position = Vector3.zero; cellMarkers[iM].transform.localScale = Vector3.zero; } }