Example #1
0
        /// <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);
        }
Example #2
0
        /// <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);
                }
            }
        }
Example #3
0
        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();
        }
Example #4
0
        /// <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
        }
Example #5
0
 public static Trafo3d RotationZInDegrees(double angleInDegrees)
 {
     return(RotationZ(Conversion.RadiansFromDegrees(angleInDegrees)));
 }
Example #6
0
 public static Trafo3d RotationInDegrees(V3d axis, double angleInDegrees)
 {
     return(Rotation(axis, Conversion.RadiansFromDegrees(angleInDegrees)));
 }
Example #7
0
 public static Trafo3d RotationYInDegrees(double angleInDegrees)
 => RotationY(Conversion.RadiansFromDegrees(angleInDegrees));