1. quadtrees
Un quadtree puede representarse de forma recursiva como:
vaciorect(rgb(1,0,0))d(vacio,rect(rojo),rect(verde),vacio)
El siguiente predicado wqt(QT) almacena el quadtree QT es un fichero VRML
wqt(QT):-wqt('qt.wrl',QT).
wqt(F,OT):-open(F,write,S),
cabecera(S),
viewPoint(S),
wqt(S,0,0,64,OT),
close(S).
wqt(S,_,_,_,vacio):-write(S,'').
wqt(S,X,Y,D,rect(C)):-
putBox(S,X,Y,0,C,D,D,1).
wqt(S,X,Y,D,d(C1,C2,C3,C4)):-
( D =< 1 -> write(S,'')
; D2 is D / 2, D4 is D / 4,
XP is X + D4, XN is X - D4,
YP is Y + D4, YN is Y - D4,
wqt(S,XN,YP,D2,C1),
wqt(S,XP,YP,D2,C2),
wqt(S,XN,YN,D2,C3),
wqt(S,XP,YN,D2,C4)
).
cabecera(S):-
write(S,'#VRML V2.0 utf8\n\n').
viewPoint(S):-
write(S,'Viewpoint { description "Punto" \n'),
write(S,' orientation 0 0 1 0\n'),
write(S,' position 0 0.2 150 } \n').
putSphere(S,X,Y,Z,C,R):-
translate(S,X,Y,Z),
color(S,C), sphere(S,R), endColor(S),
endTranslate(S).
putBox(S,X,Y,Z,C,SX,SY,SZ):-
translate(S,X,Y,Z),
color(S,C),
box(S,SX,SY,SZ),
endColor(S),
endTranslate(S).
translate(S,X,Y,Z):-
write(S,' Transform { translation '),write3(S,X,Y,Z),nl(S),
write(S,' children [').
endTranslate(S):-
write(S,' ] }\n').
color(S,rgb(R,G,B)):-
write(S,' Shape { appearance Appearance '),
write(S,' { material Material { diffuseColor '),
write3(S,R,G,B),
write(S,'} }').
endColor(S):-
write(S,' } ').
box(S,X,Y,Z):-
write(S,' geometry Box { size '),
write3(S,X,Y,Z),
write(S,' }').
sphere(S,R):-
write(S,' geometry Sphere { radius '),
write(S,R),
write(S,' }').
write3(S,X,Y,Z):-
format(S,'~2f ~2f ~2f',[X,Y,Z]).
Un ejemplo de llamada sería
?-wqt(d(vacio,rect(rgb(1,0,0)),rect(rgb(0,1,0)),vacio)).
Construir diversos quadtrees
2. escal
Construir un predicado escal(X) que se cumple si X
es un cuadtree con forma de escalón. Un ejemplo puede verse en:
http://www.di.uniovi.es/~labra/PLF/prac/worlds/escal.wrl.
3. escalN
Construir un predicado escalN(N,X) que se cumple si X
es un cuadtree con forma de escalón con una resolución N.
Un ejemplo con resolución 3 puede verse en:
http://www.di.uniovi.es/~labra/PLF/prac/worlds/escal3.wrl.
4. gira
Construir un predicado gira(X,Y) que se cumple si Y es el
quadtree formado al girar X 90 grados.
5. giros
Construir un predicado giros(X,Y) que se cumple si Y es un
quadtree formado por repetir el quadtree X
girando 90º cada cuadrante.
6. romboN
Construir un predicado romboN(N,X,Y) que se cumple
si Y es un quadtree en forma de rombo con una resolución
N. Un ejemplo con resoolución 3 puede verse en:
http://www.di.uniovi.es/~labra/PLF/prac/worlds/rombo3.wrl.
7. Galería
Construir una galería de quadtrees
8. Colorea (Opcional)
Construir un predicado colorea(A,B), que se cumple si
B es un quadtree con el mismo formato que A pero coloreado de forma
que ningún cuadrante adyacente tenga el mismo color.
Por ejemplo, una posible solución al colorear un rombo puede verse en:
http://www.di.uniovi.es/~labra/PLF/prac/worlds/colorQT.wrl.
9. octrees (Opcional)
Tomando como referencia el predicado wqt, construir un
predicado wot que permita representar octrees.
Construir una galería con octrees generados en Prolog