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
  1. A distância () entre o ponto vermelho () e a reta azul é a distância entre o ponto vermelho () e o ponto azul ().
  2. O ponto azul () é a interseção entre a reta azul e a reta verde tracejada.
  3. A reta verde tracejada tem equação paramétrica - falta determinar o vetor .
  4. O parâmetro da reta verde tracejada é perpendicular ao parâmetro da reta azul:

Exercício 1

Considere a equação paramétrica da reta, .

Suponha que são dados dois pontos, e .

Determine os valores dos parâmetros da reta que passa em e tais que:

  • quando e
  • quando .

Exercício 2

Escreva uma expressão matemática para definir:

  1. Os segmentos de reta , e .
  2. O triângulo de vértices .
  3. O quadrado .
  4. O interior do quadrado e triângulo anteriores.

Exercício 3

Encontre os valores dos parâmetros da equação paramétrica:

  1. Da reta:
    1. Que passa nos pontos e .
    2. Que passa nos pontos e .
    3. Que passa nos pontos e .
  2. Da reta com equação algébrica:
    1. .
    2. .
    3. .
  3. Da circunferência:
    1. Centrada em e de raio .
    2. Centrada em e de raio .
    3. Centrada em e de raio .
    4. Centrada em e que passa no ponto .
    5. Centrada em e que passa no ponto .
    6. Centrada em e que passa no ponto .

Programação 2D

Reveja a programação, em particular a linguagem JavaScript.

Exercício 4

Calcule os parâmetros da equação algébrica da reta (), dadas as coordenadas de dois pontos.

  1. Implemente a função eqna_s(x1, y1, x2, y2) que devolve um objeto com atributos {A, B, C}.
  2. Em que casos é que as entradas x1, y1, x2, y2 não definem uma reta? No seu código detete esse caso e devolva null.
  3. Em que casos é que define a mesma reta que ? Implemente uma função equala_ss(A1, B1, C1, A2, B2, C2) que devolve true se os parâmetros definem a mesma reta e false caso contrário.

Exercício 5

Calcule os parâmetros da equação paramétrica da reta (), dadas as coordenadas de dois pontos.

  1. Implemente a função eqnp_s(x1, y1, x2, y2) que devolve um objeto com atributos {P, v}.
  2. Em que casos é que as entradas x1, y1, x2, y2 não definem uma reta? No seu código detete esse caso e devolva null.
  3. Em que casos é que os parâmetros definem a mesma reta que os parâmetros ? Implemente uma função equalp_ss(P1, v1, P2, v2) que devolve true se os parâmetros definem a mesma reta e false caso contrário.

Exercício 6

Implemente uma função dot(x1, y1, x2, y2) para calcular o produto interno

Use essa função para implementar funções para calcular:

  1. O comprimento de um vetor, length_v: .
  2. A distância entre dois pontos, dist_pp: .
  3. A distância de um ponto a uma reta, dist_ps. Sugestão: Use a equação paramétrica da reta.
  4. O «reflexo» de um ponto por uma reta, mirror_ps.
  5. O «reflexo» de uma reta por outra reta, mirror_ss.
  6. 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 pontos equidistantes da circunferência de centro e raio .

Use a função points_c para estimar a distância de uma circunferência a:

  1. Um ponto: edist_cp.
  2. Uma reta: edist_cl.
  3. 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 pontos equidistantes do segmento limitado pelos pontos e . Sugestão: Use a equação vetorial da reta:

Estime a distância de um segmento de reta a:

  1. Um ponto: edist_sp.
  2. Outro segmento de reta: edist_ss.
  3. Uma circunferência: edist_sc. Suponha que esta circunferência:
    1. Está definida por centro e raio.
    2. 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:

  1. A função join(A, B) em que A e B são listas de pontos e que devolve a lista que resulta de acrescentar os pontos de B a seguir aos pontos de A.

  2. A função frame(A) que calcula os cantos superior esquerdo e inferior direito dos pontos em A, isto é, a moldura para os pontos de A.

  3. A função min_circ(A) que calcula a menor circunferência que contém todos os pontos de A. Resolva em duas versões: uma que devolve o centro e o raio da circunferência e outra que devolve uma aproximação com 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

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.

  1. A matriz zeros(n,m) tem linhas, colunas e todas as entradas são .
  2. Na matriz ones(n, m) tem linhas, colunas e todas as entradas são .
  3. A matriz eye(n) é a matriz identidade de ordem .
  4. A função t(A) é a matriz transposta de .
  5. A função sum_mm(A, B) soma as matrizes e . Se as dimensões forem incompatíveis, devolve null.
  6. A função dot_mm(A, B) multiplica as matrizes e . Se as dimensões forem incompatíveis, devolve null.
  7. A função translate(dx, dy) devolve a matriz da translação por .
  8. A função rotate(alpha) devolve a matriz da rotação por radianos.
  9. A função scale(sx, sy) devolve a matriz da escala por .

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:

  1. Defina a função sort_h(F) que devolve os pontos de F ordenados da esquerda para a direita (isto é, primeiro os pontos com menor coordenada x).
  2. Defina a função strip_h(F, y0, e) que devolve os pontos de F que estão numa faixa horizontal, isto é os pontos de F cuja coordenada é tal que . Se não existirem pontos assim em F, devolve a lista vazia.
  3. Defina a função first_left(F) que devolve o ponto mais à esquerda de F. Se F for uma lista vazia devolve null.
  4. Defina a função next_right(F, x0) que devolve o ponto de F que, de todos os pontos de F com coordenada x maior que x0, é o que tem menor coordenada x. Se não existir tal ponto devolve null.
  5. Use as funções sort_h, strip_h, first_left e next_right para definir a função fill_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 C2D e SVG com:

  1. Um gradiente horizontal com várias cores (pelo menos 3).
  2. Um gradiente vertical com várias cores (pelo menos 3).
  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 e 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 LuaYin-Yang
Meia LuaYin-Yang

Escreva um programa para o C2D, e um documento SVG para desenhar:

  1. Uma meia lua (ver acima).
  2. Um quadrado centrado e rodado 45º.
  3. Um tabuleiro de xadrez.
  4. Um tabuleiro tri-colorido. Generalize para uma função que desenhe um tabuleiro -colorido.
  5. O símbolo oriental Yin-Yang (ver acima).
  6. Um retângulo pintado com um gradiente radial acíclico.
  7. Um retângulo pintado com um gradiente radial cíclico.
  8. Um octógono. Generalize para um -ágono.
  9. Uma estrela de cinco pontas. Generalize para pontas.
  10. 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 pontos do gráfico da função , com as abcissas igualmente espaçadas entre e (e ).
  • Implemente funções para adaptar as listas a caminhos C2D e SVG.

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 (stroke e fill).

Implemente uma função para desenhar estes objetos gráficos num C2D e para produzir um elemento SVG.