![]() |
Матрица статей Список статей Всячина Контакты | ||||||||||||
|
Губка Менгера и пирамида Серпинского Губка Менгера является трёхмерным аналогом ковра Серпинского. Строится она следующим образом. Куб разбивается на 27 равных кубиков и выбрасываются 7 средних, далее то же с оставшимися кубиками, и т. д.
Ниже приведена основная часть кода на Java с помощью которого были получены эти изображения.
public class Cube extends Solid
{
public static Colorer colorer = new SimpleColorer(Color.BLACK, Color.WHITE);
public static Cube createCube(int n)
{
Cube cube = new Cube();
cube.addCube(n, 0.0, 0.0, 0.0, 500.0, true, true, true, true, true, true);
return cube;
}
public static Solid createSquare(Vector center, Vector a, Vector b)
{
Solid solid = new Solid();
Vector[] vertexes = new Vector[3];
vertexes[0] = center.plus(a).plus(b);
vertexes[1] = center.minus(a).plus(b);
vertexes[2] = center.minus(a).minus(b);
solid.add(new Triangle(vertexes, colorer));
vertexes = new Vector[3];
vertexes[0] = center.minus(a).minus(b);
vertexes[1] = center.plus(a).minus(b);
vertexes[2] = center.plus(a).plus(b);
solid.add(new Triangle(vertexes, colorer));
return solid;
}
private void addCube(int n, double centerX, double centerY,
double centerZ, double size,
boolean front, boolean right, boolean back,
boolean left, boolean top, boolean bottom)
{
if (--n > 0)
{
size /= 3.0;
addCube(n, centerX + size, centerY + size, centerZ + size,
size, front, right, false, false, top, false);
addCube(n, centerX + size, centerY , centerZ + size,
size, front, false, true, false, top, true);
addCube(n, centerX + size, centerY - size, centerZ + size,
size, front, false, false, left, top, false);
addCube(n, centerX + size, centerY + size, centerZ ,
size, front, right, true, true, false, false);
addCube(n, centerX + size, centerY - size, centerZ ,
size, front, true, true, left, false, false);
addCube(n, centerX + size, centerY + size, centerZ - size,
size, front, right, false, false, false, bottom);
addCube(n, centerX + size, centerY , centerZ - size,
size, front, false, true, false, true, bottom);
addCube(n, centerX + size, centerY - size, centerZ - size,
size, front, false, false, left, false, bottom);
addCube(n, centerX , centerY + size, centerZ + size,
size, false, right, false, true, top, true);
addCube(n, centerX , centerY - size, centerZ + size,
size, false, true, false, left, top, true);
addCube(n, centerX , centerY + size, centerZ - size,
size, false, right, false, true, true, bottom);
addCube(n, centerX , centerY - size, centerZ - size,
size, false, true, false, left, true, bottom);
addCube(n, centerX - size, centerY + size, centerZ + size,
size, false, right, back, false, top, false);
addCube(n, centerX - size, centerY , centerZ + size,
size, true, false, back, false, top, true);
addCube(n, centerX - size, centerY - size, centerZ + size,
size, false, false, back, left, top, false);
addCube(n, centerX - size, centerY + size, centerZ ,
size, true, right, back, true, false, false);
addCube(n, centerX - size, centerY - size, centerZ ,
size, true, true, back, left, false, false);
}
else
{
size /= 2.0;
if (front)
addAll(createSquare(
new Vector(centerX + size, centerY, centerZ),
new Vector(0, size, 0),
new Vector(0, 0, size)));
if (right)
addAll(createSquare(
new Vector(centerX, centerY + size, centerZ),
new Vector(-size, 0, 0),
new Vector(0, 0, size)));
if (back)
addAll(createSquare(
new Vector(centerX - size, centerY, centerZ),
new Vector(0, -size, 0),
new Vector(0, 0, size)));
if (left)
addAll(createSquare(
new Vector(centerX, centerY - size, centerZ),
new Vector(size, 0, 0),
new Vector(0, 0, size)));
if (top)
addAll(createSquare(
new Vector(centerX, centerY, centerZ + size),
new Vector(0, size, 0),
new Vector(-size, 0, 0)));
if (bottom)
addAll(createSquare(
new Vector(centerX, centerY, centerZ - size),
new Vector(size, 0, 0),
new Vector(0, -size, 0)));
}
}
}
Пирамида Серпинского является трёхмерным аналого треугольника Серпинского. Ниже приведены несколько шагов построения пирамиды Серпинского.
Ниже приведён фрагмент кода на Java с помощью которого были получены эти изображения.
public class Tetrahedron extends Solid
{
public static Colorer redColorer = new MonoColorer(Color.RED);
public static Colorer blueColorer = new MonoColorer(Color.BLUE);
public static Colorer yellowColorer = new MonoColorer(Color.YELLOW);
public static Colorer greenColorer = new MonoColorer(Color.GREEN);
public static Tetrahedron createTetrahedron(int n)
{
Tetrahedron cube = new Tetrahedron();
cube.addTetrahedron(n, new Vector[] {
new Vector(-2 / (3 * sqrt(2)), 2 / sqrt(6), - 1.0 / 3).mul(200),
new Vector(4 / (3 * sqrt(2)), 0, -1.0 / 3).mul(200),
new Vector(-2 / (3 * sqrt(2)), -2 / sqrt(6), - 1.0 / 3).mul(200),
new Vector(0,0,1).mul(200)});
return cube;
}
private void addTetrahedron(int n, Vector[] v)
{
if (--n > 0)
{
addTetrahedron(n, new Vector[] {
v[0],
v[0].plus(v[1]).mul(0.5),
v[0].plus(v[2]).mul(0.5),
v[0].plus(v[3]).mul(0.5)});
addTetrahedron(n, new Vector[] {
v[0].plus(v[1]).mul(0.5),
v[1],
v[1].plus(v[2]).mul(0.5),
v[1].plus(v[3]).mul(0.5)});
addTetrahedron(n, new Vector[] {
v[0].plus(v[2]).mul(0.5),
v[1].plus(v[2]).mul(0.5),
v[2],
v[2].plus(v[3]).mul(0.5)});
addTetrahedron(n, new Vector[] {
v[0].plus(v[3]).mul(0.5),
v[1].plus(v[3]).mul(0.5),
v[2].plus(v[3]).mul(0.5),
v[3]});
}
else
{
add(new Triangle(new Vector[] {v[1], v[0], v[3]}, redColorer));
add(new Triangle(new Vector[] {v[2], v[1], v[3]}, blueColorer));
add(new Triangle(new Vector[] {v[2], v[0], v[3]}, yellowColorer));
add(new Triangle(new Vector[] {v[0], v[2], v[1]}, greenColorer));
}
}
}
Скачать:
Смотрите также: Ссылки: |