-
Notifications
You must be signed in to change notification settings - Fork 153
Objetos Tridimensionais
Embora sejam menos comuns do que os objetos bidimensionais em competições, os primitivos geométricos tridimensionais podem aparecer em problemas, tanto como ponto central da questão ou como uma etapa intermediária para atingir a solução desejada.
Abaixo são apresentadas as principais características de alguns elementos geométricos primitivos.
A esfera é o conjunto de pontos do espaço tridimensional que são equidistantes de um ponto fixo. Este ponto fixo é denominado centro C da esfera, e a distância de um ponto da esfera a C é denominada raio r.
A esfera por ser representa, em coordenadas cartesianas, pela equação abaixo, onde (x0, y0) são as coordenadas do centro e r é o raio.
Pode ser útil, porém, utilizar a representação da esfera em coordenadas esféricas, onde r é o raio, theta um ângulo que varia de 0 a 2PI e phi é um ângulo que varia de 0 a PI, conforme apresentado abaixo.
A área da superfície da esfera é dada por A = 4*PI*r^2
, e o seu volume é
igual a V = (4/3)*PI*r^3
, o que pode ser verificado através das integrais de
área e volume das coordenadas esféricas, cujo jacobiano é dado por
r²sin(phi)
.
// Definição da classe Point3D
// Definição da constante PI
class Sphere {
public:
Point3D C;
double r;
Sphere(const Point3D& C, double rv) : C(Cv), r(rv) {}
double area() const
{
return 4.0*PI*r*r;
}
double volume() const
{
return 4.0*PI*r*r*r/3.0;
}
};
Um cubo é uma região do espaço delimitada por 6 quadrados idênticos, unidos por meio de suas arestas. O cubo é um dos cinco polígonos regulares (os demais são o tetraedro, o octaedro, o dodecaedro e o icosaedro), que também são denominados Sólidos de Platão. Ele possui 12 arestas, 6 faces e 8 vértices (o que pode ser confirmado pela Equação de Euler: V + F - A = 2).
A menos de sua posição no espaço, um cubo pode ser unicamente determinado pela
medida L
do lado do quadrado que compõe suas faces. A medida da diagonal facial
(isto é, a diagonal que une dos vértices opostos de uma mesma face) é igual
a L * sqrt(2)
.
A medida da diagonal espacial (isto é, a diagonal que une dois vértices opostos,
atravessando o cubo por seu interior) é dada por L * sqrt(3)
.
class Cube {
public:
double L;
Cube(double Lv) : L(Lv) {}
double face_diagonal() const
{
return L*sqrt(2.0);
}
double space_diagonal() const
{
return L*sqrt(3.0);
}
};
A área da superfície do cubo (a soma das áreas de suas faces) é igual a
6L^2
. Já o volume é dado por L^3
. Sendo uma expressão cúbica, é preciso
tomar cuidado com possíveis overflows.
class Cube {
public:
// Membros e construtor
double area() const
{
return 6.0*L*L;
}
double volume() const
{
return L*L*L;
}
};
O cubo tem três esferas associadas:
- a esfera circunscrita, que passa pelos 8 vértices, com raio
L*sqrt(3)/2
; - a esfera inscrita, tangente às 6 faces, com raio
L/2
; - a esfera tangente às arestas, com raio
L/sqrt(2)
.
Um paralelepípedo é uma figura geométrica formada por seis paralelogramos. Em
geral, um paralelogramo é representado por três vetores linearmente
independentes A, B, C
(caso sejam dependentes, temos um paralelepípedo
degenerado, cujo volume é zero).
Enquanto sua área pode ser determinada pelas somas das áreas de suas faces,
o volume pode ser determinado através do módulo do produto misto
V = |<A x B, C>|
, onde
<x, y>
é o produto interno entre os vetores x
e y
. Na prática, este
produto misto é equivalente ao determinante abaixo.
Se conhecidos apenas os comprimentos a, b, c
das arestas e os ângulos internos
m, n, p
formados entre elas, é possível computar o volume do paralelogramo
através da expressão abaixo.
// Definição da classe Vector3D
class Parallelepiped {
public:
Vector3D A, B, C;
Parallelepiped(const Vector3D& Av, const Vector3D& Bv, const Vector3D& Cv) :
A(Av), B(Bv), C(Cv) {}
double volume() const
{
return fabs(A.x*B.y*C.z + A.y*B.z*C.x + A.z*B.x*C.y - A.x*B.z*.Cy
- A.y*B.x*C.z - A.z*B.y*C.x);
}
// Implementação alternativa do método volume()
double volume2() const
{
double a = A.lenght();
double b = B.length();
double c = C.length();
double m = angle(A, B);
double n = angle(A, C);
double p = angle(B, C);
return a*b*c*sqrt(1 + 2*cos(m)*cos(n)*cos(p) - cos(m)*cos(m)
- cos(n)*cos(n) - cos(p)*cos(p);
}
// Outra implementação possível
double volume2() const
double volume3() const
{
return fabs(dot_product(A, cross_product(B, C)));
}
double area() const
{
double AB = cross_product(A, B).length();
double AC = cross_product(A, C).length();
double BC = cross_product(B, C).length();
return 2*(AB + AC + BC);
}
};
O cilindro é uma figura geométrica formada pelos pontos equidistantes de um eixo (segmento de reta) dado. Esta distância fixa recebe o nome de raio r. Em geral, um cilindro é representado pelo raio e pela distância entre as duas faces circulares opostas, denominada altura h.
A área lateral do cilindro é dada por A = 2*PI*r*h + 2*PI*r*r = 2*PI*r*(h + r)
,
isto é, sua área lateral (um retângulo de base 2*PI*r
, que é a circunferência
do círculo e altura h
) e o dobro da área da base (PI*r*r
).
O volume, por sua vez, pode ser computado de duas formas: ou por uma integral de
área, usando coordenadas cilíndricas (x = r\cos theta, y = r\sin theta, z = z
,
onde 0 <= theta <= 2*PI
) ou como uma superfície de revolução em torno do
eixo central. Em ambos casos obtemos V = PI*r*r*h
, que é igual a área da base
vezes a altura.
// Definição da constante PI
class Cylinder {
public:
double r, h;
Cylinder(double rv, double hv) : r(rv), h(hv) {}
double area() const
{
return 2*PI*r*(r + h);
}
double volume() const
{
return PI*r*r*h;
}
};
Um cone é uma figura geométrica formada pela união de todas as retas (ou segmentos de retas) que unem uma base plana (uma região fechada) a um ponto externo ao plano da base, denominado vértice ou apex.
O mais comum dentre os cones é o cone circular reto, onde a base é um círculo e o vértice está localizado na reta perpendicular ao plano onde se encontra o círculo e que passa pelo centro do mesmo. Tal cone pode ser determinado pelo círculo da base (centro e raio) e pela distância do vértice ao plano, denominada H. Se a localização exata do cone não for necessária, bastam apenas a distância H e o raio r do círculo.
O volume do cone circular reto pode ser computado através da integral de
revolução em torno do eixo-x, com 0 <= x <= H
e f(x) = rx/H
, o que
resulta em V = PI*r*r*H/3
.
Já a área da superfície do cone é a soma da área da base (PI*r*r
) mais
a área lateral (PI*r*sqrt(r*r + H*H)
). O valor L = sqrt(r*r + H*H)
surge do
triângulo retângulo formado pelo vértice, pelo centro e por um ponto do círculo.
Se o cone for cortado num segmento de reta que une o círculo ao vértice e
aberto, ele resultará em uma fração do círculo de raio L
, cujo arco é
2*PI*r
, o que resulta em uma área lateral de PI*R*L
.
O tronco de um cone, que é obtido através da seção de um cone por um plano
paralelo à base. Se R
é o raio da base do cone, r
o raio do círculo
resultante da seção, e h
a altura do tronco, o volume do tronco é dado por
V = PI*h*(R*R + R*r + r*r)/3
, sendo obtido pela diferença do volume do cone
maior pelo cone menor.
class Cone {
public:
double r, H;
Cone(double rv, double Hv) : r(rv), H(Hv) {}
double volume() const
{
return PI*r*r*H/3.0;
}
double area() const
{
return PI*r*r + PI*r*sqrt(r*r + H*H);
}
double frustum(double rm, double h) const
{
return PI*h*(r*r + r*rm + rm*rm)/3.0;
}
};
HALIM, Steve; HALIM, Felix. Competitive Programming 3, Lulu, 2013.
The University of Georgia. Volume of a Frustum of a Right Circular Cone. Acesso em 03/08/2016.
Wikipedia. Cylinder (geometry)
Wkipedia. Parallelepiped