Exercícios 3D

Reveja a matéria de Álgebra Linear e de Geometria Analítica.

Geometria 3D

Exercício 1

Vetor Perpendicular 1

Dados dois vetores 3D e , como é que encontra um terceiro vetor perpendicular a ambos?

Exercício 2

Vetor Perpendicular 2

Como é que adapta a resolução do exercício anterior para o caso em que, em vez de dois vetores, são dados três pontos 3D, e ?

Programação 3D

Exercício 3

Distância

Implemente uma função dist(p, q) que calcula a distância entre dois pontos. Suponha que os pontos são definidos por objetos {x, y, z}.

Exercício 4

Produto Externo

Implemente a função outer(u, v) que calcula o produto externo entre dois vetores.

Supondo que , então as componentes de podem ser calculadas por

Exercício 5

Conjuntos de Pontos

  1. Centro. Implemente a função center(points) que calcula o centro de um array de pontos.
  2. Próximo. Implemente a função nearest(target, points) em que target é um ponto 3D e points é um array de pontos 3D e que encontra o elemento de points que está mais próximo de target.
  • A sua função deve devolver um objeto com atributos {d, p} em que d é a distância e p o ponto mais próximo.
  1. Afastado. Implemente a função farthest(target, points) em que target é um ponto 3D e points é um array de pontos 3D e que encontra o elemento de points que está mais afastado de target. Resolva de forma semelhante à alínea anterior.
  2. «Mais Isolado». Implemente a função loneliest(points) em que points é um array de pontos 3D e que encontra o ponto «mais isolado» de um conjunto de pontos. O ponto «mais isolado» é o que está mais distante do centro.
  3. «Mais Central». Implemente a função centralest(points) em que points é um array de pontos 3D e que encontra o ponto «mais central» de um conjunto de pontos. O ponto «mais central» é o que está mais perto do centro.
  4. Canto Superior Direito Anterior. Implemente a função corner_trf(points) (trf: top right front) em que points é um array de pontos 3D e que encontra o «canto superior direito anterior» (SDA) de um conjunto de pontos. As coordenadas do SDA são os valores máximos nos eixos , e . Por exemplo:
    let points =  [
        {x: -1, y: 2, z: 0},
        {x: 20, y: 1, z: 3}
    ];
    
    {x: 20, y: 2, z: 3} === corner_trf(points);
    
  5. Canto Inferior Esquerdo Posterior. Implemente a função corner_llb(points) (llb: lower left back) nos mesmos moldes do exercício anterior, substituindo o máximo pelo mínimo.
  6. Pontos Mais Afastados. Implemente a função most_apart(points) em que points é um array de pontos 3D e que encontra os dois elementos de points que estão mais afastados um do outro. Isto é, se forem esses pontos então, dados quaisquer dois pontos e em points então dist(a,b) <= dist(p,q).
  7. Pontos Menos Afastados. Implemente a função least_apart(points) em que points é um array de pontos 3D e que encontra os dois elementos distintos de points que estão menos afastados um do outro. Isto é, se forem esses pontos então, dados quaisquer dois pontos e em points então dist(a,b) >= dist(p,q).

Exercício 6

Processamento de Extrusões

Na construção de uma extrusão a secção percorre a espinha. Suponha que:

  • A secção é definida por um array de pontos 2D {x, z} (note que é usado z e não y).
  • A espinha é definida por um array de vetores 3D {x, y, z}.

Estes dois parâmetros definem os vértices da geometria obtida por extrusão.

Mais concretamente, cada ponto p:{x, z} da secção e cada vetor v:{x, y, z} da espinha definem o vértice q = {x: p.x + v.x, y: v.y, z: p.z + v.z} da extrusão.

Por exemplo, dados

const seccao = [
    {x: 0.0, z: 0.0},
    {x: 1.0, z: 0.0},
    {x: 0.0, z: 1.0} ];

const espinha = [
    {x: 0.0, y: 0.0, z: 0.0},
    {x: 0.0, y: 1.0, z: 0.0},
    {x: 1.0, y: 2.0, z: -1.0} ];

o ponto

seccao[2] === {x: 0.0, z: 1.0}

e o vetor

espinha[1] === {x: 0.0, y: 1.0, z: 0.0}

definem o vértice

{x: 0.0, y: 1.0, z: 1.0}

Escreva a função vertex(i, j, section, spine) que devolve as coordenadas xyz do vértice definido pelo i-ésimo ponto da secção e pelo j-ésimo passo da espinha.

  • Por exemplo, usando as variáveis acima, vertex(1, 2, seccao, espinha) é o ponto 3D {x: 2.0, y: 2.0, z: -1.0}, que resulta do ponto {x: 1.0, z: 0.0} (com índíce i = 1) e do vetor {x: 1.0, y: 2.0, z: -1.0} (com indíce j = 2).
  • Assegure-se que i e j são índices válidos. Se não o forem a função deve devolver null.

Exercício 7

Grelha de elevação em 3JS.

A biblioteca 3JS não tem um construtor «direto» equivalente à ElevationGrid do X3D.

Estude este elemento, determine três parâmetros que mais contribuem para esta geometria e faça uma implementação para o 3JS.

Modelação 3D

Resolva cada um destes exercícios usando as duas bibliotecas gráficas, X3D e 3JS.

Exercício 8

Desenhar um referencial.

Desenhe um referencial XYZ. Assegure-se que os eixos estão corretamente orientados e use o seguinte esquema de cores: X:red; Y:green; Z:blue.

Exercício 9

Desenhar uma pirâmide.

Desenhe uma pirâmide em wireframe.

Exercício 10

Desenhar um frustum.

Um frustum (veja também o artigo na wikipédia) é um poliedro (isto é, um sólido com todas as faces planas) com duas das faces quadradas paralelas (o topo e a base).

Desenhe em wireframe um frustum com altura 1, em que a base é um quadrado de lado 2 e o topo um quadrado de lado 1.

Exercício 11

Desenhar um octaedro.

Octaedtro

Octaedro

Um octaedro é um dos cinco sólido platónicos (veja o artigo na wikipédia); tem oito faces triangulares e seis vértices:

Desenhem um octaedro em wireframe.

Exercício 12

Desenhar um icosaedro.

Icosaedro

Icosaedro

Um icosaedro é um dos cinco sólido platónicos (veja o artigo na wikipédia) e tem os vértices seguintes:

onde .

Desenhe um icosaedro em wireframe.

Exercício 13

Pintar uma pirâmide.

Desenhe uma pirâmide com as texturas de difusão, brilho e normais obtidas de imagens feitas ou encontradas por si. Seja realista.

Exercício 14

Pintar uma tenda.

Os vértices de uma tenda estão dados abaixo

Desenhe uma tenda pintada com texturas feitas (ou encontradas) por si. Seja realista.