Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What is going on with this article?
@NekoCan

[Processing]ProcessingでProcessingを描くProgram

Processingのロゴを描く

TheProcessing3.gif

プログラム

言ってしまえば全然きれいなコードではないので、そのうちきれいにして追加しておきます

The_Processing.java

//全体回転
float rY = 0;

//文字の奥行
int length = 50;

//アニメーション管理
int mode = 0;

//タイマー用
int count;

//それぞれのクラスを宣言
P p ;
Three three;
Back back;
Line[] lines = new Line[21];

void setup() {
  size(1500, 900, P3D);
  //fullScreen(P3D);
  frameRate(30);
  strokeWeight(1);

  //セットアップ
  SetUpMark();
  SetUpLines();
}

void SetUpP3() {
  p = new P(100, 50, length, 180);
  three = new Three(100, 50, length, 200);
}

void SetUpMark() {
  SetUpP3();
  back = new Back(400, 50, length, 360);
}
void SetUpLines() {
  lines[0] = new Line(320, -150, 85, -225);
  lines[1] = new Line(85, -225, -75, -300);
  lines[2] = new Line(-75, -300, 100, -340);
  lines[3] = new Line(-75, -300, -120, -340);
  lines[4] = new Line(-75, -300, -200, -75);
  lines[5] = new Line(-200, -75, -340, -150);
  lines[6] = new Line(-200, -75, -350, -10);
  lines[7] = new Line(-200, -75, -250, 0);
  lines[8] = new Line(-200, -75, -150, 275);
  lines[9] = new Line(-200, -75, -120, 10);
  lines[10] = new Line(-250, 0, -330, -100);
  lines[11] = new Line(-250, 0, -350, 10);
  lines[12] = new Line(-250, 0, -300, 200);
  lines[13] = new Line(-250, 0, -150, 275);
  lines[14] = new Line(-250, 0, -120, 10);
  lines[15] = new Line(-120, 10, -150, 275);
  lines[16] = new Line(-150, 275, 50, 275);
  lines[17] = new Line(50, 275, 225, 30);
  lines[18] = new Line(225, 30, 320, -150);
  lines[19] = new Line(225, 30, 85, -225);
  lines[20] = new Line(50, 275, -120, 10);
}

void draw() {
  lights();
  perspective();
  background(0);

  translate(width/2, height/2, -500); //中心に移動
  rotateY(rY); // 全体回転

  if (mode != 3) {
    DrawLines();
    noStroke();
    fill(255);
    if (lines[19].x == lines[19].x2) {
      p.Draw();
      pushMatrix();
      translate(0, -150);
      if (p.r == p.radian)three.Draw();
      popMatrix();
    }
  }
  if (three.H == 75 || mode == 3) {
    back.Draw();
  }

  //アニメーションモードごとに管理
  switch(mode) {
  case 0:
    //8PI回ったら次のモード
    Rotater(8);
    break;

  case 1:
    //約3秒待ったら次のモード(ここシャッターチャンス)
    WaitCounter(3);
    break;

  case 2:
    rY -= 0.01f;
    if (rY < -PI/2) {
      mode++;
      SetUpP3();
      SetUpLines();
    }

  case 3:
    rY -= 0.01f;
    if (back.r == 0) {
      rY = 0;
      mode = 0;
      SetUpMark();
    }
    break;
  }
}//********** void draw()*************//

class P {

  float topH = 0; //上の高さ
  float midH = 0; //真ん中の高さ
  float botH = 0; //下の高さ
  int r = 0;    //半円の角度
  float radius;
  int wid, length, radian;

  P(float radius, int wid, int length, int radian) {
    topH = 0;
    midH = 0;
    botH = 0;
    r = 0; 
    this.radius = radius;
    this.wid = wid;
    this.length = length;
    this.radian = radian;
  }

  void Draw() {
    pushMatrix();
    translate(-50, 200 + (50-botH/2));  
    box(150, botH, length);
    if (botH != 50) botH++;
    popMatrix();

    pushMatrix();
    translate(-50, -50 + (250-midH/2));
    if (botH == 50) {
      box(50, midH, length);
      if (midH != 250) midH++;
    }
    popMatrix();

    pushMatrix();
    translate(-75, -100 + (50-topH/2));
    if (botH == 50 && midH == 250) {
      box(100, topH, length);
      if (topH != 50) topH++;
    }
    popMatrix();

    if (botH == 50 && midH == 250 && topH == 50) {
      Curve(radius, wid, length, r);
      if (r < radian) r++;
    }
  }

  void Reset() {
    topH = midH = botH = 0;
  }
}

class Three {

  int H = 0;
  int r = 0;    //半円の角度
  float radius;
  int wid, length, radian;

  Three(float radius, int wid, int length, int radian) {
    H = 0;
    r = 0;
    this.radius = radius;
    this.wid = wid;
    this.length = length;
    this.radian = radian;
  }

