2012-08-12 47 views
10

Estoy intentando hacer algo de programación OpenGL en haskell. Pero estoy confundido por el estado actual de las bibliotecas. OpenGL usa el paquete Tensor que solo define varios tipos de vectores (pero no lo hace de forma genérica). No parece proporcionar ninguna implementación de Matrix.¿Qué álgebra lineal usar para OpenGL en Haskell?

Hay varios otros paquetes de álgebra lineal: tensor (tenga en cuenta la minúscula T), Vec, hmatrix que parecen ser más completa que Tensor.

Lo que estoy buscando por lo menos debe contener funciones comunes utilizadas en gráficos 3d y 2d, tiene un rendimiento razonable y debe ser compatible con OpenGL, pero supongo que tendré que cambiar la biblioteca para eso.

+1

También hay [vect] (http://hackage.haskell.org/package/vect), que tiene incorporada [integración OpenGL] (http://hackage.haskell.org/package/vect-opengl) . –

+1

** vect ** parece utilizable. Pero creo que está lejos de ser una buena biblioteca (genérica) de Haskell. En realidad, se parece mucho a [Java VecMath] (http://java.net/projects/vecmath/) donde cada algoritmo se declara para cada tipo de vector. – fho

+0

Creo que deberías escribir el tuyo. Ser capaz de criticar otras implementaciones significa que estás listo para eso. Una vez estuve en una situación similar y me demoré mucho tiempo, pero al final ya era tiempo de que valiera la pena gastar. – user1095108

Respuesta

2

Última respuesta, lo siento. HMatrix es la opción estándar para cosas como esta. Es muy compatible, tiene una buena API, y se usa para visión artificial entre otras aplicaciones: http://dis.um.es/profesores/alberto/research.html

+1

Desafortunadamente, hmatrix solo funciona en vectores/matrices de cosas que son 'Almacenables', alias 'tienen una representación en C'. Si desea utilizar otro o sus propios tipos de datos allí, debe escribir usted mismo una instancia 'Almacenable', que involucra programación de puntero de bajo nivel (o usando [generic-storable] (http://hackage.haskell.org)/paquete/genérico-almacenable)). Otro paquete no tiene esta restricción y podría funcionar, p. todo con una instancia 'Num'. Sin embargo, si solo necesitas números estándar, hmatrix podría ser la mejor alternativa (y probablemente mucho más rápida con las operaciones implementadas en C). – nh2

+1

hmatrix también parece estar obligado por la licencia GPL, lo que puede suponer un problema. – sdasdadas

1

Me preguntaba lo mismo recientemente, y me molesta especialmente que Tensor no le proporcione las funciones convenientes para el producto de punto, producto vectorial, normalización, etc.

como usted ha señalado, vect es "codificado" para Float y Double y therfore no puede tener instancias clase de tipos útiles como Functor, Monoid o Applicative - con los que podría obtener una gran cantidad de operaciones "para gratis ", por ejemplo Además: (+) <$> v1 <*> v2.

En #haskell, me señalaron el paquete linear. Está bien mantenido y viene con un montón de instancias y funciones útiles.

Cuestiones relacionadas