public void SouthEast_2()
        {
            man = GetMan(2);
            Assert.AreEqual(18, man.SouthEast(Center(8)));
            Assert.AreEqual(32, man.SouthEast(Center(18)));
            Assert.AreEqual(47, man.SouthEast(Center(32)));

            Assert.AreEqual(63, man.SouthEast(Center(47)));

            Assert.AreEqual(78, man.SouthEast(Center(63)));
            Assert.AreEqual(79, man.SouthEast(Center(64)));

            Assert.AreEqual(111, man.SouthEast(Center(96)));
        }
        public void NorthEast_0()
        {
            man = GetMan(0);
            Assert.AreEqual(3, man.NorthEast(Center(0)));
            Assert.AreEqual(0, man.NorthEast(Center(1)));
            Assert.AreEqual(0, man.NorthEast(Center(4)));
            Assert.AreEqual(1, man.NorthEast(Center(5)));
            Assert.AreEqual(2, man.NorthEast(Center(6)));
            Assert.AreEqual(3, man.NorthEast(Center(7)));

            Assert.AreEqual(7, man.NorthEast(Center(8)));
            Assert.AreEqual(4, man.NorthEast(Center(9)));
            Assert.AreEqual(5, man.NorthEast(Center(10)));
            Assert.AreEqual(6, man.NorthEast(Center(11)));
        }
        public void NorthEast_2()
        {
            man = GetMan(2);
            Assert.AreEqual(11, man.NorthEast(Center(4)));
            Assert.AreEqual(0, man.NorthEast(Center(5)));

            Assert.AreEqual(23, man.NorthEast(Center(12)));
            Assert.AreEqual(4, man.NorthEast(Center(13)));
            Assert.AreEqual(5, man.NorthEast(Center(14)));
            Assert.AreEqual(14, man.NorthEast(Center(15)));
            Assert.AreEqual(6, man.NorthEast(Center(16)));

            Assert.AreEqual(4, Center(25).Ring);
            Assert.AreEqual(39, man.NorthEast(Center(24)));
            Assert.AreEqual(12, man.NorthEast(Center(25)));
            Assert.AreEqual(13, man.NorthEast(Center(26)));
            Assert.AreEqual(14, man.NorthEast(Center(27)));
            Assert.AreEqual(27, man.NorthEast(Center(28)));

            Assert.AreEqual(17, man.NorthEast(Center(31)));
            Assert.AreEqual(30, man.NorthEast(Center(46)));
            Assert.AreEqual(31, man.NorthEast(Center(47)));

            Assert.AreEqual(45, man.NorthEast(Center(62)));
            Assert.AreEqual(46, man.NorthEast(Center(63)));
            Assert.AreEqual(47, man.NorthEast(Center(64)));
            Assert.AreEqual(62, man.NorthEast(Center(78)));

            Assert.AreEqual(77, man.NorthEast(Center(94)));
            Assert.AreEqual(78, man.NorthEast(Center(95)));
            Assert.AreEqual(79, man.NorthEast(Center(96)));
            Assert.AreEqual(94, man.NorthEast(Center(110)));
            Assert.AreEqual(95, man.NorthEast(Center(111)));
            Assert.AreEqual(96, man.NorthEast(Center(112)));
            Assert.AreEqual(97, man.NorthEast(Center(113)));

            Assert.AreEqual(110, man.NorthEast(Center(127)));

            Assert.AreEqual(142, man.NorthEast(Center(159)));

            Assert.AreEqual(166, man.NorthEast(Center(179)));
            Assert.AreEqual(168, man.NorthEast(Center(180)));

            Assert.AreEqual(178, man.NorthEast(Center(187)));

            Assert.AreEqual(186, man.NorthEast(Center(191)));
        }
        public void MeanBoundary_0()
        {
            man = GetMan(0);
            Assert.AreEqual(
                24,
                Basin3.Oz.AngleTo(man.MeanBoundary(Center(0), Direction.Nw).Direction).Degrees,
                1);
            Assert.AreEqual(
                24,
                Basin3.Oz.AngleTo(man.MeanBoundary(Center(0), Direction.Ne).Direction).Degrees,
                1);
            var edge0_sw = man.MeanBoundary(Center(0), Direction.Sw).Direction;

            Assert.AreEqual(-.4, edge0_sw.X, .1);
            Assert.AreEqual(.8, edge0_sw.Y, .1);
            Assert.AreEqual(.4, edge0_sw.Z, .1);
        }
