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