Перевод горизонтально перевернутых четырехугольников - PullRequest
0 голосов
/ 09 января 2019

Пару дней назад я задал вопрос о переводах и вращениях в обработке.

Я хотел:

  • переводить, инвертировать и вращать один четырехугольник (объект PShape) несколько раз
  • затем измените высоту одной из 2 верхних вершин

так как все это действует как шарнирное плечо, которое можно сгибать вправо или влево.

enter image description here

Благодаря помощи @ Rabbid76 мне удалось добиться этого эффекта, но теперь я сталкиваюсь с другой проблемой при переводе последних 5 верхних квадратов с горизонтальной инверсией .

enter image description here

При изгибе объекта первые 3 четырехугольника отделяются от последних 5 и. И чем больше изгибающаяся нога изогнута, тем дальше они расходятся.

Я был бы очень признателен, если бы кто-нибудь мог помочь мне исправить часть перевода (от строки 65 до 68), чтобы квады оставались прикрепленными друг к другу, независимо от того, насколько сильны изгибы.

enter image description here

Любое предложение по этому вопросу также будет с благодарностью.

SCRIPT

int W = 40;
int H = 40;
int nQuads = 8;
int xOffset = 27;

float[] p0 = {-W/2 + xOffset, -H/2};
float[] p1 = {-W/2,  H/2};
float[] p2 = {W/2, H/2};
float[] p3 = {W/2, -H/2};

PShape object;


void setup(){
    size(600, 600, P2D);
    smooth(8);
}

void draw(){

    background(255);

    // Bending to the left
    float bending = sin(frameCount*.05) * .1;
    p0[1] -= bending;

    pushMatrix();
    translate(width/2, height/2);


    float minX = min( min(p0[0], p3[0]), min(p2[0], p1[0]) );
    float maxX = max( max(p0[0], p3[0]), max(p2[0], p1[0]) );

    float cptX = (minX+maxX)/2;

    //Rotation Angle
    float angle = atan2(p3[1]-p0[1], p3[0]-p0[0]);

    //Pivot Height
    float PH = p0[1] + (p3[1]-p0[1]) * (cptX-p0[0])/(p3[0]-p0[0]);


    for (int i = 0; i < nQuads; i++){

        float PivotHeight  = (i % 2 == 1) ? PH : H/2; 

        //Height translation
        if (i > 0){
          translate(0, PivotHeight);
        }

        //Rotate once every 2 quads
        if (i%2 == 1){
          rotate(angle*2);
        }

        //Height translation
        //Flip all quads except 1st one
        if (i > 0){
          translate(0, PivotHeight);
          scale(1, -1);
        }

         //NOT working --> Flipping horizontally the last 5 top QUADS
         if (i == 3){
           scale(-1, 1);
           translate(- xOffset, 0); //trying to align the quads on the X axis. Y translation is missing
           rotate(-angle*2);
         }

        object();
    }
    popMatrix();
}

void object() {

    beginShape(QUADS);
    vertex(p0[0], p0[1]);
    vertex(p1[0], p1[1]);
    vertex(p2[0], p2[1]);
    vertex(p3[0], p3[1]);
    endShape();
}

1 Ответ

0 голосов
/ 11 января 2019

Просто предоставлю обходной путь для моего собственного вопроса, но не приму его в качестве правильного ответа, так как я не совсем понимаю, что делаю, и, вероятно, это не самое эффективное решение.

int W = 40;
int H = 40;
int nQuads = 8;
int xOffset = 27;

float[] p0 = {-W/2 + xOffset, -H/2};
float[] p1 = {-W/2,  H/2};
float[] p2 = {W/2, H/2};
float[] p3 = {W/2, -H/2};

PShape object;


void setup(){
    size(600, 600, P2D);
    smooth(8);
}

void draw(){

    background(255);

    // Bending to the left
    float bending = sin(frameCount*.05) * .3;
    p0[1] -= bending;

    pushMatrix();
    translate(width/2, height/2);


    float minX = min( min(p0[0], p3[0]), min(p2[0], p1[0]) );
    float maxX = max( max(p0[0], p3[0]), max(p2[0], p1[0]) );

    float cptX = (minX+maxX)/2;

    //Rotation Angle
    float angle = atan2(p3[1]-p0[1], p3[0]-p0[0]);

    //Pivot Height
    float PH = p0[1] + (p3[1]-p0[1]) * (cptX-p0[0])/(p3[0]-p0[0]);


    for (int i = 0; i < nQuads; i++){

         float PivotHeight  = (i % 2 == 1) ? PH : H/2; 

        //Height translation
        if (i > 0){
          translate(0, PivotHeight);
        }

        //Rotate once every 2 quads
        if (i%2 == 1){
          rotate(angle*2);
        }

        //Height translation
        //Flip all quads except 1st one
        if (i > 0){
          translate(0, PivotHeight);
          scale(1, -1);
       }

         //Flipping horizontally the last 5 top QUADS
         if (i == 3){
           scale(-1, 1);
           translate(0, PivotHeight); 
           rotate(-angle*2);
           translate(0, PivotHeight);
           translate(-xOffset , H/2 - p0[1]);
         }

        object();
    }
    popMatrix();
}

void object() {

    beginShape(QUADS);
    vertex(p0[0], p0[1]);
    vertex(p1[0], p1[1]);
    vertex(p2[0], p2[1]);
    vertex(p3[0], p3[1]);
    endShape();
}

enter image description here

...