Создайте функцию, которая может рисовать пирамиду, с параметрами для количества сторон и размера пирамиды. Например, параметрами для размера могут быть диаметр (d
) основания и высота (h
) пирамиды:
void drawPyramid(int sides, float d, float h) {
// [...]
}
Сначала вычислите базовые точки пирамиды и сохраните их в массиве PVector
. Точки можно рассчитать как sin()
и cos()
, распределенные по всему кругу (TWO_PI
):
PVector[] basePts = new PVector[sides];
for (int i = 0; i < sides; ++i ) {
float ang = TWO_PI * i / sides;
basePts[i] = new PVector(cos(ang) * d/2, sin(ang) * d/2, -h/2);
}
Нарисуйте стороны пирамиды треугольными примитивами (см. beginShape()
):
beginShape(TRIANGLES);
for (int i = 0; i < sides; ++i ) {
int i2 = (i+1) % sides;
vertex(basePts[i].x, basePts[i].y, basePts[i].z);
vertex(basePts[i2].x, basePts[i2].y, basePts[i2].z);
vertex(0, 0, h/2);
}
endShape();
И нарисуйте основание пирамиды замкнутой формой:
beginShape();
for (int i = 0; i < sides; ++i ) {
vertex(basePts[i].x, basePts[i].y, basePts[i].z);
}
endShape(CLOSE);
См. Следующий пример, в котором используется функция для рисования пирамид с разным числом сторон:
void setup() {
size(640, 500, P3D);
frameRate(4);
}
int no_side = 3;
void draw() {
background(0);
translate(width/2, height/2, 0);
stroke(255);
rotateX(PI/2);
rotateZ(-PI/6);
noFill();
drawPyramid(no_side, 200.0, 200.0);
no_side = no_side < 20 ? no_side+1 : 3;
}
void drawPyramid(int sides, float d, float h) {
PVector[] basePts = new PVector[sides];
for (int i = 0; i < sides; ++i ) {
float ang = TWO_PI * i / sides;
basePts[i] = new PVector(cos(ang) * d/2, sin(ang) * d/2, -h/2);
}
beginShape(TRIANGLES);
for (int i = 0; i < sides; ++i ) {
int i2 = (i+1) % sides;
vertex(basePts[i].x, basePts[i].y, basePts[i].z);
vertex(basePts[i2].x, basePts[i2].y, basePts[i2].z);
vertex(0, 0, h/2);
}
endShape();
beginShape();
for (int i = 0; i < sides; ++i ) {
vertex(basePts[i].x, basePts[i].y, basePts[i].z);
}
endShape(CLOSE);
}