滚动多边形

时间:2014-08-20 19:59:28

标签: processing polygon

我使用vertex()函数

在处理中创建了一个多边形

现在我要滚动此多边形显示在下面的图像..link中。请帮我。

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

2 个答案:

答案 0 :(得分:2)

我已复制此代码,但我不记得是谁。我是从Procesing论坛得到的。我想这可能是Amnon的代码,但不确定Quark的代码。无论如何,这是我在论坛中找不到的问题的答案。它可能会帮助您入门。它正在旋转一个矩形:

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

答案 1 :(得分:0)

围绕最接近“地面”的最右侧顶点顺时针旋转多边形,直到另一个顶点接触地面。然后根据需要围绕该顶点重复旋转多边形。

提示:在旋转新顶点之前使多边形与地面齐平(忽略要旋转的第一个顶点)。否则,旋转的顶点可能高于或低于地面。

注意:看起来你不是在任何特定的顶点周围旋转它,因此可能只围绕多边形的中心旋转它是可行的,但是更难以解决。