Exemplo n.º 1
0
        //------------------------------------------------

        public void SimplifyMesh(double threshold, TraceListener log, bool verbose)
        {
            var    edgePoints = EdgeIndices.Select(p => Vertices[p]).ToArray();
            double fudgeSq    = double.MaxValue;

            for (int i = 1; i < edgePoints.Length; i++)
            {
                var d = edgePoints[i].DeltaSq(ref edgePoints[i - 1]);
                if (d > 1.0E-10)
                {
                    fudgeSq = Math.Min(fudgeSq, d);
                }
            }

            fudgeSq /= 100.0;
            var mdFinal = new SimplifyMesh(log, Vertices, TriangleIndices, EdgeIndices, verbose);

            mdFinal.SimplifyMeshByThreshold(threshold);
            Vertices        = mdFinal.GetVertices();
            TriangleIndices = mdFinal.GetIndices();
            VertexNormals   = mdFinal.GetVertexNormals();
            EdgeIndices     = mdFinal.GetEdgeIndices();
            mdFinal         = null;

            VertexToImage = new Vector2d[Vertices.Length];
            GeoPolar3d buffGeoPolar = new GeoPolar3d();

            for (int i = 0; i < VertexToImage.Length; i++)
            {
                InvertTo(ref Vertices[i], ref VertexToImage[i], ref buffGeoPolar);
            }
        }
Exemplo n.º 2
0
        private void ForwardTo(ref GeoPolar3d polar, ref Vector3d cart)
        {
            double height = polar.Height + Utils.AlphaMeters;
            double cosLat = Math.Cos(polar.Lat / RadToDeg);
            double sinLat = Math.Sin(polar.Lat / RadToDeg);

            cart.X = height * cosLat * Math.Cos(polar.Lon / RadToDeg);
            cart.Y = height * cosLat * Math.Sin(polar.Lon / RadToDeg);
            cart.Z = height * sinLat;
        }
Exemplo n.º 3
0
        public void ExagerateHeight(double scale)
        {
            GeoPolar3d polar = new GeoPolar3d();

            for (int i = 0; i < Vertices.Length; i++)
            {
                InvertToFull(ref Vertices[i], ref polar);
                polar.Height *= scale;
                ForwardTo(ref polar, ref Vertices[i]);
            }
        }
Exemplo n.º 4
0
        private void InvertToFull(ref Vector3d cart, ref GeoPolar3d polar)
        {
            var h       = Math.Sqrt(cart.X * cart.X + cart.Y * cart.Y + cart.Z * cart.Z);
            var latSin  = cart.Z / h;
            var hLatCos = h * Math.Sqrt(1.0 - latSin * latSin);
            var lon     = Math.Asin(cart.Y / hLatCos) * RadToDeg;

            if (cart.X < 0.0)
            {
                lon = (lon > 0 ? 180 : -180) - lon;
            }

            var height     = h - Utils.AlphaMeters;
            var LatDegrees = Math.Asin(latSin) * RadToDeg;
            var LonDegrees = lon;

            polar.Lat    = LatDegrees;
            polar.Lon    = LonDegrees;
            polar.Height = height;
        }
Exemplo n.º 5
0
        public FriendlyMesh(int latSteps, int lonSteps,
                            Angle latLo, Angle lonLo,
                            Angle latHi, Angle lonHi,
                            float[][] heights,
                            TraceListener log)
            : base(latSteps, lonSteps, latLo, lonLo, latHi, lonHi)
        {
            GeoPolar3d buffGeoPolar = new GeoPolar3d();

            Vector3d[][] positions = Compute3dPositions(heights);
            origCorners = new Vector3d[]
            {
                positions[0][0],
                positions[0][positions.Length - 1],
                positions[positions.Length - 1][0],
                positions[positions.Length - 1][positions.Length - 1],
            };

            var         norm = CenterAndScale(positions);
            ComplexMesh m    = new ComplexMesh(positions, log);

            positions       = null;
            Vertices        = m.Vertices;
            TriangleIndices = m.TriangleIndices;
            EdgeIndices     = m.EdgeIndices;
            VertexNormals   = m.VertexNormals;
            RevertCenterAndScale(norm);
            m = null;

            VertexToImage = new Vector2d[Vertices.Length];
            for (int i = 0; i < VertexToImage.Length; i++)
            {
                InvertTo(ref Vertices[i], ref VertexToImage[i], ref buffGeoPolar);
            }

            Corners = new Vector3d[origCorners.Length];
            for (int i = 0; i < Corners.Length; i++)
            {
                Corners[i] = origCorners[i];
            }
        }
Exemplo n.º 6
0
        public NormalizeSettings GetCenterAndScale(double lat, double lon, double scale, double latDelta, double elevation, TraceListener log)
        {
            double   cosLat = Math.Cos(lat / RadToDeg);
            double   sinLat = Math.Sin(lat / RadToDeg);
            double   cosLon = Math.Cos(lon / RadToDeg);
            double   sinLon = Math.Sin(lon / RadToDeg);
            Vector3d avgV   = new Vector3d();

            // Find the triangle that contains lat lon
            // First transform all points to ones centered on lat lon
            Vector3d[] xformed = new Vector3d[Vertices.Length];
            for (int i = 0; i < Vertices.Length; i++)
            {
                xformed[i] = Vertices[i];
                RotatePointToNormal(cosLat, sinLat, cosLon, sinLon, ref xformed[i]);
            }

            // Look find the triangles that contain that contain the origin
            for (int i = 0; i < TriangleIndices.Length; i += 3)
            {
                var pointH = TriangleContainsOrigin(xformed, i);
                if (pointH.HasValue)
                {
                    GeoPolar3d polar = new GeoPolar3d(lat, lon, pointH.Value);
                    ForwardTo(ref polar, ref avgV);
                    // Interpolate the height at the origin.
                    log?.WriteLine(avgV);
                }
            }

            RotatePointToNormal(cosLat, sinLat, cosLon, sinLon, ref avgV);

            var norm = new NormalizeSettings(cosLat, sinLat, cosLon, sinLon, avgV, elevation);

            return(norm);
        }
Exemplo n.º 7
0
 private void InvertTo(ref Vector3d cart, ref Vector2d ret, ref GeoPolar3d polar)
 {
     InvertToFull(ref cart, ref polar);
     ret.X = (polar.Lon - LonLo.DecimalDegree) / LonDelta.DecimalDegree;
     ret.Y = 1.0 - (polar.Lat - LatLo.DecimalDegree) / LatDelta.DecimalDegree;
 }