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; } }
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); }