Ejemplo n.º 1
0
        private int North(HealCoor basin, NeighborHor hor, out int newRing, out int newPixelInRing)
        {
            newRing = basin.Ring - 1;
            var ringFirstP = basin.P - basin.PixelInRing + 1;
            var eastIndex  = hor == NeighborHor.East ? 1 : 0;
            int newP;

            switch (basin.NorthCap)
            {
            case true:
                if ((basin.PixelInRing - eastIndex) % basin.Ring == 0)
                {
                    newRing++;
                    newP = hor == NeighborHor.East ? basin.EastInRing : basin.WestInRing;
                }
                else
                {
                    newP        = basin.P;
                    ringFirstP -= basin.PixelsCountInRing - 4;
                    newP       -= basin.PixelsCountInRing - 4
                                  + eastIndex + (basin.PixelInRing - 1) / basin.Ring;
                }
                break;

            case false:
                newP = basin.P;
                // border between equator and south cap
                if (basin.Ring == 3 * _healpixManager.Nside)
                {
                    ringFirstP -= basin.PixelsCountInRing;
                    newP       -= basin.PixelInRing == eastIndex ? 1 : basin.PixelsCountInRing + eastIndex;
                }
                else
                {
                    var ringFromPole = _healpixManager.RingsCount - basin.Ring + 1;

                    ringFirstP -= basin.PixelsCountInRing + 4;
                    newP       -= basin.PixelsCountInRing + 4
                                  + (eastIndex == 1 ? 0 : -1) - (basin.PixelInRing - 1) / ringFromPole;
                }
                break;

            default:
                ringFirstP -= basin.PixelsCountInRing;

                // exact equator
                if (basin.Ring % 2 == 0 && _healpixManager.K > 0)
                {
                    newP = hor == NeighborHor.East ? basin.EastInRing : basin.P;
                }
                else
                {
                    newP = hor == NeighborHor.East ? basin.P : basin.WestInRing;
                }

                newP -= basin.PixelsCountInRing;     // PixelsCountInRing on equator and first polar cap the same
                break;
            }

            newPixelInRing = newP - ringFirstP + 1;
            return(newP);
        }
Ejemplo n.º 2
0
        /// <returns>P, from 0</returns>
        private int North(HealCoor basin, NeighborHor hor)
        {
            int newRing, newPixelInRing;

            return(North(basin, hor, out newRing, out newPixelInRing));
        }