Я создал многоугольник при обработке с помощью функции 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;
}

enter image description here

-1
B L Λ C K 20 Авг 2014 в 23:59
3
В чем конкретно ваш вопрос?
 – 
Sneftel
21 Авг 2014 в 00:03
Я не могу придумать, как заставить мой многоугольник катиться и двигаться вместе, как здесь tube.geogebra.org/ студент/m2874
 – 
B L Λ C K
21 Авг 2014 в 07:09

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();
  }
}
2
v.k. 22 Авг 2014 в 17:18

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

Совет: сделайте многоугольник на одном уровне с землей, прежде чем повернуть новую вершину (игнорируя первую вершину, которую нужно повернуть). В противном случае вращаемая вершина может быть выше или ниже земли.

Примечание: не похоже, что вы вращаете его вокруг какой-либо конкретной вершины и, следовательно, вероятно, просто вращаете его вокруг центра многоугольника, что выполнимо, но гораздо сложнее для работы.

0
Nuclearman 21 Авг 2014 в 08:32
Я пробовал эту реализацию ранее, но это не сработало. Не могли бы вы проиллюстрировать код? Вот как я хотел tube.geogebra.org/student/m2874
 – 
B L Λ C K
21 Авг 2014 в 09:36