Exercícios 2D
Reveja a matéria de Álgebra Linear e de Geometria Analítica.
Geometria 2D
| Distância de um ponto a uma reta |
|---|
- A distância ($\color{seagreen}{d}$) entre o ponto vermelho ($\color{crimson}{A}$) e a reta azul é a distância entre o ponto vermelho ($\color{crimson}{A}$) e o ponto azul ($\color{steelblue}{B}$).
- O ponto azul ($\color{steelblue}{B}$) é a interseção entre a reta azul e a reta verde tracejada.
- A reta verde tracejada tem equação paramétrica $\color{seagreen}{X = A + \lambda u}$; falta determinar o vetor $u$.
- O vetor $u$ da reta verde tracejada é perpendicular ao vetor $v$ da equação paramétrica reta azul ($\color{steelblue}{X = B + \lambda v}$): $$u = (u_x, u_y) = (-v_y, v_x)$$
Exercício 1
Considere a equação paramétrica da reta, $X = P + \lambda v$.
Suponha que são dados dois pontos, $A = (a_x, a_y)$ e $B=(b_x, b_y)$.
Determine os valores dos parâmetros $P, v$ da reta que passa em $A, B$ e tais que:
- $A = P + \lambda v$ quando $\lambda = 0$ e
- $B = P + \lambda v$ quando $\lambda = 1$.
Exercício 2
Escreva uma expressão matemática para definir:
- Os segmentos de reta $(0,0) - (0,1)$, $(0,0) - (1,0)$ e $(0,0) - (1,1)$.
- O triângulo de vértices $(0,0) - (0,1) - (1,0)$.
- O quadrado $(0,0) - (1,0) - (1,1) - (0,1)$.
- O interior do quadrado e triângulo anteriores.
Exercício 3
Encontre os valores dos parâmetros da equação paramétrica:
- Da reta:
- Que passa nos pontos $(0,0)$ e $(0,1)$.
- Que passa nos pontos $(0,0)$ e $(1,0)$.
- Que passa nos pontos $(0,0)$ e $(1,1)$.
- Da reta com equação algébrica:
- $2x + 3y - 4 = 0$.
- $3x - 2y - 4 = 0$.
- $4x + 6y - 8 = 0$.
- Da circunferência:
- Centrada em $(0,1)$ e de raio $2$.
- Centrada em $(1,0)$ e de raio $2$.
- Centrada em $(1,1)$ e de raio $2$.
- Centrada em $(0,1)$ e que passa no ponto $(0,0)$.
- Centrada em $(1,0)$ e que passa no ponto $(0,0)$.
- Centrada em $(1,1)$ e que passa no ponto $(0,0)$.
Programação 2D
Reveja a programação, em particular a linguagem
JavaScript.
Exercício 4
Calcule os parâmetros $A, B, C$ da equação algébrica da reta ($Ax + By + C = 0$), dadas as coordenadas $(x_1, y_1), (x_2, y_2)$ de dois pontos.
- Implemente a função
eqna_s(x1, y1, x2, y2)que devolve um objeto com atributos{A, B, C}. - Em que casos é que as entradas
x1, y1, x2, y2não definem uma reta? No seu código detete esse caso e devolvanull. - Em que casos é que $A_1, B_1, C_1$ define a mesma reta que $A_2, B_2, C_2$? Implemente uma função
equala_ss(A1, B1, C1, A2, B2, C2)que devolvetruese os parâmetros definem a mesma reta efalsecaso contrário.
Exercício 5
Calcule os parâmetros $P, v$ da equação paramétrica da reta ($X = P + \lambda v$), dadas as coordenadas $(x_1, y_1), (x_2, y_2)$ de dois pontos.
- Implemente a função
eqnp_s(x1, y1, x2, y2)que devolve um objeto com atributos{P, v}. - Em que casos é que as entradas
x1, y1, x2, y2não definem uma reta? No seu código detete esse caso e devolvanull. - Em que casos é que os parâmetros $P_1, v_1$ definem a mesma reta que os parâmetros $P_2, v_2$? Implemente uma função
equalp_ss(P1, v1, P2, v2)que devolvetruese os parâmetros definem a mesma reta efalsecaso contrário.
Exercício 6
Implemente uma função
dot(x1, y1, x2, y2)para calcular o produto interno $$(x_1, y_1) \cdot (x_2, y_2) = x_1 x_2 + y_1 y_2$$
Use essa função para implementar funções para calcular:
- O comprimento de um vetor,
length_v: $|v| = \sqrt{v\cdot v}$. - A distância entre dois pontos,
dist_pp: $d(A,B) = | B - A |$. - A distância de um ponto a uma reta,
dist_ps. Sugestão: Use a equação paramétrica da reta. - O «reflexo» de um ponto por uma reta,
mirror_ps. - O «reflexo» de uma reta por outra reta,
mirror_ss. - Se duas retas são perpendiculares,
are_perp.
Exercício 7
Pode gerar pontos de uma circunferência usando uma equação paramétrica.
Implemente a função points_c(x1, y1, r, n) que gera uma lista com $n$ pontos equidistantes da circunferência de centro $(x_1, y_1)$ e raio $r$.
Use a função points_c para estimar a distância de uma circunferência a:
- Um ponto:
edist_cp. - Uma reta:
edist_cl. - Outra circunferência:
edist_cc.
Exercício 8
Pode gerar pontos de um segmento de reta usando os dois extremos do segmento e uma equação paramétrica.
Implemente a função points_s(x1, y1, x2, y2, n) que gera uma lista com $n$ pontos equidistantes do segmento limitado pelos pontos $(x_1, y_1)$ e $(x_2, y_2)$. Sugestão: Use a equação vetorial da reta:
$$
(x,y) = (x_1, y_1) + \lambda ( x_2 - x_1, y_2 - y_1 )
$$
Estime a distância de um segmento de reta a:
- Um ponto:
edist_sp. - Outro segmento de reta:
edist_ss. - Uma circunferência:
edist_sc. Suponha que esta circunferência:- Está definida por centro e raio.
- Está aproximada por um conjunto de pontos.
Exercício 9
A forma de representar as coordenadas dos pontos usada acima é muito «trapalhona».
Em vez de usar x1, y1 (ou outros indíces) use listas, P1 = [x1, y1], para representar pontos. Atualize todas as funções anteriores.
Por exemplo, x = dot(P, Q).
Exercício 10
Pode obter formas simples usando apenas conjuntos de pontos para definir o contorno do objeto gráfico.
Implemente:
-
A função
join(A, B)em queAeBsão listas de pontos e que devolve a lista que resulta de acrescentar os pontos deBa seguir aos pontos deA. -
A função
frame(A)que calcula os cantos superior esquerdo e inferior direito dos pontos emA, isto é, a moldura para os pontos deA. -
A função
min_circ(A)que calcula a menor circunferência que contém todos os pontos deA. Resolva em duas versões: uma que devolve o centro e o raio da circunferência e outra que devolve uma aproximação com $n$ pontos.
Exercício 11
Pode transformar pontos usando as operações da álgebra linear.
Implemente a função [x1, y1, z1] = dot_mv(a,b,c,d,e,f,g,h,i,x0,y0,z0) que calcula
$$\begin{bmatrix}
x_1 \cr
y_1 \cr
z_1
\end{bmatrix} =
\begin{bmatrix}
a & b & c \cr
d & e & f \cr
g & h & i
\end{bmatrix}
\begin{bmatrix}
x_0 \cr
y_0 \cr
z_0
\end{bmatrix}.
$$
Esta forma de representar matrizes e vetores é muito «trapalhona».
Represente os vetores por listas, v = [x, y, z], e as matrizes por listas de listas,
A = [[a, b, c], [d, e, f], [g, h, i]]. Note que A[0] é a primeira linha de A.
Deve ficar com uma função X1 = dot_mv(A, X0).
Exercício 12
Implemente funções para gerar matrizes e calcular operações comuns.
- A matriz
zeros(n,m)tem $n$ linhas, $m$ colunas e todas as entradas são $0$. - Na matriz
ones(n, m)tem $n$ linhas, $m$ colunas e todas as entradas são $1$. - A matriz
eye(n)é a matriz identidade de ordem $n$. - A função
t(A)é a matriz transposta de $A$. - A função
sum_mm(A, B)soma as matrizes $A$ e $B$. Se as dimensões forem incompatíveis, devolvenull. - A função
dot_mm(A, B)multiplica as matrizes $A$ e $B$. Se as dimensões forem incompatíveis, devolvenull. - A função
translate(dx, dy)devolve a matriz da translação por $(dx, dy)$. - A função
rotate(alpha)devolve a matriz da rotação por $\alpha$ radianos. - A função
scale(sx, sy)devolve a matriz da escala por $(sx, sy)$.
Exercício 13
Use a biblioteca de funções que definiu acima para construir e transformar (aproximações) de circunferências e de segmentos.
Visualize as formas originais (a verde) e transformadas (a vermelho) nos sistemas C2D e SVG.
Exercício 14
Implemente a regra par-ímpar de enchimento de formas.
Suponha que F é um conjunto de pontos que aproxima uma figura 2D:
- Defina a função
sort_h(F)que devolve os pontos deFordenados da esquerda para a direita (isto é, primeiro os pontos com menor coordenadax). - Defina a função
strip_h(F, y0, e)que devolve os pontos deFque estão numa faixa horizontal, isto é os pontos deFcuja coordenada $y$ é tal que $\left| y - y_0 \right| \leq e$. Se não existirem pontos assim emF, devolve a lista vazia. - Defina a função
first_left(F)que devolve o ponto mais à esquerda deF. SeFfor uma lista vazia devolvenull. - Defina a função
next_right(F, x0)que devolve o ponto deFque, de todos os pontos deFcom coordenadaxmaior quex0, é o que tem menor coordenadax. Se não existir tal ponto devolvenull. - Use as funções
sort_h, strip_h, first_leftenext_rightpara definir a funçãofill_evenodd(F, ...), que implementa a regra par-ímpar por faixas horizontais.- O resultado deve ser uma lista com os segmentos horizontais interiores, sendo cada segmento definido por dois pontos.
- Considere ainda que argumentos são úteis e/ou necessário e como detetar e assinalar potenciais erros.
Exercício 15
Visualize o preenchimento de formas pela regra par-ímpar.
Use vermelho para a forma e verde para o interior. Resolva esta alínea para os sistemas C2D e SVG.
Exercício 16
Visualize o interior da forma usando os sistemas
C2DeSVGcom:
- Um gradiente horizontal com várias cores (pelo menos 3).
- Um gradiente vertical com várias cores (pelo menos 3).
- Um padrão xadrez.
Modelação 2D
Exercício 17
Escreva um programa que use o C2D para desenhar um caminho entre os pontos de coordenadas $(0,0)$ e $(64,64)$ que tenha um arco de raio 16.
Exercício 18
Escreva um programa javascript para o C2D que desenhe um círculo amarelo no meio de um retângulo 100x100 azul. Defina a mesma imagem com um documento SVG.
Exercício 19
Procure na internet: Qual é o intervalo dos comprimentos de onda das cores visíveis?
Exercício 20
Marque os seguintes pontos num referencial cartesiano e num referencial de ecrã (desenhados numa folha de papel): (1, 3), (-2, 1.5), (0, -2), (0, 0), (2, 1), (-1.5, 1.5), (3, -0.5).
Exercício 21
| Meia Lua | Yin-Yang |
|---|---|
Escreva um programa para o C2D, e um documento SVG para desenhar:
- Uma meia lua (ver acima).
- Um quadrado centrado e rodado 45º.
- Um tabuleiro de xadrez.
- Um tabuleiro tri-colorido. Generalize para uma função que desenhe um tabuleiro $n$-colorido.
- → O símbolo oriental Yin-Yang (ver acima).
- Um retângulo pintado com um gradiente radial acíclico.
- Um retângulo pintado \com um gradiente radial cíclico.
- → Um octógono. Generalize para um $n$-ágono.
- → Uma estrela de cinco pontas. Generalize para $n$ pontas.
- Desenhe a bandeira da união europeia.
Exercício 23
Implemente uma função
grafico(f, n, a, b)para ajudar a desenhar o gráfico de uma função matemática.
- Esta função devolve $n$ pontos $(x_i, f(x_i))$ do gráfico da função $f: \mathbb{R} \to \mathbb{R}$, com as abcissas $x_i$ igualmente espaçadas entre $a$ e $b$ (e $x_0 = a, x_{n-1} = b$).
- Implemente funções para adaptar as listas $[(x_0, f(x_0)), \ldots, (x_{n-1}, f(x_{n-1}))]$ a caminhos
C2DeSVG.
Exercício 24
Implemente uma pequena biblioteca gráfica 2D.
Suponha que cada objeto gráfico é definido por:
- Um caminho, isto é uma lista de pontos
x, y. - Uma transformação com uma translação, uma rotação e uma escala.
- Propriedades de aspeto (
strokeefill).
Implemente uma função para desenhar estes objetos gráficos num
C2De para produzir um elementoSVG.