Download Diapositiva 1
Document related concepts
no text concepts found
Transcript
Juan Antonio Chaves Naranjo Oscar Noel Amaya García Valentín Adolfo Acosta García 1. 2. 3. 4. 5. 6. 7. 8. Motivaciones Herramientas para su desarrollo Estructuras de datos para manejo de modelos moleculares 3D Implementación Visor 3D molecular Comparación de código con visor similar en lenguaje Imperativo (Tcl/Tk) Comparación rendimiento con visor similar en lenguaje Imperativo (Tcl/Tk) Conclusiones Bibliografía 09/08/2017 UMA, Programación Declarativa Avanzada Curso 08/09 2/18 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. 09/08/2017 UMA, Programación Declarativa Avanzada Curso 08/09 3/18 Tcl/Tk Wrapper OpenGL Lenguaje Interpretado 09/08/2017 4/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. 09/08/2017 UMA, Programación Declarativa Avanzada Curso 08/09 5/18 ElNº estándar en representaciones moleculares de Nº de son los ficheros “.mol”. Átomos Enlaces 18 18 0 0 0 0 0 0 0 0 1 V2000 2.4333 -0.7208 0.0000 C 0 0 ......... 3.1454 0.2032 -0.8617 H 0 0 2 1 1 0 0 0 0Define el enlace entre el átomo nº 18 ....... y el 6 18 6 1 0 0 0 0 Átomo de Carbono en la posición definida 0 0 Átomo 0 0 0de0 0 0 0 0 Hidrógeno en la posición 0 0 0 0 definida 0 0 0 0 0 0 Dichos datos son encapsulados dentro de una mónada IO para su posterior acceso en el visor 3D. 09/08/2017 UMA, Programación Declarativa Avanzada Curso 08/09 6/18 -- leerMol :: (Num a, Num b, … , Num d) => -- [Char] -> IO (d,a,[((f,g,e),[Char])],[(c,b)])) leerMol nombreFichero = do cad <- readFile nombreFichero return (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 09/08/2017 UMA, Programación Declarativa Avanzada Curso 08/09 7/18 Cabe destacar principalmente 3 funciones que son las que modelan el funcionamiento básico. Función main Función iniciarDisplayListMol Función display 09/08/2017 UMA, Programación Declarativa Avanzada Curso 08/09 8/18 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(500,500); main = do (progName,_) <- getArgsAndInitialize initialDisplayMode $= [ RGBMode, WithDepthBuffer, DoubleBuffered ] initialWindowSize $= Size 500 500 createWindow "Visor Haskell + OpenGL" depthFunc $= Just Less glClearColor(0.1,0.2,0.4,0); glShadeMode(GL_SMOOTH); clearColor $= Color4 0.1 0.2 0.4 0 shadeModel $= Smooth position (Light 0) glEnable(GL_LIGHTING); $= Vertex4 1 1 1 0 lighting $= Enabled light (Light 0) $= Enabled depthFunc $= Just Less frontFace $= CW lighting $= Enabled 09/08/2017 UMA, Programación Declarativa Avanzada Curso 08/09 9/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) glutDisplayFunc(display); glutReshapeFunc(reshape); keyboardMouseCallback $= Just (keyboard pPos) displayCallback $= display pPos listName fontOffset reshapeCallback $= Just reshape mainLoop 09/08/2017 UMA, Programación Declarativa Avanzada Curso 08/09 10/18 listName=glGenList(1); GL_COMPILE); fichero glNewList(listName, = do iniciarDisplayListMol [listName] <- genObjectNames 1 defineList listName Compile $ do (nAt,nEnl,atom,enl) <- leerMol fichero pintaAtomos atom pintaEnlaces atom enl return listName 09/08/2017 UMA, Programación Declarativa Avanzada Curso 08/09 11/18 glLoadIdentity(); display pPos listName fontOffset = do glClearutReshapeFunc(reshape); loadIdentity setPointOfView pPos clear [ColorBuffer,DepthBuffer] glTranslated(0.0,0.5,0.0); glRotated(1.0,0.0,0.0); translate (Vector3 0.0 0.5 0.0 :: Vector3 GLdouble) rotate 90 (Vector3 1.0 0.0 0.0 :: Vector3 GLdouble) callList listName swapBuffers 09/08/2017 UMA, Programación Declarativa Avanzada Curso 08/09 12/18 Imperativo VS Funcional Iteradores – F. Recursivas Wrapers OpenGL Estructuras especiales 09/08/2017 UMA, Programación Declarativa Avanzada Curso 08/09 13/18 do -- Posibles acciones return () pintaEnlaces atom [] = pintaEnlaces atom ((id1,id2):xs) = let p1 = posAtomo id1 atom let p2 = posAtomo id2 atom let let let let let do ASIGNACIONES c = vectorSub p1 p2 long = vectorNorm c ang = (vectorAngle (0,0,1) c) * 57.2957795131 (ex,ey,ez) = vectorCrossProduct (0,0,1) c longSeg = long/2.0 let (tx,ty,tz) = vectorSum p1 (vectorScale 0.0 c) ACCIONES SECUENCIALES preservingMatrix $ do translate (Vector3 tx ty tz :: Vector3 GLdouble) rotate ang (Vector3 ex ey ez) currentColor $= Color4 0 0 1 1 materialAmbientAndDiffuse Front $= colorAtomo (simboloAtomo id1 atom) renderObject Solid (Cylinder' 0.07 longSeg 15 15) 09/08/2017 UMA, Programación Declarativa Avanzada Curso 08/09 14/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) LLAMADA RECURSIVA pintaEnlaces atom xs return () 09/08/2017 UMA, Programación Declarativa Avanzada Curso 08/09 15/18 Lenguaje Imperativo Interpretado Vs Lenguaje Funcional + Mónadas compilado ¿Qué pensáis? 09/08/2017 UMA, Programación Declarativa Avanzada Curso 08/09 16/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. 09/08/2017 UMA, Programación Declarativa Avanzada Curso 08/09 17/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) 09/08/2017 UMA, Programación Declarativa Avanzada Curso 08/09 18/18