예제 #1
0
        public static void GetandShowTerrainPoints()
        {
            //Clear the viewport ..
            staticXamlVpt3D.Children.Clear();

            // Draw something new in the viewport ..
            Random rnd = new Random();
            int    x   = rnd.Next(5, 15);
            int    y   = rnd.Next(5, 20);
            int    z   = rnd.Next(5, 25);

            if (x > 10)
            {
                // Draw Terrain based on the random x,y,z seeds ...
                var myTerrain = new TerrainFill(TerrainGrid.Generate(x, y, z), staticXamlVpt3D);
            }
            else
            {
                // Draw Terrain based on fixed map data ...
                var myTerrain = new TerrainFill(TerrainGrid.Generate(new MapData()), staticXamlVpt3D);
            }
        }
예제 #2
0
    public void LoadMap(string path)
    {
        /* Integration function. When file was selected, this function is called and it
         * runs all methods from project.
         */
        parser  = new Parser();
        builder = new BuilderScript();
        terrain = new TerrainFill();


        parser.loadStringFromFile(path); // Calling parser with path.
        int[]       minMaxs     = parser.myParseOmap();
        Vector3[][] appContours = parser.myTerr.getApproximatedContours(5);


        ArrayList rasterizedAL = new ArrayList();

        Vector2[] line;
        int       simplifyConstant          = 40;
        int       height                    = Mathf.Abs(minMaxs[3] - minMaxs[2]) / simplifyConstant;
        int       width                     = Mathf.Abs(minMaxs[1] - minMaxs[0]) / simplifyConstant;
        ArrayList reducedLine               = new ArrayList();
        Dictionary <string, int> usedPoints = new Dictionary <string, int>();

        int[] ret = new int[4];
        ret[0] = Int32.MaxValue;
        ret[1] = Int32.MinValue;
        ret[2] = Int32.MaxValue;
        ret[3] = Int32.MinValue;

        for (int i = 0; i < appContours.Length; i++)
        {
            usedPoints.Clear();
            for (int j = 1; j < appContours[i].Length; j++)
            {
                line = builder.bresenhamLine(appContours[i][j - 1], appContours[i][j]); // Fill gaps between aproximated points and simplify to smaller coords.
                reducedLine.Clear();

                for (int k = 0; k < line.Length; k++)
                {
                    line[k].x = Mathf.Abs((line[k].x - minMaxs[0]) / simplifyConstant);
                    line[k].y = Mathf.Abs((line[k].y - minMaxs[2]) / simplifyConstant);
                    int    x     = (int)Math.Ceiling(line[k].x);
                    int    y     = (int)Math.Ceiling(line[k].y);
                    string point = x.ToString() + "," + y.ToString();

                    ret[0] = Mathf.Min(ret[0], x);
                    ret[2] = Mathf.Min(ret[2], y);
                    ret[1] = Mathf.Max(ret[1], x);
                    ret[3] = Mathf.Max(ret[3], y);

                    if (!usedPoints.ContainsKey(point))
                    {
                        usedPoints.Add(point, 0);
                        reducedLine.Add(line[k]);
                    }
                }
                rasterizedAL.Add((Vector2[])reducedLine.ToArray(typeof(Vector2)));
            }
        }
        Vector2[][] rasterized = (Vector2[][])rasterizedAL.ToArray(typeof(Vector2[]));
        Debug.Log("min x: " + ret[0].ToString() +
                  " max x: " + ret[1].ToString() +
                  " min y: " + ret[2].ToString() +
                  " max y: " + ret[3].ToString() +
                  " height: " + height.ToString() +
                  " width: " + width.ToString());

        int[][][] drawnContours = builder.drawContours(rasterized, height, width); // Draw rasterized contours to two-dimensional array.

        int[][] scanlined = builder.scanline(drawnContours);                       // Run scanline and check height between contours.

        float[][] res = builder.sampleQuantization(scanlined, 65, 65);             // Quantize huge two-dimensional array into smaller 65x65 for terrain input

        terrain.FillTerrain(res, tData, myTerrain, xBase, yBase);                  // Fill terrain with input.
    }
    public void LoadMap(string path)
    {
        /* Integration function. When file was selected, this function is called and it
         * runs all methods from project.
         */
        parser = new Parser();
        builder = new BuilderScript();
        terrain = new TerrainFill();

        parser.loadStringFromFile(path); // Calling parser with path.
        int[] minMaxs = parser.myParseOmap();
        Vector3[][] appContours = parser.myTerr.getApproximatedContours(5);

        ArrayList rasterizedAL = new ArrayList();
        Vector2[] line;
        int simplifyConstant = 40;
        int height = Mathf.Abs(minMaxs[3] - minMaxs[2])/simplifyConstant;
        int width = Mathf.Abs(minMaxs[1] - minMaxs[0])/simplifyConstant;
        ArrayList reducedLine = new ArrayList();
        Dictionary<string, int> usedPoints = new Dictionary<string, int>();

        int[] ret = new int[4];
        ret[0] = Int32.MaxValue;
        ret[1] = Int32.MinValue;
        ret[2] = Int32.MaxValue;
        ret[3] = Int32.MinValue;

        for (int i = 0; i < appContours.Length; i++) {
            usedPoints.Clear();
            for (int j = 1; j < appContours[i].Length; j++) {
                line = builder.bresenhamLine(appContours[i][j - 1], appContours[i][j]); // Fill gaps between aproximated points and simplify to smaller coords.
                reducedLine.Clear();

                for (int k = 0; k < line.Length; k++) {
                    line[k].x = Mathf.Abs((line[k].x - minMaxs[0]) / simplifyConstant);
                    line[k].y = Mathf.Abs((line[k].y - minMaxs[2]) / simplifyConstant);
                    int x = (int)Math.Ceiling(line[k].x);
                    int y = (int)Math.Ceiling(line[k].y);
                    string point = x.ToString() + "," + y.ToString();

                    ret[0] = Mathf.Min(ret[0], x);
                    ret[2] = Mathf.Min(ret[2], y);
                    ret[1] = Mathf.Max(ret[1], x);
                    ret[3] = Mathf.Max(ret[3], y);

                    if (!usedPoints.ContainsKey(point)) {
                        usedPoints.Add(point, 0);
                        reducedLine.Add(line[k]);
                    }
                }
                rasterizedAL.Add((Vector2[])reducedLine.ToArray(typeof(Vector2)));
            }
        }
        Vector2[][] rasterized = (Vector2[][])rasterizedAL.ToArray(typeof(Vector2[]));
        Debug.Log("min x: " + ret[0].ToString() +
            " max x: " + ret[1].ToString() +
            " min y: " + ret[2].ToString() +
            " max y: " + ret[3].ToString() +
            " height: " + height.ToString() +
            " width: " + width.ToString());

        int[][][] drawnContours = builder.drawContours(rasterized, height, width); // Draw rasterized contours to two-dimensional array.

        int[][] scanlined = builder.scanline(drawnContours); // Run scanline and check height between contours.

        float[][] res = builder.sampleQuantization(scanlined, 65, 65); // Quantize huge two-dimensional array into smaller 65x65 for terrain input

        terrain.FillTerrain(res, tData, myTerrain, xBase, yBase); // Fill terrain with input.
    }