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