Пример #1
0
        public IEnumerable <TerrainRow> GetTerrainRows([NotNull] Box box)
        {
            int    startTileIndexX;
            int    endTileIndexX;
            int    startTileIndexY;
            double terrainTileSize;
            double terrainXMin;
            double terrainYMin;

            int terrainTileCount;

            GetTerrainTiling(
                box, FirstTerrainBox,
                out terrainTileCount,
                out startTileIndexX, out endTileIndexX,
                out startTileIndexY,
                out terrainTileSize, out terrainXMin, out terrainYMin);

            for (var terrainTileIndex = 0;
                 terrainTileIndex < terrainTileCount;
                 terrainTileIndex++)
            {
                int iX = terrainTileIndex % (endTileIndexX - startTileIndexX);
                int iY = terrainTileIndex / (endTileIndexX - startTileIndexX);

                double xMin = terrainXMin + (iX + startTileIndexX) * terrainTileSize;
                double yMin = terrainYMin + (iY + startTileIndexY) * terrainTileSize;
                double xMax = terrainXMin + (iX + startTileIndexX + 1) * terrainTileSize;
                double yMax = terrainYMin + (iY + startTileIndexY + 1) * terrainTileSize;

                IEnvelope terrainBox = new EnvelopeClass();
                terrainBox.PutCoords(xMin, yMin, xMax, yMax);
                terrainBox.SpatialReference = _terrainReference.Dataset.SpatialReference;

                var terrainRow = new TerrainRow(terrainBox, _terrainReference,
                                                _resolution, _progress);

                yield return(terrainRow);

                if (terrainRow.HasLoadedSurface)
                {
                    terrainRow.DisposeSurface();
                }
            }
        }
Пример #2
0
        private TerrainRow ReadTerrainRow(BinaryReader reader)
        {
            TerrainRow row = new TerrainRow();

            row.MiddlePoint = new Vector3(reader.ReadInt16(), reader.ReadInt16(), -reader.ReadInt16());

            row.RightPoints[0] = row.MiddlePoint;
            row.RightPoints[1] = new Vector3(reader.ReadInt16(), reader.ReadInt16(), -reader.ReadInt16());
            row.RightPoints[2] = new Vector3(reader.ReadInt16(), reader.ReadInt16(), -reader.ReadInt16());
            row.RightPoints[3] = new Vector3(reader.ReadInt16(), reader.ReadInt16(), -reader.ReadInt16());
            row.RightPoints[4] = new Vector3(reader.ReadInt16(), reader.ReadInt16(), -reader.ReadInt16());
            row.RightPoints[5] = new Vector3(reader.ReadInt16(), reader.ReadInt16(), -reader.ReadInt16());

            row.LeftPoints[0] = row.MiddlePoint;
            row.LeftPoints[1] = new Vector3(reader.ReadInt16(), reader.ReadInt16(), -reader.ReadInt16());
            row.LeftPoints[2] = new Vector3(reader.ReadInt16(), reader.ReadInt16(), -reader.ReadInt16());
            row.LeftPoints[3] = new Vector3(reader.ReadInt16(), reader.ReadInt16(), -reader.ReadInt16());
            row.LeftPoints[4] = new Vector3(reader.ReadInt16(), reader.ReadInt16(), -reader.ReadInt16());
            row.LeftPoints[5] = new Vector3(reader.ReadInt16(), reader.ReadInt16(), -reader.ReadInt16());

            row.MiddlePoint *= GameConfig.TerrainScale;
            for (int i = 0; i < NbrTerrainPointsPerSide; i++)
            {
                row.RightPoints[i] *= GameConfig.TerrainScale;
            }
            for (int i = 0; i < NbrTerrainPointsPerSide; i++)
            {
                row.LeftPoints[i] *= GameConfig.TerrainScale;
            }

            // Each point is relative to the previous point
            for (int i = 1; i < NbrTerrainPointsPerSide; i++)
            {
                row.RightPoints[i] += row.RightPoints[i - 1];
            }

            for (int i = 1; i < NbrTerrainPointsPerSide; i++)
            {
                row.LeftPoints[i] += row.LeftPoints[i - 1];
            }

            return(row);
        }