예제 #1
0
 protected MeridianCoor GetSouthBasin(MeridianCoor basin)
 {
     if (basin.Ring == MaxRing)
     {
         return(_symmetricPoles ? PixMan.Pixels[MaxRing - 2] : null);
     }
     return(PixMan.Pixels[basin.Ring]);
 }
예제 #2
0
 /// <summary>
 /// PixMan.Pixels ordered asc
 /// PixMan.Pixels.Length often != HealpixManager.RingsCount and maybe PixMan.Pixels.Length == _maxRing
 /// </summary>
 protected new MeridianCoor GetNorthBasin(MeridianCoor basin)
 {
     if (basin.Ring == 1)
     {
         return(_symmetricPoles ? PixMan.Pixels[1] : null);
     }
     return(PixMan.Pixels[basin.Ring - 2]);
 }
예제 #3
0
        /// <summary>
        /// for meridian projection
        /// </summary>
        internal double Move(MeridianCoor basin, MeridianCoor toBasin, NeighborVert to)
        {
            var from = 1 - (int)to;

            return(toBasin == null
                ? 0
                : PutV(basin, toBasin,
                       (basin.Hto[(int)to] - toBasin.Hto[from]) / 2,
                       (int)to,
                       from));
        }
예제 #4
0
        protected MeridianCoor GetNorthBasin(MeridianCoor basin)
        {
            if (basin.Ring == 1)
            {
                return(null);
            }

            var northBasin = PixMan.Pixels.Length == HealpixManager.Npix
                ? PixMan.Pixels[HealpixManager.Neibors.NorthMean(basin)]
                : (from p in PixMan.Pixels
                   where p.Ring == basin.Ring - 1
                   select p).First();  /*slow*/

            if (northBasin.Ring == basin.Ring)
            {
                throw new ApplicationException("northBasin.Ring == basin.Ring");
            }
            return(northBasin);
        }
예제 #5
0
        private MeridianWater <MeridianCoor> GetData(
            bool fullMeridian     = false,
            bool excite           = false,
            BottomForm bottomForm = BottomForm.No)
        {
            var man = new HealpixManager(9); //2 is good too

            northBasin = man.GetCenter <MeridianCoor>(0);
            basin      = man.GetCenter <MeridianCoor>(4);
            southBasin = man.GetCenter <MeridianCoor>(12);
            var pix = fullMeridian
                      // -.=.=.-
                ? new[] { northBasin, basin, southBasin }
            // -.=.-
                : new[] { northBasin, basin };

            var data = new MeridianWater <MeridianCoor>(man, pix, false);

            data.GradientAndHeightCrosses();
            if (excite)
            {
                //data.Water.Move()
                basin.hOQ = HeightExcitement;
                data.GradientAndHeightCrosses();
            }
            switch (bottomForm)
            {
            case BottomForm.Shallow:
                foreach (var t in pix)
                {
                    t.Depth = 0;
                }
                break;

            case BottomForm.InDepth:
                foreach (var t in pix)
                {
                    t.Depth = HeightExcitement;
                }
                break;

            case BottomForm.BasinExcited:
                foreach (var t in pix)
                {
                    t.Depth = t == basin
                            ? -HeightExcitement
                            : HeightExcitement;
                }
                break;

            case BottomForm.BasinInDepth:
                foreach (var t in pix)
                {
                    t.Depth = t == basin ? HeightExcitement : 0;
                }
                break;

            case BottomForm.ShallowSouth:
                foreach (var t in pix)
                {
                    t.Depth = t == southBasin ? 0 : HeightExcitement;
                }
                break;

            case BottomForm.NorthBasinInDepth:
                northBasin.Depth = HeightExcitement;
                basin.Depth      = -HeightExcitement;
                southBasin.Depth = 0;
                break;

            case BottomForm.ReliefLikeWater:
                foreach (var t in pix)
                {
                    t.Depth = (int)-t.hOQ;
                }
                break;
            }
            return(data);
        }
예제 #6
0
 public override double?GetAltitude(MeridianCoor basin)
 {
     return(basin.gHpure * 1000);
 }