Example #5
0
        /// <returns>typeof Direction</returns>
        public int GetFromAndFillType(Direction to, Basin3 toBasin, HealpixManager man)
        {
            if (Ring == toBasin.Ring)
            {
                Type = to;
            }

            var vert = NeighborManager.GetVert(to);

            if (Ring == 1 && vert == NeighborVert.North ||
                Ring == man.RingsCount && vert == NeighborVert.South ||
                Type == to)
            {
                return((int)NeighborManager.GetOppositeHor(to));
            }
            return((int)NeighborManager.GetOpposite(to));
        }
        public void SouthEast_0()
        {
            man = GetMan(0);
            Assert.AreEqual(7, man.SouthEast(Center(0)));
            Assert.AreEqual(4, man.SouthEast(Center(1)));
            Assert.AreEqual(5, man.SouthEast(Center(2)));
            Assert.AreEqual(6, man.SouthEast(Center(3)));

            Assert.AreEqual(8, man.SouthEast(Center(4)));
            Assert.AreEqual(9, man.SouthEast(Center(5)));
            Assert.AreEqual(10, man.SouthEast(Center(6)));
            Assert.AreEqual(11, man.SouthEast(Center(7)));

            Assert.AreEqual(11, man.SouthEast(Center(8)));
            Assert.AreEqual(8, man.SouthEast(Center(9)));
            Assert.AreEqual(9, man.SouthEast(Center(10)));
            Assert.AreEqual(10, man.SouthEast(Center(11)));
        }
    ///neighbor: Neighbor/cenlist
    public override void InitializeAgent()
    {
        _String.Clear();
        Pos.Clear();
        cenList.Clear();

        eObj.SetAsDefualt();
        //ResetTargetPosition();

        var S = eObj.elements.Strings;

        foreach (var s in S)
        {
            if (s.CompareTag(agentType.ToString()))
            {
                _String.Add(s);
            }
        }
        SetPos();
        ///unbaked
        SetCenter();
        _neighborManager = GetComponentInParent <NeighborManager>();
        var neigh = _neighborManager.GetNeighbor();

        foreach (var n in neigh)
        {
            if (n.name != this.name)
            {
                Neighbor.Add(n);
            }
        }

        foreach (var n in Neighbor)
        {
            cenList.Add(n.center);
        }
        distanceRecord = prevDistance = Vector3.Distance(target.transform.position, center.transform.position);
        defColor       = center.GetComponent <MeshRenderer>().material.color;
    }
 public void GetHor()
 {
     Assert.AreEqual((int)NeighborHor.East, NeighborManager.GetHor(Direction.Ne));
     Assert.AreEqual((int)NeighborHor.West, NeighborManager.GetHor(Direction.Sw));
 }
 public void GetVert()
 {
     Assert.AreEqual(NeighborVert.North, NeighborManager.GetVert(Direction.Ne));
     Assert.AreEqual(NeighborVert.South, NeighborManager.GetVert(Direction.Sw));
 }
 public void SetUp()
 {
     man = GetMan(1);
 }
 public void SouthWest_2()
 {
     man = GetMan(2);
     Assert.AreEqual(80, man.SouthWest(Center(64)));
 }
