/// <summary> /// Returns the XYZ-coordinates from longitude, latitude and height on a given reference ellipsoid. /// </summary> public static V3d XyzFromLonLatHeight(V3d lonLatHeight, GeoEllipsoid ellipsoid) { double lam = Conversion.RadiansFromDegrees(lonLatHeight.X); double phi = Conversion.RadiansFromDegrees(lonLatHeight.Y); double h = lonLatHeight.Z; double cos_lam = System.Math.Cos(lam); double cos_phi = System.Math.Cos(phi); double sin_lam = System.Math.Sin(lam); double sin_phi = System.Math.Sin(phi); // eccentricity square double eq = ellipsoid.EQ; // radius of the curvature in prime vertical double Rv = ellipsoid.A / (1.0 - eq * sin_phi * sin_phi).Sqrt(); V3d result = new V3d(); result.X = (Rv + h) * cos_phi * cos_lam; result.Y = (Rv + h) * cos_phi * sin_lam; result.Z = ((1.0 - eq) * Rv + h) * sin_phi; return(result); }
/// <summary> /// Enumerates all vertex indexes at which /// both outgoing edges meet at an angle that /// is less than the given threshold. /// </summary> public static IEnumerable <int> GetSpikes( this Polygon3d self, double toleranceInDegrees = 0.1) { if (toleranceInDegrees < 0.0) { throw new ArgumentOutOfRangeException(); } var threshold = Conversion.RadiansFromDegrees(toleranceInDegrees).Cos(); var edges = self.GetEdgeArray(); edges.Apply(e => e.Normalized); var ec = edges.Length; if (V3d.Dot(-edges[ec - 1], edges[0]) > threshold) { yield return(0); } for (int i = 1; i < ec; i++) { if (V3d.Dot(-edges[i - 1], edges[i]) > threshold) { yield return(i); } } }
public void SetClippingParams(double horizontalFovInDegrees, double near, double far, double aspectRatio = 1.0) { var d = System.Math.Tan(Conversion.RadiansFromDegrees(horizontalFovInDegrees) * 0.5) * near; m_box.Min.X = -d; m_box.Max.X = +d; m_box.Min.Y = -d / aspectRatio; m_box.Max.Y = +d / aspectRatio; m_box.Min.Z = near; m_box.Max.Z = far; UpdateProjectionTrafo(); }
/// <summary> /// Gauss-Krueger projection from a reference ellipsoid datum (Lon/Lat/Height) to local GK-coordinates (in meters). /// </summary> /// <param name="lonLatHeight">V3d with Lon/Lat/Height.</param> /// <param name="ellipsoid"></param> /// <param name="zeroMeridian"></param> public static V3d GaussKruegerEllipsoidToPlane( V3d lonLatHeight, GeoEllipsoid ellipsoid, double zeroMeridian ) { double phi = Conversion.RadiansFromDegrees(lonLatHeight.Y); double lam = Conversion.RadiansFromDegrees(lonLatHeight.X - zeroMeridian); double cosphi = phi.Cos(); double a = ellipsoid.A; double b = ellipsoid.B; double n = (a - b) / (a + b); //n = (a-b)/(a+b); double nTo2 = n * n; double nTo3 = nTo2 * n; double nTo4 = nTo3 * n; double nTo5 = nTo4 * n; // arc length approx. polynom coefficients double c1 = (a + b) / 2.0 * (1.0 + nTo2 / 4.0 + nTo4 / 64.0); double c2 = -(3.0 / 2.0) * n + (9.0 / 16.0) * nTo3 - (3.0 / 32.0) * nTo5; double c3 = (15.0 / 16.0) * nTo2 - (15.0 / 32.0) * nTo4; double c4 = -(35.0 / 48.0) * nTo3 + (105.0 / 256.0) * nTo5; double c5 = (315.0 / 512.0) * nTo4; // sine of multiple of phi double sin2phi = (2.0 * phi).Sin(); double sin4phi = (4.0 * phi).Sin(); double sin6phi = (6.0 * phi).Sin(); double sin8phi = (8.0 * phi).Sin(); // arc lenght of the meridan double B = c1 * (phi + c2 * sin2phi + c3 * sin4phi + c4 * sin6phi + c5 * sin8phi); //% second nummerical eccentrencity double e2q = ellipsoid.E2Q; // cos(phi) to powers double cosphiTo2 = cosphi * cosphi; double cosphiTo3 = cosphiTo2 * cosphi; double cosphiTo4 = cosphiTo3 * cosphi; double cosphiTo5 = cosphiTo4 * cosphi; double cosphiTo6 = cosphiTo5 * cosphi; double cosphiTo7 = cosphiTo6 * cosphi; double cosphiTo8 = cosphiTo7 * cosphi; //% auxilary quantity 1 double nuTo2 = e2q * cosphiTo2; //%radius of the curvature in prime vertical double N = (a * a) / (b * (1.0 + nuTo2).Sqrt()); // lambda to powers double lamTo2 = lam * lam; double lamTo3 = lamTo2 * lam; double lamTo4 = lamTo3 * lam; double lamTo5 = lamTo4 * lam; double lamTo6 = lamTo5 * lam; double lamTo7 = lamTo6 * lam; double lamTo8 = lamTo7 * lam; //% auxilary quantity 2 double t = phi.Tan(); // t to powers double tTo2 = t * t; double tTo4 = tTo2 * tTo2; double tTo6 = tTo2 * tTo4; // nu^2 to powers double nuTo4 = nuTo2 * nuTo2; //double nuqTo22 = nuq.Pow(22); //% x-coord: breite double x1 = t / 2.0 * N * cosphiTo2 * lamTo2; double x2 = t / 24.0 * N * cosphiTo4 * (5.0 - tTo2 + 9.0 * nuTo2 + 4.0 * nuTo4) * lamTo4; double x3 = t / 720.0 * N * cosphiTo6 * (61.0 - 58.0 * tTo2 + tTo4 + 270.0 * nuTo2 - 330.0 * tTo2 * nuTo4) * lamTo6; double x4 = t / 403204.0 * N * cosphiTo8 * (1385.0 - 3111.0 * tTo2 + 543.0 * tTo4 - tTo6) * lamTo8; double nX = B + x1 + x2 + x3 + x4; nX = nX - 5000000; // <-- im model // y-coord: laenge double y1 = N * cosphi * lam; double y2 = N / 6.0 * cosphiTo3 * (1.0 - tTo2 + nuTo2) * lamTo3; double y3 = N / 120.0 * cosphiTo5 * (5.0 - 18.0 * tTo2 + tTo4 + 14 * nuTo2 - 58.0 * tTo2 * nuTo2) * lamTo5; double y4 = N / 5040.0 * cosphiTo7 * (61.0 - 479.0 * tTo2 + 179.0 * tTo4 - tTo6) * lamTo7; double nY = y1 + y2 + y3 + y4; //%nY = nY + 500000+L0/3*1000000; %<-- potsdam datum return(new V3d(nY, nX, lonLatHeight.Z)); //<-- Laenge, Breite, Hoehe }
public static Trafo3d RotationZInDegrees(double angleInDegrees) { return(RotationZ(Conversion.RadiansFromDegrees(angleInDegrees))); }
public static Trafo3d RotationInDegrees(V3d axis, double angleInDegrees) { return(Rotation(axis, Conversion.RadiansFromDegrees(angleInDegrees))); }
public static Trafo3d RotationYInDegrees(double angleInDegrees) => RotationY(Conversion.RadiansFromDegrees(angleInDegrees));