Я бы хотел:
- перевод , инвертирование и поворот один четырехугольник (объект PShape) несколько раз
- затем изменить высоту одной из двух верхних вершин
так что все это действует как шарнирное плечо , которое можно согнуть вправо или влево .
Чтобы было как можно яснее, я сделал несколько рисунков.
Я знаю, что могу:
- перевод четырехугольника с использованием
translate()
- Отразить (инвертировать) с помощью
scale(1, -1)
- поверните , используя функцию
atan2()
ПРОБЛЕМА
При объединении 3 вместе я получаю следующее:
Угол поворота кажется правильным, но, очевидно, что-то не так с переводом (по оси X или Y), и я не могу понять, что именно.
Я подозреваю, что отсутствует перевод для стержня или неправильный порядок преобразований (или, может быть, оба).
Я был бы очень признателен, если бы кто-нибудь помог мне понять, что я делаю неправильно и как решить эту проблему.
int W = 40;
int H = 40;
int offset = 10;
float[] p0 = {-W/2, -H/2};
float[] p1 = {-W/2, H/2};
float[] p2 = {W/2, H/2};
float[] p3 = {W/2, -H/2 - offset};
PShape object;
void setup(){
size(600, 600, P2D);
smooth(8);
noFill();
}
void draw(){
background(255);
pushMatrix();
translate(width>>1, height>>1);
float angle = atan2(p3[1] - p0[1], p3[0] - p0[0]);
for (int i = 0; i < 6; i++){
int factor = (i % 2 == 0) ? 1 : -1;
//Height translation
translate(0, H*factor);
//Flip all quads except 1st one
if (i > 0){
scale(1, -1);
}
//Rotate once every 2 quads
if (i%2 == 1){
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();
}