Juan Antonio Chaves NaranjoOscar Noel Amaya García
Valentín Adolfo Acosta García
21/04/23UMA, Programación Declarativa Avanzada
Curso 08/09
1. Motivaciones2. Herramientas para su desarrollo3. Estructuras de datos para manejo de modelos
moleculares 3D4. Implementación Visor 3D molecular5. Comparación de código con visor similar en
lenguaje Imperativo (Tcl/Tk)6. Comparación rendimiento con visor similar en
lenguaje Imperativo (Tcl/Tk)7. Conclusiones8. Bibliografía
2/18
21/04/23UMA, Programación Declarativa Avanzada
Curso 08/09
Elección del tema respondiendo a la curiosidad del uso de OpenGL en un lenguaje funcional.
Comparativa de uso/rendimiento de OpenGL en Haskell y en un lenguaje imperativo. En este caso usamos Tcl/Tk (John Ousterhout, 1999).
A priori no buscamos un fin educativo.
3/18
21/04/23
Tcl/Tk Wrapper OpenGL Lenguaje Interpretado
4/18
21/04/23UMA, Programación Declarativa Avanzada
Curso 08/095/18
Haskell (U. Yale y U. Glasgow, 1990)◦ Lenguaje funcional
OpenGL (Silicon Graphics Inc. 1992)◦ API gráfica multiplataforma y multilenguaje para
la modelización 2D y 3D. Orientado a lenguajes imperativos.
Haskell y OpenGL: HOpenGL (1999)◦ La eclosión de las mónadas hace que programas
en Haskell se comporten como los programas imperativos y por tanto facilita la interacción entre Haskell y OpenGL.
21/04/23UMA, Programación Declarativa Avanzada
Curso 08/096/18
El estándar en representaciones moleculares son los ficheros “.mol”.
18 18 0 0 0 0 0 0 0 0 1 V2000 2.4333 -0.7208 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
......... 3.1454 0.2032 -0.8617 H 0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 0 0 0 0 .......18 6 1 0 0 0 0
Dichos datos son encapsulados dentro de una mónada IO para su posterior acceso en el visor 3D.
Nº de Átomos
Nº de Enlaces
Átomo de Carbono en la posición
definidaÁtomo de Hidrógeno en la posición definida
Define el enlace entre el átomo nº
18 y el 6
21/04/23UMA, Programación Declarativa Avanzada
Curso 08/097/18
-- leerMol :: (Num a, Num b, … , Num d) =>-- [Char] -> IO (d,a,[((f,g,e),[Char])],[(c,b)]))leerMol nombreFichero = docad <- readFile nombreFicheroreturn (leerMol2 cad)
leerMol2 cad = (nAtomos, nEnlaces, atomos, enlaces)where
(l1,r1) = leeLínea cad(l2,r2) = leeLínea r1(l3,r3) = leeLínea r2(l4,r4) = leeLínea r3(nAtomos,nEnlaces) = leeNAtomNEnl l4(atomos,r5) = leeAtomos nAtomos r4(enlaces,r6) = leeEnlaces nEnlaces r5
21/04/23UMA, Programación Declarativa Avanzada
Curso 08/098/18
21/04/23UMA, Programación Declarativa Avanzada
Curso 08/099/18
main = do
(progName,_) <- getArgsAndInitialize
initialDisplayMode $= [ RGBMode, WithDepthBuffer, DoubleBuffered ]
initialWindowSize $= Size 500 500
createWindow "Visor Haskell + OpenGL"
depthFunc $= Just Less
clearColor $= Color4 0.1 0.2 0.4 0
shadeModel $= Smooth
position (Light 0) $= Vertex4 1 1 1 0
lighting $= Enabled
light (Light 0) $= Enabled
depthFunc $= Just Less
frontFace $= CW
lighting $= Enabled
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize(500,500);
glClearColor(0.1,0.2,0.4,0);glShadeMode(GL_SMOOTH);
glEnable(GL_LIGHTING);
21/04/23UMA, Programación Declarativa Avanzada
Curso 08/0910/18
light (Light 0) $= Enabled autoNormal $= Enabled normalize $= Enabled depthFunc $= Just Less fontOffset <- makeRasterFont listName <- iniciarDisplayListMol "aspirina.mol" pPos <- new (90::Int,270::Int,2.0) keyboardMouseCallback $= Just (keyboard pPos) displayCallback $= display pPos listName fontOffset reshapeCallback $= Just reshape mainLoop
glutDisplayFunc(display);glutReshapeFunc(reshape);
21/04/23UMA, Programación Declarativa Avanzada
Curso 08/0911/18
iniciarDisplayListMol fichero = do [listName] <- genObjectNames 1 defineList listName Compile $ do
(nAt,nEnl,atom,enl) <- leerMol ficheropintaAtomos atompintaEnlaces atom enl
return listName
listName=glGenList(1);glNewList(listName, GL_COMPILE);
21/04/23UMA, Programación Declarativa Avanzada
Curso 08/0912/18
display pPos listName fontOffset = do loadIdentity setPointOfView pPos clear [ColorBuffer,DepthBuffer] translate (Vector3 0.0 0.5 0.0 :: Vector3 GLdouble)
rotate 90 (Vector3 1.0 0.0 0.0 :: Vector3 GLdouble)
callList listName swapBuffers
glLoadIdentity();glClearutReshapeFunc(reshape);
glTranslated(0.0,0.5,0.0);glRotated(1.0,0.0,0.0);
21/04/23UMA, Programación Declarativa Avanzada
Curso 08/0913/18
Imperativo VS Funcional
Iteradores – F. RecursivasWrapers OpenGL
Estructuras especiales
21/04/23UMA, Programación Declarativa Avanzada
Curso 08/0914/18
pintaEnlaces atom [] = do-- Posibles accionesreturn ()
pintaEnlaces atom ((id1,id2):xs) = dolet p1 = posAtomo id1 atomlet p2 = posAtomo id2 atom
let c = vectorSub p1 p2let long = vectorNorm clet ang = (vectorAngle (0,0,1) c) * 57.2957795131let (ex,ey,ez) = vectorCrossProduct (0,0,1) clet longSeg = long/2.0
let (tx,ty,tz) = vectorSum p1 (vectorScale 0.0 c)preservingMatrix $ do
translate (Vector3 tx ty tz :: Vector3 GLdouble)rotate ang (Vector3 ex ey ez)currentColor $= Color4 0 0 1 1materialAmbientAndDiffuse Front $= colorAtomo (simboloAtomo id1 atom)renderObject Solid (Cylinder' 0.07 longSeg 15 15)
ASIGNACIONES
ACCIONES SECUENCIALES
21/04/23UMA, Programación Declarativa Avanzada
Curso 08/0915/18
let (tx,ty,tz) = vectorSum p1 (vectorScale 0.5 c)
preservingMatrix $ do
translate (Vector3 tx ty tz :: Vector3 GLdouble)
rotate ang (Vector3 ex ey ez)
materialAmbientAndDiffuse Front $= colorAtomo (simboloAtomo id2 atom)
renderObject Solid (Cylinder' 0.07 longSeg 15 15)
pintaEnlaces atom xs
return ()
LLAMADA RECURSIVA
21/04/23UMA, Programación Declarativa Avanzada
Curso 08/0916/18
Lenguaje Imperativo Interpretado Vs
Lenguaje Funcional + Mónadas compilado
¿Qué pensáis?
21/04/23UMA, Programación Declarativa Avanzada
Curso 08/0917/18
Amplia nuestros conocimiento de Haskell, que es uno de los objetivos de esta asignatura.
No nos resulta muy útil en comparación con los lenguajes imperativos:◦ Bajo rendimiento◦ Pocas ventajas en la programación◦ No parece ser el lenguaje de programación más
adecuado para el modelado 3D, como así lo demuestra el mercado.
21/04/23UMA, Programación Declarativa Avanzada
Curso 08/0918/18
Material y documentación◦ http://www.haskell.org/haskellwiki/Opengl/ (2009)
Tutoriales◦ http://www.cin.ufpe.br/~haskell/hopengl/ (2002)◦ http://public.tfh-berlin.de/~panitz/hopengl/ (2003)
PFC – Oscar Noel Amaya García◦ http://www.lcc.uma.es (2007)
Top Related