Skip to content

Instantly share code, notes, and snippets.

@josejuan
Created June 22, 2012 23:07
Show Gist options
  • Save josejuan/2975705 to your computer and use it in GitHub Desktop.
Save josejuan/2975705 to your computer and use it in GitHub Desktop.
dígito en matriz caracol
// Tomandos los cuadros del más exterior al interior x = 1, 2, 3, ... su perímetro
Func<int, int, int> perimeter = ( x, n ) => 4 * ( n - 2 * x + 1 );
// Dada las coordenadas de la diagonal principal (1, 1), (2, 2), ... devuelve el número que contiene
Func<int, int, int> diagonalPos = ( x, n ) => -4 * x * x + ( 4 * n + 8 ) * x - 4 * n - 3;
// Dado un número, indica en qué cuadro está
Func<int, int, int> inSquare = ( z, n ) => (int) Math.Floor(n * 0.5 - 0.5 * Math.Sqrt(n * n - z + 1.0) + 1.0);
// Dígito en la matriz caracol dada una posición:
Func<int, int, Point> coords = ( z, n ) => {
var s = inSquare(z, n);
var l = perimeter(s, n) / 4; // lado del subcuadro -1
var l2 = l + l;
var l3 = l2 + l;
var d = diagonalPos(s, n);
if( z <= d + l ) return new Point(s + z - d, s);
if( z <= d + l2 ) return new Point(s + l, s + z - d - l);
if( z <= d + l3 ) return new Point(s + d + l3 - z, s + l);
return new Point(s, s + d + l2 + l2 - z);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment