Created
June 22, 2012 23:07
-
-
Save josejuan/2975705 to your computer and use it in GitHub Desktop.
dígito en matriz caracol
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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