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;
        }
    }