Example #12
0
        protected override void CalcDeltasH()
        {
            foreach (var basin in PixMan.Pixels)
            {
                if (basin.HasWater()
                    //   && basin.P==62
                    )
                {
                    // -.5Pi .. 1.5Pi
                    var alphas = new double[4];
                    // Pi .. .5Pi
                    var gammas      = new double[4];
                    var lengths     = new double[4];
                    var normLengths = new double[4];
                    foreach (Direction to in Enum.GetValues(typeof(Direction)))
                    {
                        var toBasin     = basin.Neibors[to];
                        var deltaBeta   = (basin.Beta - toBasin.Beta).Value;
                        var deltaLambda = (basin.Lambda - toBasin.Lambda).Value
                                          * basin.BetaSin
                        ;     //*2;

                        var length = Math.Sqrt(deltaBeta * deltaBeta + deltaLambda * deltaLambda);
                        lengths[(int)to] = length;

                        //var asin = Math.Asin(deltaBeta / length);
                        //alphas[(int) to] = deltaLambda > 0 ? asin : Math.PI - asin;
                        gammas[(int)to] = Math.Atan(Math.Abs(deltaBeta / deltaLambda));
                    }

                    /*foreach (int to in Enum.GetValues(typeof(Direction)))
                     * {
                     *  lengths[to] = lengths.Max() - lengths[to];
                     * }*/
                    foreach (int to in Enum.GetValues(typeof(Direction)))
                    {
                        normLengths[to] = lengths[to] / lengths.Sum();
                    }

                    //todo exclude second calculaton of the same pair, set and look on basin.Volumes
                    foreach (Direction to in Enum.GetValues(typeof(Direction)))
                    {
                        var    toBasin = basin.Neibors[to];
                        double HtoVer;

                        var hor    = NeighborManager.GetHor(to);
                        var HtoHor = basin.Hto[2 + hor] - toBasin.Hto[2 + 1 - hor];
                        //(basin.hOQ - toBasin.hOQ) //not r because of bottom relief  * 1; //hack
                        if (Math.Abs(HtoHor) > 10)
                        {
                        }

                        var vert = NeighborManager.GetVert(to);
                        if (basin.Ring == 1 && vert == NeighborVert.North ||
                            basin.Ring == HealpixManager.RingsCount && vert == NeighborVert.South ||
                            basin.Type == to)
                        {
                            basin.froms[(int)to] = (int)NeighborManager.GetOppositeHor(to);
                            HtoVer = 0;
                        }
                        else
                        {
                            var from = NeighborManager.GetOpposite(to);
                            basin.froms[(int)to] = (int)from;
                            HtoVer = basin.Hto[(int)vert] -
                                     toBasin.Hto[1 - (int)vert];

                            //if (basin.Type == from && HtoVer < 0) HtoVer = -HtoVer * .5;//hack
                        }

                        var deltaHfull = Math.Sin(gammas[(int)to]) * HtoVer + Math.Cos(gammas[(int)to]) * HtoHor;
                        basin.deltasH[(int)to] = deltaHfull * normLengths[(int)to];
                        if (Math.Abs(basin.deltasH[(int)to]) > 100 ||
                            basin.P == 17)
                        {
                        }
                    }
                }
            }
        }
