Matemática de
bloques
Author:
lrcvs / Xkrouhn
01.06.2015
Agradecimientos:
A los amigos de: http://www.freebasic.net/forum
En orden alfabético:dodicatfxmRichard
Por el interés y desarrollo del programa con FreeBasic.
La matemática de bloques es un juego de niños
Como vemos en la figura, los bloques, se componen de elementos, que son la unidad de trabajo con los bloques.
1 elemento = 1 unidad
Con los elementos, podemos crear filas o columnas.
La fila, es un conjunto de elementos agrupados horizontalmente.
La columna, es un conjunto de elementos agrupados verticalmente.
Agrupando filas o columnas, formamos superficies o niveles.
Si unimos varios niveles, obtenemos un bloque.
Las Dimensiones
Algunas películas de ciencia ficción con temática espacial, casi siempresuelen decir que esta en una u otra dimensión
Definamos las dimensiones 1D, 2D, 3D, 4D, 5D y 6D....
1D: esta formada por filas O columnas de elementos.
2D: esta formada por filas Y columnas de elementos.
3D: esta formada por filas Y columnas, agrupados en niveles o capas.
4D: esta formado por varios bloques 3D, agrupados en filas.
5D: esta formado por varios bloques 3D, agrupados en filas Y columnas.
6D: esta formado por varios bloques 3D, agrupados en filas Y columnasY niveles.
Uniendo bloques sucesivamente formaríamos 7D, 8D, 9d, etc, etc..
Estas tres figuras son equivalentes, todas tienen 27 elementos. Las podemos transformar de varias formas (dimensiones, bloques, 1D, 2D, 3D...) distintas, pero siguen teniendo los mismos elementos, pues son
todas equivalentes, mantienen el mismo numero de elementos.
Los conceptos
En este trabajo, las posiciones de los elementos, filas, columnas y niveles, los contaremos del siguiente modo:
Filas, Columnas, Niveles y Bloques o Dimensiones
1 = Filas, siempre de arriba a bajo.2 = Columnas, siempre de izquierda a derecha3 = Niveles, siempre de arriba abajo.4 = Bloques o dimensiones, de izquierda a derecha y de arriba a bajo.
Una observación muy importante:
“El numero de filas <= al numero de columnas.”
Si fuese de otra forma, estos cálculos serian erróneos
Calculo de las posiciones
Datos a conocer:
Los datos del bloque unidad:
FU = Numero de filas del bloque unidadCU = Numero de columnas del bloque unidadNU = Numero de niveles del bloque unidadBU = Numero de bloques iguales al bloque unidad
Los datos de la posicion del elemento a buscar:
PF = Posicion filaPC = Posicion ColumnaPN = Posicion Nivel PB = Numero de Bloque
Formula general para calcular la posicion del elemento a buscar =
((PF - 1) * CU) + PC + ((FU * CU * (PN - 1))) + ((FU * CU * NU) * (PB - 1))
Esta formula, es el resultado de unir los distintos niveles de calculo de la posicion de un elemento, dependiendo de la disposición de los bloques unidad.
2D
Usando la formula general podemos calcular la posicion de un elemento en una tabla o nivel 2D
Datos del bloque unidad del ejemplo:FU = 5 CU = 6 NU = 1 BU = 1 Elementos = 5 * 6 * 1 * 1 = 30
Datos del elemento a buscar:PF = 4 PC = 5 PN = 1 PB = 1
Posicion del elemento = ((PF - 1) * CU) + PC + ((FU * CU * (PN - 1))) + ((FU * CU * NU) * (PB – 1))
((4 – 1) * 6) + 5 + ((5 * 6 * (1 – 1))) + ((5 * 6 * 1) * (1 – 1)) = 23
Tambien podemos calcular del siguiente modo:
Posicion 2D = ((PF - 1) * CU) + PC
Sustituyendo las variables por sus valores, obtenemos igualmente la posicion en un sistema 2D:
((4 – 1) * 6) + 5 = 23
3D
Usando la formula general podemos calcular la posicion de un elemento en una tabla o nivel 3D
Datos del bloque unidad del ejemplo:FU = 3 CU = 3 NU = 3 BU = 1 Elementos = 3 * 3 * 3 * 1 = 27
Datos del elemento a buscar:PF = 3 PC = 3 PN = 3 PB = 1
Posicion del elemento = ((PF - 1) * CU) + PC + ((FU * CU * (PN - 1))) + ((FU * CU * NU) * (PB – 1))
((3 – 1) * 3) + 3 + ((3 * 3 * (3 – 1))) + ((3 * 3 * 3) * (1 – 1)) = 27
Tambien podemos calcular la posicion del siguiente modo:
Posicion 3D = ((PF - 1) * CU) + PC + ((FU * CU * (PN - 1)))
Sustituyendo las variables por sus valores, obtenemos igualmente la posicion en un sistema 3D:
((3 – 1) * 3) + 3 + ((3 * 3 * (3 – 1))) = 27
4D
Usando la formula general podemos calcular la posicion de un elemento en una tabla o nivel 4D
Datos del bloque unidad del ejemplo:FU = 3 CU = 3 NU = 3 BU = 3 Elementos = 3 * 3 * 3 * 3 = 81
Datos del elemento a buscar:PF = 2 PC = 2 PN = 2 PB = 3
Posicion del elemento = ((PF - 1) * CU) + PC + ((FU * CU * (PN - 1))) + ((FU * CU * NU) * (PB – 1))
((2 – 1) * 3) + 2 + ((3 * 3 * (2 – 1))) + ((3 * 3 * 3) * (3 – 1)) = 68
A partir de 3D, siempre usaremos formula general, simplemente deberemos conocer el numero de bloques que tenemos en el sistema.
5D
Datos del bloque unidad del ejemplo:FU = 3 CU = 3 NU = 3 BU = 9 Elementos = 3 * 3 * 3 * 9 = 243
Datos del elemento a buscar:PF = 1 PC = 1 PN = 1 PB = 9
Posicion del elemento = ((PF - 1) * CU) + PC + ((FU * CU * (PN - 1))) + ((FU * CU * NU) * (PB – 1))
((1 – 1) * 3) + 1 + ((3 * 3 * (1 – 1))) + ((3 * 3 * 3) * (9 – 1)) = 217
6D
Datos del bloque unidad del ejemplo:FU = 3 CU = 3 NU = 3 BU = 27 Elementos = 3 * 3 * 3 * 9 = 729
Datos del elemento a buscar:PF = 3 PC = 3 PN = 2 PB = 27
Posicion del elemento = ((PF - 1) * CU) + PC + ((FU * CU * (PN - 1))) + ((FU * CU * NU) * (PB – 1))
((3 – 1) * 3) + 3 + ((3 * 3 * (2 – 1))) + ((3 * 3 * 3) * (27 – 1)) = 720
Dando la vuelta al problema
En este capitulo, le damos la vuelta al problema, conocemos la composición (filas, columnas, niveles) del bloque unidad y la posición del elemento.
Ahora buscaremos la fila, la columna, nivel y bloque donde se encuentra el elemento indicado.
Usare psudocodigos para calcular cada etapa del proceso, al final de todos los procesos, hay un programa en Basic, que reúne las distintas etapas, para calcular la fila del elemento que buscamos.
Si no realizamos las distintas etapas secuencialmente, no podemos calcular los datos parciales.
El usar pseudocodigos, es por que son muy simples y cada persona lospuede interpretar a su modo, lo mas simple posible.
Estos procesos son generales, sirven para todos los casos.
Usaremos este ejemplo mas complejo:
Datos que necesitamos de este ejemplo:
F = Numero de filas del bloque unidad = 3C = Numero de columnas del bloque unidad = 3N = Numero de niveles del bloque unidad = 3B = Numero de bloque a buscarP = Posicion del elemento a buscar = 683
INT = Parte entera Mod = Resto división
El BLOQUE
Aquí calculamos el bloque donde se encuentra el elemento a buscar.
Descartamos calcular en 1D, por obiedad.
En 2D, el nivel es = 1.
CALCULAR_BLOQUE
F=3 C=3 N=3P=683Si P MOD (F*C*N) <> 0 Entonces
B=INT(P/(F*C*N))+1Sino
B=INT(P/(F*C*N))Fin SiEscribir "BLOQUE = ",BFin
BLOQUE = 26
Comentario:Por sentido común, si la posicion del elemento a buscar, la dividimos entre los elementos del bloque unidad (F * C * N) , obtendremos los bloques unidad que contiene el elemento a buscar o dicho de otro modo la posicion donde se encuentra el elemento a buscar.
Observamos que si el resto es “0”, significa que la posiciona buscar, esta en el ultimo elemento de un bloque.
En caso contrario, se encuentra en cualquier posicion de otro bloque o del bloque unidad (el primero), por eso al cociente le sumamos un “1”.
El NIVEL
CALCULAR NIVELF=3C=3N=3B=26P=683Nivel=INT(P/(F*C))+1Si P MOD (F*C) = 0 Entonces
Nivel = Nivel -1Sino
Nivel = NivelFin SiK = Nivel-((B-1)*N)Escribir "NIVEL = ", KFin
NIVEL = 1
Comentario:Un nivel, esta formado por filas y columnas = F * C = Nivel.Si dividimos la posicion que estamos, entre el numero de elementos de un nivel, “P/(F*C)”, obtendremos en que nivel nos encontramos, ahora bien, este calculo, seria como si nuestro ejemplo fuese un bloque de 3 F* 3C * 81N, si al total de niveles de nuestro sistema, le restamos el nivel donde nos encontramos, “Nivel – ((B-1) * N)”, obtendremos el nivel de un solo bloque.
La columna
CALCULAR COLUMNAC=3P=683Si P<C Entonces
CO=PSino
CO=P MOD CFin SiSi P MOD C = 0 Entonces
CO=CSino
CO=COFin SiEscribir "COLUMNA = ",CO
Fin
COLUMNA = 2
Comentario:Vemos que si la posicion a buscar, es menor que el numero de columnas del bloque unidad, la posicion de la columna a buscar, es igual a la posicion donde estamos.
Si P<C entonces CO = P
El resto del proceso es igual al del nivel.
La Fila
CALCULAR FILAF=3C=3N=3B=26P=683Nivel=INT(P/(F*C))+1Si P MOD (F*C) = 0 Entonces
Nivel = Nivel -1Sino
Nivel = NivelFin Si
N=Nivel <<< ver comentario sobre el nivel
F=INT(((P-CO-((F*C)*(N-1)))/C)+1) <<< Formula para calcular la fila
Escribir "FILA = ",F
FILA = 3
Tras esta secuencia de calculo, obtenemos todos los datos, el elementoa buscar se encuentra en:
BLOQUE = 26NIVEL = 1COLUMNA = 2FILA = 3
Epilogo
Sigues pensando que la matemática de bloques es un juego de niños?
Que aplicaciones encuentras a estas formulas?
Posibles aplicaciones:Informática, Robótica, Almacenamiento 3D Automatizado, Criptografía, Gráficos 3D con números enteros.
En informática, se demuestra que todo Vector/Dim 2D, 3D, 4D..., se puede transformar en un Vector/Dim 1D.
En almacenamiento 3D, sabiendo el numero de filas, columnas y nivelesdel almacén, simplemente es necesario indicar la posición y el programa la descompone en numero de fila, numero de columna y numero de nivel donde se encuentra el objeto a buscar.
Gráficos 3D, podemos indicar un punto 3D, mediante un valor, por ejemplo el punto 3*3*3, su posición es 27, después descomponemos y obtenemos X,Y,Z ( Fila, Columna, Nivel).
En criptografía como codificación de coordenadas, etc, etc.
Para mas información y ver el inicio de este trabajo en:
http://www.freebasic.net/forum/viewtopic.php?f=3&t=19820
Repositorio:
http://es.slideshare.net/ZkrouhnZyx/matematicas-con-bloques
Para escribir comentarios:
Dedicado a todas las personas que tienen curiosidad.
Programas en BasicPrograma para calcular la posicion del elemento a buscar.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
clsinput "Filas del bloque unidad = ";roinput "Columnas del bloque unidad = ";coinput "Niveles del bloque unidad = ";leprintinput "Posicion Fila = ";ainput "Posicion Columna = ";binput "Posicion Nivel = ";cinput "Numero de Bloque = ";d
P = ((a - 1) * co) + b + ((ro * co * (c - 1))) + ((ro * co * le) * (d-1))
print "Posicion = ";pend:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Programa para buscar la fila, columna, nivel y bloque donde se encuentra un elemento a buscar.
Datos necesarios:
Filas del bloque unidadColumnas del bloque unidadNiveles del bloque unidadPosicion a buscar
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
clsinput "Numero de filas del bloque unidad (filas <= columnas) = "; rinput "Numero de columnas del bloque unidad (columnas >= filas) = ";cinput "Numero de niveles del bloque unidad = ";linput "Posicion a buscar = ";ph = l
'calcular bloqueif p mod (r*c*l) <> 0 thend = int(p/(r*c*l))+1elsed = int(p/(r*c*l))end if
'calcular nivell = int(p/(r*c))+1if p mod (r*c) = 0 then l = l-1
'calcular columnaif p < c then co = pif p >= c then co = p mod cif p mod c = 0 then co = c
'calcular filaf = ((p-co-((r*c)*(l-1)))/c)+1':::::::::::::::::::::::::::::::::
printcolor 12print "blo = ";d;" fil = ";f; " col = ";co; " niv = ";l-((d-1)*h)end
Fin