lunes, 12 de diciembre de 2011

Simulando vida

Si quieres hacer algo medianamente gracioso con el ordenador, recomiendo implementar algún tipo de autómata celular.
Creo que puse un enlace de descarga de mi implementación del famoso Juego de la Vida de John Conway. Éste es uno de los primeros (y posiblemente el más famoso) de los autómatas celulares.
Su principal característica es que mediante unas reglas muy simples genera comportamientos muy complejos, que ni se te pasan de primeras por la cabeza.
Hasta tal punto, que se supone que su diseño permite implementar una máquina de Turing. ¿Quien dice que Matrix es ciencia ficción?

Hoy en día los AC se usan para muchas cosas: Simulación de tráfico, modelos de distribución de población.... hasta juegos! Y no juegos frikis que hace un tío en un sótano y no los conoce ni Dios. ¿Alguien ha oído hablar de SimCity? ¿Y de Los Sims?
Pues sí, su funcionamiento se basa en autómatas celulares.

Los autómatas celulares se pueden utilizar para modelar casi cualquier tipo de sistema dinámico (Eso sí, con algo de imaginación), por lo que son una buena solución a tener en cuenta.
Éste es un ejemplo:

Ésta imagen corresponde a mi implementación de un sistema de iluminación dinámico para juegos basados en tilemaps, el cual funciona gracias a un autómata celular. Para más información, consultar los foros de dx_lib32 en Stratos.

miércoles, 26 de octubre de 2011

Graham Scan y Quicksort

Seguramente, el principal frente de batalla del desarrollo de la informática hoy en día sean los videojuegos.

Como programadores (en potencia o no), a más de uno le haría ilusión crear su propio juego, y que la gente disfrutara con el.
En el desarrollo de un juego, es muy importante tener un amplio conocimiento sobre ciertas disciplinas, ya que independientemente del nivel de desarrollo que se quiera realizar (Diseñar un motor de juego o utilizar otro de terceros, por ejemplo) pueden ayudar enormemente a la optimización del programa.

Directamente relacionada con la informática gráfica está la geometría computacional, la cual estudia el desarrollo y optimización de algoritmos para la resolución de problemas geométricos.
Muchos de los cálculos tratados en la geometría computacional se basan total o parcialmente en algoritmos de ordenación.

