Перевод горизонтально перевернутых четырехугольников

Пару дней назад я задал вопрос о переводы и повороты в Processing.

Я хотел:

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

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

введите здесь описание изображения

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

введите здесь описание изображения

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

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

введите здесь описание изображения

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

СЦЕНАРИЙ

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();
}

person solub    schedule 09.01.2019    source источник
comment
@KevinWorkman Вы кажетесь очень активным, когда дело доходит до поиска перекрестных постов, но я был бы признателен, если бы вы могли вместо этого помочь   -  person solub    schedule 09.01.2019
comment
Пожалуйста, имейте в виду, что люди, помогающие вам, делают это бесплатно, в свое личное время. Я искренне надеюсь, что вы найдете свой ответ, но, пожалуйста, уважайте время других людей. Публикация на нескольких сайтах допустима, но, пожалуйста, устанавливайте ссылки между публикациями, чтобы мы не повторяли уже полученные советы. Удачи.   -  person Kevin Workman    schedule 09.01.2019
comment
Тег translation предназначен специально для перевода языка, например. с английского на немецкий. Не для изображений, поэтому редактирование было сделано в тегах. Пожалуйста, не откатывайтесь снова.   -  person Adriaan    schedule 29.01.2019
comment
@ Адриан, я понимаю. Однако я бы сказал, что перевод относится к очень специфической функции обработки (например, вращению), и что перевод-анимация вводит в заблуждение и сбивает с толку: это НЕ анимация, и этот термин не принадлежит терминологии, используемой сообществом обработки.   -  person solub    schedule 29.01.2019
comment
@solub конечно, но, пожалуйста, опубликуйте это в Meta в этом случае, потому что, как в настоящее время читаются отрывки тегов и вики-страницы, вот как это стоит. Перевод, увы, используется как для математической, так и для лингвистической техники, и выбор был сделан в пользу последней.   -  person Adriaan    schedule 29.01.2019


Ответы (1)


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

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();
}

введите здесь описание изображения

person solub    schedule 11.01.2019