Instituto Superior Técnico Modelação Geométrica e Visualização de Edifícios 2007/2008 Segundo Teste/Primeiro Exame 3/07/2008 Nome: Número: Escreva o seu número em todas as folhas da prova. O tamanho das respostas deve ser limitado ao espaço fornecido para cada pergunta. Pode usar os versos das folhas para rascunho. A prova tem 7 páginas e a duração é de 60/120 minutos. A cotação de cada questão encontra-se indicada entre parêntesis. Boa sorte. Se tenciona fazer o Segundo Teste, comece a responder a partir da pergunta 8, inclusive. Em todos os exercícios, considere como pré-definidas as funções +, *, -, /, xy, +xy, pol, +pol, xyz, +xyz, cil, +cil, cx, cy, cz, sqrt, max, min, random e random-[]. 1. (1.0) Calcule o valor das seguintes expressões Auto Lisp: (a) (- 1) -1 (b) (- 1 1) 0 (c) (- 1 1 1) -1 (d) (/ 1 1) 1 (e) (/ 1 2) 0 (f) (/ (* 3 2) 2) 3 (g) (* (/ 3 2) 2) 2 (h) (/ (/ (/ 8 2) 2) 2) 1 (i) (/ 8 (/ 2 (/ 2 2))) 4 (j) (+ (/ 1 2) (/ 1 2)) 0 2. (1.0) Do conjunto das funções trigonométricas inversas, o Auto Lisp apenas providencia o arco tangente (atan). Defina também a função arco-cosseno (acos), cuja definição matemática é: 1 x 2 acos x = atan x (defun acos (x) (atan (sqrt (- 1 (* x x))) x))
Número: 2 3. (3.0) Considere o seguinte triângulo com lados de comprimento a, b e c: b c P α a (a) (1.0) Sendo s o semi-perímetro do triângulo: s = a + b + c 2 a área A do triângulo apresentado pode ser calculada pela fórmula de Heron: A = s (s a) (s b) (s c) Defina uma função Auto Lisp que calcule essa área a partir dos comprimentos a, b e c. Tenha o cuidado de evitar cálculos repetidos. (defun area-triangulo (a b c / s) (setq s (/ (+ a b c) 2)) (sqrt (* s (- s a) (- s b) (- s c)))) (b) (1.0) O ângulo α (em radianos) que o lado de comprimento b faz com o lado de comprimento a pode ser determinado a partir da fórmula α = acos a2 + b 2 c 2 2ab Defina a função angulo-a-b que, recebendo os comprimentos a, b e c, devolve o ângulo α. Note que acos é a função arco-cosseno que definiu na pergunta 2. (defun angulo-a-b (a b c) (acos (/ (+ (* a a) (* b b) (- (* c c))) (* 2 a b)))) (c) (1.0) Tendo em conta que o lado do triângulo de comprimento a é horizontal, defina uma função Auto Lisp que, dado um ponto P e os comprimentos a, b e c, constrói o triângulo em AutoCad. (defun constroi-triangulo (p a b c / alfa p1 p2) (setq alfa (angulo-a-b a b c) p1 (+pol p b alfa) p2 (+xy p a 0)) (command "_.line" p p1 p2 "_close"))
Número: 3 4. (2.0) Considere a seguinte escada: Defina uma função denominada escada cujos parâmetros são o ponto P do canto inferior direito (para quem sobe a escada), o comprimento do cobertor c, a largura do degrau l, a altura do espelho e e o número de cobertores n e que constrói a escada através da utilização de paralelipípedos de altura progressivamente crescente. Para a criação de um paralelipípedo pode utilizar o comando AutoCad box que recebe dois pontos, o primeiro representando o canto inferior direito e o segundo o canto oposto. (defun escadas-blocos (p c l e h n) (if (= n 0) nil (progn (command "_.box" p (+xyz p c l h)) (escadas-blocos (+xyz p c 0 0) c l e (+ h e) (- n 1))))) (defun escadas (p c l e n) (escadas-blocos p c l e e n)) (escadas (xyz 0 0 0) 0.25 2.00 0.16 10) 5. (1.0) O que é um valor lógico? Quais são os valores lógicos empregues em Auto Lisp? Um valor lógico é um valor que é interpretado como verdade ou falso. Auto Lisp interpreta como falso o valor nil e como verdade tudo o resto. 6. (1.0) O que é um operador lógico? Quais são os operadores lógicos que conhece em Auto Lisp? Um operador lógico é um operador que combina valores lógicos. As funções and, or e not são exemplos de operadores lógicos.
Número: 4 7. (1.0) Traduza para Lisp as seguintes expressões matemáticas: (a) x y (<= x y) (b) x < y y < z (< x y z) (c) x y z (<= x y z) (d) x < y z (and (< x y) (<= y z)) (e) x < y x < z (and (< x y) (< x z)) 8. (2.0) (O Segundo Teste começa aqui!) Utilizando o operador foreach, defina a função denominada rectangulo-envolvente que, dada uma lista de coordenadas bi-dimensionais, devolve uma lista com as coordenadas dos cantos inferior esquerdo e superior direito do menor rectângulo capaz de incluir todas as coordenadas dadas. Por exemplo, _$ (rectangulo-envolvente (list (xy 0 0) (xy 3 4) (xy -1 0) (xy 2-3))) ((-1-3) (3 4)) (defun rectangulo-envolvente (coords / c min-x min-y max-x max-y) (setq c (car coords) min-x (cx c) min-y (cy c) max-x (cx c) max-y (cy c)) (foreach c (cdr coords) (setq min-x (min min-x (cx c)) min-y (min min-y (cy c)) max-x (max max-x (cx c)) max-y (max max-y (cy c)))) (list (xy min-x min-y) (xy max-x max-y))) 9. (1.0) Defina a função limita-ordenada que, dada uma ordenada máxima e uma lista de coordenadas bi-dimensionais, devolve uma lista com o mesmo número de elementos mas em que todas as coordenadas cuja ordenada seja superior ao valor máximo dado passam a ter esse valor máximo. Por exemplo: _$ (limita-ordenada 2 (list (xy 0 2) (xy 3 4) (xy -1 1) (xy 2-3))) ((0 2) (3 2) (-1 1) (2-3)) (defun limita-ordenada (max-y coords) (if (null coords) (list) (cons (xy (cx (car coords)) (min (cy (car coords)) max-y)) (limita-ordenada max-y (cdr coords)))))
Número: 5 10. (3.0) Considere a urbanização representada na figura seguinte: Cada edifício está modelado como um paralelipípedo com uma base de 20 20m 2 e uma altura de 40m. As avenidas estão modeladas com paralelipípedos de 0.5m de espessura e 10m de largura. A avenida maior tem 500m de comprimento até ao primeiro cruzamento e cada um dos restantes troços que se juntam num cruzamento tem metade do comprimento do troço maior. Para se modelar a urbanização, considerou-se um algoritmo controlado por um determinado número n de invocações recursivas pretendidas. O algoritmo começa por desenhar a avenida maior e, se já fez recursão suficiente, deverá colocar um prédio na extremidade da avenida; caso contrário, deverá invocar-se recursivamente para cada uma das restantes três direcções. A seguinte imagem mostra a execução do algoritmo para n = 2, n = 3 e n = 4. Defina uma função Auto Lisp urbe que implementa o algoritmo anterior. Assuma a existência da função (paralelipipedo P 0 l e P 1 ) que constroi a seguinte entidade: P 0 l e P 1
Número: 6 (defun urbe (p a c n / p1) (setq p1 (+pol p c a)) (paralelipipedo p 10 0.5 p1) (if (= n 0) (paralelipipedo (+cil p1 10 a 0) 20 20 (+cil p1 10 a 40)) (progn (urbe p1 (- a pi/2) (/ c 2.0) (- n 1)) (urbe p1 a (/ c 2.0) (- n 1)) (urbe p1 (+ a pi/2) (/ c 2.0) (- n 1))))) (urbe (xyz 0 0 0) 0 500.0 4) 11. (1.0) Considere a seguinte interacção com o AutoCad para a criação de um tronco de cone onde apresentamos a negrito os dados fornecidos pelo utilizador: Command: cone Specify center point of base or [3P/2P/Ttr/Elliptical]: 1,1,1 Specify base radius or [Diameter] <5.0000>: 3 Specify height or [2Point/Axis endpoint/top radius] <10.0000>: Top Specify top radius <0.0000>: 2 Specify height or [2Point/Axis endpoint] <10.0000>: 4 Tendo em conta a interacção anterior, defina uma função Auto Lisp denominada tronco-cone cujos parâmetros são o ponto P do centro da base do sólido, a altura h do sólido e os raios r b e r t da base e do topo do sólido e que cria o tronco de cone correspondente em AutoCad. (defun tronco-cone (p h rb rt) (command "_.cone" p rb "_Top" rt h)) 12. (2.0) Considere as colunas doidas que se apresentam em seguida:
Número: 7 Cada coluna caracteriza-se por ter a sua base centrada num ponto P e ser formada por n blocos em forma de tronco de cone, todos da mesma altura h mas cujos raios variam aleatoriamente, com excepção do raio da base do bloco inferior r b, que é dado. Para evitar problemas estruturais, o raio do topo de um bloco está compreendido entre 50% e 150% do raio da base desse bloco. Note que o raio do topo de um bloco coincide com o raio da base do bloco que lhe está por cima. Utilizando a função tronco-cone apresentada na pergunta anterior, defina a função coluna-doida que constroi uma coluna doida. (defun coluna-aleatoria (p n h rb r0 / r1) (if (= n 0) nil (progn (setq r1 (* (random-[] 0.5 1.5) rb)) (tronco-cone p h r0 r1) (coluna-aleatoria (+xyz p 0 0 h) (- n 1) h rb r1)))) (defun coluna (p n h r) (coluna-aleatoria p n h r r)) (coluna (xy 0 0) 8 0.5 0.3) 13. (1.0) Defina um comando AutoCad que permite ao utilizador de AutoCad criar uma coluna doida simplesmente escrevendo coluna-doida na prompt do AutoCad. Naturalmente, o seu comando deverá pedir ao utilizador toda a informação que for necessária. (defun c:coluna-doida (/ p n h r) (setq p (getpoint "\ncentro da base") n (getint "\nnumero de blocos") h (getreal "\naltura de cada bloco") r (getreal "\nraio da base")) (coluna-doida p n h r))