  void Draw() {
    pushMatrix();
    translate(12.5f, 0);
    Curve(radius, wid, length, r);
    if (r < 200) r++;
    popMatrix();

    pushMatrix();
    translate(-12.5f, -22.5f - (75-H/2));
    if (r == 200) {
      box(25, H, length);
      if (H < 75) H++;
    }
    popMatrix();
  }
}

class Back {

  int r = 0;    //半円の角度
  float radius;
  int wid, length, radian;

  Back(float radius, int wid, int length, int radian) {
    r = 0;
    this.radius = radius;
    this.wid = wid;
    this.length = length;
    this.radian = radian;
  }

  void Draw() {
    Curve(radius, wid, length, r);
    if (mode < 2) {
      if (r < radian) r++;
    } else {
      if (r > 0) r--;
    }
  }
}

class Line {
  float x, y, x1, y1, x2, y2;
  float xa, ya;

  Line(float x1, float y1, float x2, float y2) {
    this.x1 = x1;
    this.y1 = y1;
    this.x2 = x2;
    this.y2 = y2;
    x = x1;
    y = y1;
    ya = (y2 - y1)/(x2 - x1); // xが1進んだ時のyの変化量
    xa = Sign(x2-x1); // 進む向き
  }

  void Draw() {
    line(x1, y1, x, y);

    if (x != x2) {
      x += xa;
      y += ya * xa;
    }
  }
}

//全体回転メソッド
void Rotater(float r) {
  rY += 0.01f;
  if (rY >= PI * r) {
    rY = 0;
    mode++;
    count = frameCount;
  }
}

//タイマーメソッド
void WaitCounter(int timer) {
  if (frameCount >= count + frameRate * timer) {
    mode++;
  }
}

//マイナスだったら-1を返すメソッド
float Sign(float a) {
  if (a < 0)return -1;
  else return 1;
}

//バウムクーヘン型を作るメソッド
//  Curve(半径 , 文字幅 , 奥行幅 , 描く角度の最大)
void Curve(float radius, int wid, int length, int radian) {
  float x, y;
  int z = length/2;

  //外側カーブ
  beginShape(QUAD_STRIP);
  for (int deg = 0; deg <= radian; deg += 1) {
    x = sin(radians(deg)) * radius;
    y = cos(radians(deg)) * radius;

    vertex(x, y, z);
    vertex(x, y, -z);
  }
  endShape();

  //内側カーブ
  beginShape(QUAD_STRIP);
  for (int deg = 0; deg <= radian; deg += 1) {
    x = sin(radians(deg)) * (radius - wid);
    y = cos(radians(deg)) * (radius - wid);

    vertex(x, y, z);
    vertex(x, y, -z);
  }
  endShape();

  //バウムクーヘンの層が見える部分(手前)(奥)
  for (int i = -1; i<=1; i++) {
    if (i == 0)continue;
    beginShape(TRIANGLE_STRIP);
    for (int deg = 0; deg <= radian; deg += 1) {
      x = sin(radians(deg));
      y = cos(radians(deg));
      vertex(x* radius, y* radius, z * i);
      vertex(x*(radius - wid), y*(radius - wid), z * i);
    }
    endShape();
  }

  //蓋
  pushMatrix();
  rotateY(PI/2);
  pushMatrix();
  rotateX(radians(radian));
  quad(z, radius-wid, -z, radius-wid, -z, radius, z, radius);
  popMatrix();
  quad(z, radius-wid, -z, radius-wid, -z, radius, z, radius);
  popMatrix();
}

//線を順番に描いていくメソッド
void DrawLines() {
  stroke(255);
  strokeWeight(2);
  lines[0].Draw();
  if (lines[0].x != lines[0].x2) return;
  lines[1].Draw();
  if (lines[1].x != lines[1].x2) return;
  lines[2].Draw();
  lines[3].Draw();
  lines[4].Draw();
  if (lines[4].x != lines[4].x2) return;
  lines[5].Draw();
  lines[6].Draw();
  lines[7].Draw();
  lines[9].Draw();
  if (lines[7].x != lines[7].x2) return;
  lines[10].Draw();
  lines[11].Draw();
  lines[12].Draw();
  lines[13].Draw();
  lines[14].Draw();
  if (lines[13].x < lines[8].x1)return;
  lines[8].Draw();
  if (lines[8].x < -180) return;
  lines[15].Draw();
  if (lines[15].x != lines[15].x2) return;
  stroke(30, 100, 150);
  lines[16].Draw();
  if (lines[16].x != lines[16].x2)return;
  stroke(30, 150, 200);
  lines[20].Draw();
  stroke(60, 200, 300);
  lines[17].Draw();
  if (lines[17].x != lines[17].x2)return;
  lines[18].Draw();
  lines[19].Draw();
}//void DrawLines()
3
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
NekoCan
UnityとかProcessingらへんが生息域の学生です。 リンク「ゲーム投稿サイトUnityRoom」 ねこですよろしくお願いします

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
3
Help us understand the problem. What is going on with this article?