Example #13
0
        public BasinDataDotProduct(HealpixManager man, bool withRelief = false, bool spheric = false,
                                   double?min = null, double?max = null)
            : base(man, null, min, max)
        {
            _withRelief  = withRelief;
            _spheric     = spheric;
            ColorsMiddle = 0;

            foreach (var basin in PixMan.Pixels)
            {
                RecalcDelta_g(basin);

                // 0 .. almost Pi/2
                //Gammas = new double[4];

                var alphas = new double[4];

                var bisectors = new Point3D[4];
                var lengths   = new double[4];
                //!var surface = basin.Surface;
                var xyPlane = new Plane(basin.Q3, new UnitVector3D(0, 0, basin.Vartheta > 0 ? 1 : -1));
                //!var xAxis = xyPlane.IntersectionWith(surface);
                foreach (Direction to in Enum.GetValues(typeof(Direction)))
                {
                    var toBasin = PixMan.Pixels[man.Neibors.Get(to, basin)];
                    basin.Neibors[to] = toBasin;

                    basin.froms[(int)to] = basin.GetFromAndFillType(to, toBasin, HealpixManager);

                    basin.MeanEdges[(int)to] = man.Neibors.MeanBoundary(basin, to);

                    basin.InitialHto[(int)to] = basin.Metric(toBasin, (int)to);

                    //!var otherQprojection = toBasin.Q3.ProjectOn(surface);//TraverseCalm);
                    //var dx = toBasin.Qb.X * Math.Sin(basin.Lambda.Value - toBasin.Lambda.Value);
                    //var dy = new Line3D(toBasin.Q3, otherQprojection).Length;
                    //lengths[(int)to] = Math.Sqrt(dx * dx + dy * dy);
                    //basin.Gammas[(int)to] = Math.Asin(dy / lengths[(int)to]);

                    /*!var Q_otherProjection = new Line3D(basin.Q3, otherQprojection);
                     * lengths[(int) to] = Q_otherProjection.Length;
                     *
                     * var thirdPoint = new Ray3D(basin.Q3, surface.Normal).LineTo(toBasin.Q3).StartPoint;
                     * var anglePlane = new Plane(basin.Q3, thirdPoint, toBasin.Q3);
                     * var lineQ3s = new Line3D(basin.Q3, toBasin.Q3);
                     * bisectors[(int) to] = Point3D.MidPoint(toBasin.Q3, thirdPoint);*/

                    //var xAxis = surface.Normal.Rotate(new UnitVector3D(0, 0, 1), 90, AngleUnit.Degrees);

                    //!alphas[(int) to] = xAxis.Direction.SignedAngleTo(Q_otherProjection.Direction, surface.Normal).Radians;

                    /*телесный угол, calc Cos by DotProduct
                     * alphas[(int)to] = surface.Normal.SignedAngleTo(lineQ3s.Direction,
                     *  anglePlane.Normal//surface.Normal.Orthogonal
                     *  ).Radians;//*/
                }
                foreach (Direction to in Enum.GetValues(typeof(Direction)))
                {
                    basin.NormLengths[(int)to] = lengths[(int)to] / lengths.Sum();
                    var deltaAngle = (alphas[(int)to] - alphas[(int)NeighborManager.GetOpposite(to)]);
                    var koef       = Math.Cos(1 * (Math.Abs(deltaAngle) - Math.PI));
                    //koef = Math.Sin(.5 * (alphas[(int)to] - alphas[(int)NeighborManager.GetOpposite(to)]));
                    //koef = Math.Sin(1 * (alphas[(int)to]));
                    //koef = Math.Tan(alphas[(int)to] - Math.PI/2);
                    basin.Koef[(int)to] = Math.Abs(Math.Pow(koef, 1));
                }
                // !basin.SpecNormal = new Line3D(basin.Q3, Point3D.Centroid(bisectors).MirrorAbout(surface)).Direction;

                if (_withRelief)
                {
                    int waterHeight;
                    var hOQ = GetHeights(basin, (int)basin.rOfEllipse, out waterHeight);
                    basin.hOQ = hOQ;
                    if (waterHeight > 0)
                    {
                        basin.Depth = waterHeight - hOQ;
                    }
                    else
                    {
                        basin.Depth = -hOQ;
                    }
                }
            }

            foreach (var basin in PixMan.Pixels)
            {
                foreach (Direction to in Enum.GetValues(typeof(Direction)))
                {
                    var toBasin = (BasinDotProduct)basin.Neibors[to];
                    basin.Koef2[(int)to] = basin.Koef[(int)to] * toBasin.Koef[(int)NeighborManager.GetOpposite(to)];
                }
            }
        }