Как мне создать функцию для генерации правильной трехмерной пирамиды в процессе обработки 3? - PullRequest
1 голос
/ 16 мая 2019

Я только начинаю с обработки. Итак, я хочу создать функцию, которая позволит любому пользователю вводить количество сторон для создания трехмерной пирамиды. Я использую обработку 3. Мне нужна помощь. Заранее спасибо. Я написал фрагмент своего кода, который работает на данный момент, но я хочу обобщить его. Любые предложения / подсказки будут благодарны. Заранее спасибо, ребята.

  size(640, 360, P3D);
  background(0);
  translate(width/2, height/2, 0);
  stroke(255);
  rotateX(PI/2);
  rotateZ(-PI/6);
  noFill();
  beginShape();
  vertex(-100, -100, -100);
  vertex( 100, -100, -100);
  vertex(   0,    0,  100);
  vertex( 100, -100, -100);
  vertex( 100,  100, -100);
  vertex(   0,    0,  100);
  vertex( 100, 100, -100);
  vertex(-100, 100, -100);
  vertex(   0,   0,  100);

  vertex(-100,  100, -100);
  vertex(-100, -100, -100);
  vertex(   0,    0,  100);
  endShape();

1 Ответ

2 голосов
/ 19 мая 2019

Создайте функцию, которая может рисовать пирамиду, с параметрами для количества сторон и размера пирамиды. Например, параметрами для размера могут быть диаметр (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);
}
...