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