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
- Centro. Implemente a função
center(points)
que calcula o centro de umarray
de pontos. - Próximo. Implemente a função
nearest(target, points)
em quetarget
é um ponto 3D epoints
é umarray
de pontos 3D e que encontra o elemento depoints
que está mais próximo detarget
.
- A sua função deve devolver um objeto com atributos
{d, p}
em qued
é a distância ep
o ponto mais próximo.
- Afastado. Implemente a função
farthest(target, points)
em quetarget
é um ponto 3D epoints
é umarray
de pontos 3D e que encontra o elemento depoints
que está mais afastado detarget
. Resolva de forma semelhante à alínea anterior. - «Mais Isolado». Implemente a função
loneliest(points)
em quepoints
é umarray
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. - «Mais Central». Implemente a função
centralest(points)
em quepoints
é umarray
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. - Canto Superior Direito Anterior. Implemente a função
corner_trf(points)
(trf
: top right front) em quepoints
é umarray
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);
- 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. - Pontos Mais Afastados. Implemente a função
most_apart(points)
em quepoints
é umarray
de pontos 3D e que encontra os dois elementos depoints
que estão mais afastados um do outro. Isto é, se forem esses pontos então, dados quaisquer dois pontos e empoints
entãodist(a,b) <= dist(p,q)
. - Pontos Menos Afastados. Implemente a função
least_apart(points)
em quepoints
é umarray
de pontos 3D e que encontra os dois elementos distintos depoints
que estão menos afastados um do outro. Isto é, se forem esses pontos então, dados quaisquer dois pontos e empoints
entãodist(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 é usadoz
e nãoy
). - 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ícei = 1
) e do vetor{x: 1.0, y: 2.0, z: -1.0}
(com indícej = 2
). - Assegure-se que
i
ej
são índices válidos. Se não o forem a função deve devolvernull
.
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
e3JS
.
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 |
---|
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 |
---|
Um icosaedro é um dos cinco sólido platónicos (veja o ) 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.