private static double GetHto(BasinDotProduct basin, NeighborVert direction)
        {
            Basin3 inter;

            /*if (basin.Type.HasValue && NeighborManager.GetVert(basin.Type.Value) == direction)
             * {
             *  var neibor = basin.Neibors[NeighborManager.GetOppositeHor(basin.Type.Value)];
             *  inter = neibor;
             * }
             * else*/
            {
                Basin3 east;
                Basin3 west;
                if (direction == NeighborVert.North)
                {
                    east = basin.Neibors[Direction.Ne];
                    west = basin.Neibors[Direction.Nw];
                }
                else
                {
                    east = basin.Neibors[Direction.Se];
                    west = basin.Neibors[Direction.Sw];
                }

                inter = new Basin3
                {
                };
                var lambda = (east.Lambda + west.Lambda).Value / 2;
                inter.Qb = new Point2D(.5 * (east.Qb.X + west.Qb.X)
                                       //correct projection
                                       * Math.Cos(basin.Lambda.Value - lambda),
                                       .5 * (east.Qb.Y + west.Qb.Y));
            }
            return(basin.Intersect(inter));
        }
Exemple #2
0
        private static void TestNeighbors(Basin3 basin)
        {
            // k6 2, k2 150, sphere .001
            var accuracy = .001;
            var ne       = basin.Neibors[Direction.Ne];
            var nw       = basin.Neibors[Direction.Nw];

            Assert.AreEqual(ne.Hto[1], basin.Hto[0], accuracy);
            if (ne.Ring == nw.Ring)
            {
                Assert.AreEqual(ne.Hto[1], nw.Hto[1]);
            }

            var sw = basin.Neibors[Direction.Sw];
            var se = basin.Neibors[Direction.Se];

            Assert.AreEqual(sw.Hto[0], basin.Hto[1], accuracy);
            Assert.AreEqual(sw.Hto[1], se.Hto[1]);

            if (basin.Hto[0] > basin.Hto[1])
            {
                Assert.IsTrue(basin.Beta - ne.Beta > sw.Beta - basin.Beta);
            }
            else
            {
                Assert.IsFalse(basin.Beta - ne.Beta > sw.Beta - basin.Beta);
            }

            Console.WriteLine(
                "Δβ {0:0.###}, ΔHto {1:0.###}",
                ////(basin.rOfEllipse + basin.Hto[0]) * Math.Sin((basin.Beta - ne.Beta).Value),
                ////(basin.rOfEllipse + basin.Hto[1]) * Math.Sin((se.Beta - basin.Beta).Value),
                (basin.Beta - ne.Beta) / (se.Beta - basin.Beta),
                basin.Hto[0] / basin.Hto[1]);
        }
 internal void RecalcDelta_g(Basin3 basin)
 {
     if (_spheric)
     {
         basin.InitROfEllipse(HealpixManager, Ellipsoid.MeanRadius);
         basin.Delta_g_meridian = basin.Delta_g_traverse = 0;
     }
 }
Exemple #4
0
        public void SetUp()
        {
            var man = new HealpixManager(2);

            basin0  = man.GetCenter <Basin3>(0);
            basin7  = man.GetCenter <Basin3>(7);
            basin31 = man.GetCenter <Basin3>(31);
            basin77 = man.GetCenter <Basin3>(77);
            basin95 = man.GetCenter <Basin3>(95);
        }
Exemple #5
0
        public static double CentrifugalByMatrix(Basin3 b, double a, Line3D axisOrtohonal, out double aTraverse, out double aVertical)
        {
            var aOnSurface = axisOrtohonal.Direction * b.Matrix;

            aTraverse = -a * aOnSurface[1];
            aVertical = Math.Abs(a * aOnSurface[0]);
            var aMerid = (b.Vartheta < 0 ? 1 : -1) * a * aOnSurface[2];

            b.Visual = aVertical;
            return(aMerid);
        }
        public double IntersectTraverse(Basin3 otherBasin)
        {
            var otherQtraverseProjection = otherBasin.Q3.ProjectOn(TraverseCalm);
            var Qt = otherQtraverseProjection.ToVector3D();

            Lambda_meridian = Qt.AngleTo(Q3.ToVector3D()).Radians;
            return(Triangles.SinusesTheorem(
                       Math.PI / 2 + Delta_g_traverse,
                       r,
                       Lambda_meridian)
                   -
                   //r;
                   otherBasin.r); //there's deformation
            //Qt.Length;
        }