예제 #1
0
        public void Match(NormalizeSettings norm)
        {
            // MatchWorker
            for (int i = 0; i < Vertices.Length; i++)
            {
                RotatePointToNormal(norm.CosLat, norm.SinLat, norm.CosLon, norm.SinLon, ref Vertices[i]);
                Vertices[i].X = (Vertices[i].X - norm.AvgV.X);
                Vertices[i].Y = (Vertices[i].Y - norm.AvgV.Y);
                Vertices[i].Z = (Vertices[i].Z - norm.AvgV.Z);
            }

            for (int i = 0; i < Corners.Length; i++)
            {
                RotatePointToNormal(norm.CosLat, norm.SinLat, norm.CosLon, norm.SinLon, ref Corners[i]);
                Corners[i].X = (Corners[i].X - norm.AvgV.X);
                Corners[i].Y = (Corners[i].Y - norm.AvgV.Y);
                Corners[i].Z = (Corners[i].Z - norm.AvgV.Z);
            }

            for (int i = 0; i < VertexNormals.Length; i++)
            {
                RotatePointToNormal(norm.CosLat, norm.SinLat, norm.CosLon, norm.SinLon, ref VertexNormals[i]);
            }

            // Rotate()
            for (int i = 0; i < Vertices.Length; i++)
            {
                var tmp = Vertices[i].X;
                Vertices[i].X = Vertices[i].Y;
                Vertices[i].Y = Vertices[i].Z;
                Vertices[i].Z = tmp;

                tmp = VertexNormals[i].X;
                VertexNormals[i].X = VertexNormals[i].Y;
                VertexNormals[i].Y = VertexNormals[i].Z;
                VertexNormals[i].Z = tmp;
            }

            for (int i = 0; i < Corners.Length; i++)
            {
                var tmp = Corners[i].X;
                Corners[i].X = Corners[i].Y;
                Corners[i].Y = Corners[i].Z;
                Corners[i].Z = tmp;
            }

            // MatchHeight
            for (int i = 0; i < Vertices.Length; i++)
            {
                Vertices[i].Z += norm.Height;
            }

            for (int i = 0; i < Corners.Length; i++)
            {
                Corners[i].Z += norm.Height;
            }
        }
예제 #2
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);
        }