Я создал многоугольник при обработке с помощью функции vertex ()
Теперь я хочу свернуть этот многоугольник, как показано на изображении ..ссылка ниже. Помогите, пожалуйста.
void setup() {
size(400, 400);
}
float angle=0, yl, dx=0;
int N=4, r=50;
void draw() {
background(-1);
if (left) dx-=1;
if (right) dx+=1;
if (mousePressed==true)N = (int)map(mouseX, 0, width, 3, 25);
translate(width>>1, height>>1);
line(-width/2, 0, width/2, 0);
float innerAngle = PI-TWO_PI/N;
translate(0, -r);
rotate(PI/2);
//------------------------------------------
float theta = acos(dx/r);
float dy = r*sin(theta);
//float dx = r*cos(theta);
//------------------------------------------
pushMatrix();
translate(dx, dy);
rotate(PI/2-theta);
polygon(N, r);
popMatrix();
}
void polygon(int edges, int r) {
noFill();
beginShape();
for (int i=0; i<edges; i++) {
float x = r*cos(i*TWO_PI/edges);
float y = r*sin(i*TWO_PI/edges);
line(0, 0, x, y);
vertex(x, y);
pushStyle();
fill(0);
text(i+1, x, y);
popStyle();
}
endShape(CLOSE);
ellipse(0, 0, 2, 2);
}
boolean right=false, left=false;
void keyPressed() {
if (key==CODED) {
if (keyCode == LEFT) {
left=true;
}
if (keyCode == RIGHT) {
right=true;
}
}
}
void keyReleased() {
left=false;
right=false;
}
2 ответа
Я скопировал этот код и не помню, кто это. Получил с форума Procesing. Я думаю, это может быть код Амнона, но не уверен, что может быть код Кварка. В любом случае это был ответ на вопрос на форуме, который я больше не могу найти. Это может помочь вам начать работу. Однако он вращает прямоугольник:
Square square;
void setup() {
size(600, 200);
smooth();
square = new Square(30, 100, 40, 60, 0.05);
}
void draw() {
background(200);
line(0, square.y+square.h/2, width, square.y+square.h/2);
square.update();
square.display();
}
class Square {
float x, y, w, h, speed, rX, rY;
PVector[] p;
Square(float x, float y, float w, float h, float speed) {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
this.speed = speed;
// corner points
p = new PVector[4];
p[0] = new PVector(-w/2, -h/2);
p[1] = new PVector(w/2, -h/2);
p[2] = new PVector(w/2, h/2);
p[3] = new PVector(-w/2, h/2);
}
void update() {
// rotate corners and find most-bottom corner
PVector bott = new PVector();
for (int i = 0; i<p.length; i++) {
p[i].rotate(speed);
if (p[i].y > bott.y) {
bott = p[i];
}
}
// calculate x-value
float lastrX = rX;
rX = x + (w/2 - bott.x);
if (lastrX > rX) {
x += (lastrX - rX);
rX += (lastrX - rX);
} // calculate y-value
rY = y - (bott.y-h/2);
}
// draw rectangle
void display() {
pushMatrix();
translate(rX, rY);
beginShape();
vertex(p[0].x, p[0].y);
vertex(p[1].x, p[1].y);
vertex(p[2].x, p[2].y);
vertex(p[3].x, p[3].y);
vertex(p[0].x, p[0].y);
endShape();
popMatrix();
}
}
Поверните многоугольник по часовой стрелке вокруг самой правой вершины, касающейся «земли», пока другая вершина не коснется земли. Затем поверните многоугольник вокруг этой вершины, как хотите.
Совет: сделайте многоугольник на одном уровне с землей, прежде чем повернуть новую вершину (игнорируя первую вершину, которую нужно повернуть). В противном случае вращаемая вершина может быть выше или ниже земли.
Примечание: не похоже, что вы вращаете его вокруг какой-либо конкретной вершины и, следовательно, вероятно, просто вращаете его вокруг центра многоугольника, что выполнимо, но гораздо сложнее для работы.
Похожие вопросы
Новые вопросы
processing
Обработка - это язык программирования с открытым исходным кодом и среда для людей, которые хотят создавать изображения, анимацию, взаимодействия и игры.