2012-08-12 11 views
10

Sto provando a fare qualche programmazione OpenGL in haskell. Ma sono confuso dallo stato attuale delle biblioteche. OpenGL utilizza il pacchetto Tensor che definisce solo diversi tipi di vettore (ma non lo fa in modo generico). Non sembra fornire alcuna implementazione Matrix.Quale algebra lineare usare per OpenGL in Haskell?

Ci sono molti altri pacchetti per l'algebra lineare: tensor (notare il minuscolo T), Vec, hmatrix che sembrano essere più completo di Tensor.

Quello che sto cercando dovrebbe contenere almeno funzioni comuni utilizzate nella grafica 3d e 2d, avere prestazioni ragionevoli e dovrebbe essere compatibile con OpenGL ma suppongo che dovrò cambiare la libreria per quello.

+1

C'è anche [vect] (http://hackage.haskell.org/package/vect), che ha [Integrazione OpenGL] (http://hackage.haskell.org/package/vect-opengl) built-in . –

+1

** vect ** sembra utilizzabile. Ma penso che sia lontana dall'essere una bella (generica) libreria haskell. In realtà sembra molto simile a [Java VecMath] (http://java.net/projects/vecmath/) in cui ogni algoritmo è dichiarato per ogni tipo di vettore. – fho

+0

Penso che dovresti scrivere il tuo. Essere in grado di criticare altre implementazioni significa che sei pronto per questo. Una volta mi trovavo in una situazione simile e mi ero trattenuto per un lungo periodo, ma alla fine era il momento che valeva la pena spendere. – user1095108

risposta

2

risposta tardiva, mi spiace. HMatrix è la scelta standard per cose come questa. È molto compatibile, ha una buona API ed è attualmente utilizzato per la visione del computer tra le altre applicazioni: http://dis.um.es/profesores/alberto/research.html

+1

Sfortunatamente, hmatrix funziona solo su vettori/matrici di cose che sono 'Storable', alias" hanno una rappresentazione C ". Se si desidera utilizzare altri tipi di dati personali o propri, è necessario scrivere autonomamente un'istanza 'Storable', che implica la programmazione a puntatore di basso livello (o l'utilizzo di [generico-memorizzabile] (http://hackage.haskell.org/package/generic-memorizzabili)). Altri pacchetti non hanno questa restrizione e potrebbero funzionare ad es. tutto con un'istanza 'Num'. Se hai solo bisogno di numeri standard, hmatrix potrebbe essere il migliore (e probabilmente molto più veloce con le operazioni implementate in C) alternative. – nh2

+1

hmatrix sembra anche essere vincolato dalla licenza GPL, che potrebbe rappresentare un problema. – sdasdadas

1

Mi stavo chiedendo lo stesso di recente, ed ero particolarmente irritato dal fatto che Tensor non ti fornisca funzioni utili per il prodotto puntino, croce del prodotto, la normalizzazione ecc

come lei ha sottolineato, vect è "hardcoded" per Float e Double, e non therfore può avere istanze typeclass utili come Functor, Monoid o Applicative - con quelli che otterrebbe un sacco di operazioni "per libero ", ad es Inoltre: (+) <$> v1 <*> v2.

Su #haskell, sono stato indirizzato al pacchetto linear. È ben tenuto e viene fornito con un sacco di istanze e funzioni utili.