///<summary>
 ///    Return a single character that describes the polygon
 ///    contained in a cell in the list, or else the result of
 ///    DumpGridCell
 ///</summary>
 protected string DumpGridPolygon(List<GridCell> cells, GridDumpKind kind)
 {
     int indexSub = (kind == GridDumpKind.CVPolygons ? 1 : firstTerrainIndex);
     foreach(GridCell cell in cells) {
         if (cell.polygon == null ||
             (kind == GridDumpKind.CVPolygons && cell.status != CellStatus.OverCV) ||
             (kind == GridDumpKind.TerrainPolygons && cell.status != CellStatus.OverTerrain))
             continue;
         if (cell.polygon.index < polygonID.Length)
             return polygonID.Substring(cell.polygon.index - indexSub, 1);
         else
             return "#";
     }
     return DumpGridCell(cells);
 }
 protected void DumpGrid(string title, GridDumpKind kind, bool append)
 {
     DumpGrid(title, kind, append, 0, 0);
 }
 protected void DumpGrid(string title, GridDumpKind kind, bool append, int count)
 {
     DumpGrid(title, kind, append, count, 0);
 }
        ///<summary>
        ///    Dump the grid, with the given title, putting the file
        ///    PathGeneratorLog.txt in the ../ directory.  If append
        ///    is false, create a new file; if true, append to the
        ///    existing file.
        ///</summary>
        protected void DumpGrid(string title, GridDumpKind kind, bool append, int count, int subCount)
        {
            if (!dumpGrid)
                return;
            // Dump the header rows
            string hundreds = "";
            string tens = "";
            string ones = "";
            for (int i=0; i<xCount; i++) {
                hundreds += digits.Substring(i / 100, 1);
                tens += digits.Substring((int)Decimal.Remainder(i, 100) / 10, 1);
                ones += digits.Substring((int)Decimal.Remainder(i, 10), 1);
            }

            string p = "../PathGeneratorLog.txt";
            FileStream f = new FileStream(p,
                (appendGridDump || append) ? (File.Exists(p) ? FileMode.Append : FileMode.Create) : FileMode.Create,
                FileAccess.Write);
            StreamWriter writer = new StreamWriter(f);
            long elapsedMilliseconds = stopwatch.ElapsedMilliseconds;
            writer.Write(string.Format("{0} Started writing '{1}' for model '{2}' to {3}\n{4} milliseconds since creation of the PathGenerator instance\n\n",
                    DateTime.Now.ToString("F"), title, modelName, p, elapsedMilliseconds));
            switch (kind) {
            case GridDumpKind.CVPolygons:
                writer.Write("{0} Collision Volume Polygons\n\n", count);
                break;
            case GridDumpKind.TerrainPolygons:
                writer.Write("{0} Terrain Polygons\n\n", count);
                break;
            case GridDumpKind.Portals:
                writer.Write("{0} Terrain Portals\n\n", count);
                break;
            case GridDumpKind.EdgeCells:
                writer.Write("{0} Edge Cells; {1} Vertices\n\n", count, subCount);
                break;
            }
            writer.Write("      {0}\n" + "      {1}\n" + "      {2}\n" + "\n",
                hundreds, tens, ones);
            for (int i=0; i<zCount; i++) {
                string line = string.Format("{0:D4}  ", i);
                for (int j=0; j<xCount; j++) {
                    List<GridCell> cells = grid[j,i];
                    switch (kind) {
                    case GridDumpKind.Cells:
                        line += DumpGridCell(cells);
                        break;
                    case GridDumpKind.Portals:
                        line += DumpGridPortalCell(cells);
                        break;
                    case GridDumpKind.EdgeCells:
                        line += DumpGridEdgeCell(cells);
                        break;
                    case GridDumpKind.CVPolygons:
                        line += DumpGridPolygon(cells, kind);
                        break;
                    case GridDumpKind.TerrainPolygons:
                        line += DumpGridPolygon(cells, kind);
                        break;
                    }
                }
                writer.Write(line + "\n");
            }
            writer.Write(string.Format("\nGenerating dump took {0} milliseconds\n\n", stopwatch.ElapsedMilliseconds - elapsedMilliseconds));
            writer.Close();
        }