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); }
/// <returns>P, from 0</returns> private int North(HealCoor basin, NeighborHor hor) { int newRing, newPixelInRing; return(North(basin, hor, out newRing, out newPixelInRing)); }