Un ejemplo clásico es el cálculo de la envolvente convexa de un conjunto de puntos mediante el Algoritmo de Graham (http://es.wikipedia.org/wiki/M%C3%A9todo_de_Graham).


En el algoritmo de Graham, la mayoría de la carga computacional se la lleva el paso previo de ordenación. Por lo tanto, la eficiencia del algoritmo será directamente proporcional a la eficiencia del método de ordenación utilizado.
En mi caso Quicksort (http://es.wikipedia.org/wiki/Quicksort).

Ésta es una captura de mi implementación del Algoritmo de Graham, en concreto para el caso de un conjunto de 20.000 puntos:

Como indica el resultado, el tiempo total de cálculo ha sido 3140,0044 milisegundos y el tiempo de ordenación 3130,0043 milisegundos, es decir el 99.68%.

Prueba2 SyntaxHighLighter: VB.NET

El código mostrado en ésta prueba corresponde a una parte de mi biblioteca Motor3D, en concreto la rutina de cálculo de determinantes de la clase Matriz.

Public Shared Function Determinante(ByVal Matriz As Matriz) As Double
If Matriz.Filas = Matriz.Columnas Then
Dim Positivos, Negativos As Double

Select Case Matriz.Filas
Case 1
Return Matriz.ObtenerValor(0, 0)
Case 2
Positivos = Matriz.ObtenerValor(0, 0) * Matriz.ObtenerValor(1, 1)
Negativos = Matriz.ObtenerValor(0, 1) * Matriz.ObtenerValor(1, 0)

Return Positivos - Negativos
Case 3
Positivos = (Matriz.ObtenerValor(0, 0) * Matriz.ObtenerValor(1, 1) * Matriz.ObtenerValor(2, 2)) + _
(Matriz.ObtenerValor(0, 1) * Matriz.ObtenerValor(1, 2) * Matriz.ObtenerValor(2, 0)) + _
(Matriz.ObtenerValor(1, 0) * Matriz.ObtenerValor(2, 1) * Matriz.ObtenerValor(0, 2))

Negativos = (Matriz.ObtenerValor(0, 2) * Matriz.ObtenerValor(1, 1) * Matriz.ObtenerValor(2, 0)) + _
(Matriz.ObtenerValor(0, 1) * Matriz.ObtenerValor(1, 0) * Matriz.ObtenerValor(2, 2)) + _
(Matriz.ObtenerValor(1, 2) * Matriz.ObtenerValor(2, 1) * Matriz.ObtenerValor(0, 0))

Return Positivos - Negativos

Case Else
Dim Retorno As Double = 0
For i As Integer = 0 To Matriz.Filas - 1
Retorno += (Adjunto(Matriz, i, 0) * Matriz.ObtenerValor(i, 0))
Next

Return Retorno
End Select

Else
Throw New ExcepcionMatrizNoCuadrada("MATRIZ (DETERMINANTE): Solo se puede obtener el determinante de matrices cuadradas." & vbNewLine _
& "Dimensiones de la matriz: " & Matriz.Filas & "x" & Matriz.Columnas)
End If
End Function

Bastante bien, pero me quita la tabulación...Ya le encontraré solución.

Código fuente completo en http://www.mediafire.com/file/d4pdlvrym4tq2n1/Motor3D%202.0.rar

Prueba1 SyntaxHighlighter (EJEMPLO XML)

Nombre: Email:

MSDNAA

Microsoft Developers Network Academic Alliance.
Software de microsoft a disposición de los estudiantes de manera gratuita. Todo un chollo.
Access, Visual Studio Premium 2010,etc.

Ya es mala suerte, me compro el Windows 7 hace cosa de un mes y ahora lo tengo gratuito...

lunes, 24 de octubre de 2011

Bienvenidos al maravilloso mundo de los números reales

Efectivamente.
Una de las grandes preguntas que se ha hecho la humanidad es: ¿Pertenecemos al cuerpo de los números reales?...
Mmmmm.... quien me diria a mi que la filosofía servía para algo. Pues sí. Me va a ayudar a aprobar matemáticas.

Boing, boing, dirían algunos. Bueno.....el peloteo está de moda.
Intervalos, límites, fronteras..... mmmmaravilloso.

(QUE CONSTE QUE ME VA LA IRONÍA)

domingo, 23 de octubre de 2011

¿Por donde empezar?

OOP,.NET,GDI+,VB....

Muchas siglas, y mucho por donde empezar. Creo que voy a hacer un poco de campaña.
Sí, de ahí el nombre del blog. ¿Hay alguna manera de hacer entender a la gente que VB no es un lenguaje inutil?

No se yo, pero creo que si eso fuera cierto el gigante de Redmond no seguiría desarrollándolo. Véase por ejemplo el proyecto Roslyn, XNA, o el SDK de Kinect.
De hecho, desde la creación de .NET Framework, VB.NET va a la par de C# ( por favor, no quiero volver a oir lo de C almohadilla, no es culpa mía que en los teclados QUERTY no se incluyan símbolos musicales). Y según lo expuesto en la conferencia BUILD de éste año, parece que en el futuro seguirá igual.
Así que se acabaron esos rumores sobre la muerte de Visual Basic.

Algunos me saltarán al cuello recordándome el GOTO. Y dale con el GOTO... Para ser sincero, yo "nunca" he utilizado GOTO (Vale, vale. Alguna vez, pero solo test en debugging).

Y que no me digan que solo lo usamos cuatro mongólicos. Solo en españa, el 70% de los desarrolladores que trabajan con .NET Framework utilizan VB como único lenguaje. Según Microsoft, una de las bases de .NET es que la eleción del lenguaje se base únicamente en los gustos del programador, no en el rendimiento.
 ¿O hace falta que os recuerde que todas las funciones y bibliotecas son comunes para todos los lenguajes .NET? Todos compilan a MSIL (Ahora solamente IL). Eso nos permite hacer virguerías tales como traducir de VB a IronPhyton con solo pulsar un botón.

Es cierto que los ensamblados .NET funcionan unas siete veces más lentos que un ejecutable Win32, pero que queréis que os diga. Igual me pongo a reescribir todos mis programas en ensamblador para ver como vuelan....a es verdad, que no soy inmortal. Para cuando consiguiera una splash screen ya me habrían salido pelos con canas en los dedos de los pies....siento ser tan bruto (Otros dirían basto), pero es que éstas cosas me ponen enfermo.

¿Qué debemos tener como objetivo?: ¿Eficiencia o eficacia? Si quieres hacer el juego del siglo, vale, usa C++. Pero si vas a hacer una aplicación de gestión para el taller de tu tio, usa VB. Y seamos sinceros. ¿En que tipo de programas nos centraremos en nuestra vida laboral? Si llegamos a trabajar programando. Porque yo ya me veo medio majareta delante de una hoja de excel durante el resto de mi vida.
Cuando empecé las clases de C++ en la uni, el profesor dijo una frase que se me ha quedado grabada: "No reinventéis la rueda. Utilizad la herramienta más cómoda que tengáis a disposición".

No se vosotros, pero yo me quedo con la eficacia.