Processingで歯車(その1 作成編)

Processing
スポンサーリンク

Processingでインボリュート歯車

以下がProcessingでインボリュート歯車を描くコードになります。

Class化したので色々活用できそうです。また、スペースキーを押すと歯車を回転させることができます。

Gear gr;
boolean roll = false;

void setup() {
  size(600, 600);
  gr = new Gear(PI/9, 15, 18); //圧力角PI/9(20°), 歯数:z=15, モジュール:m=18
  smooth();
}

void draw() {
  background(255);
  translate(width/2, height/2);
  if (roll) {
    pushMatrix();
    rotate(frameCount/200.0);
    gr.display();
    popMatrix();
    gr.hole();
  }
  else {
    gr.display();
    gr.hole();
  }
}

void keyPressed() {
  if (key==' ') roll = !roll;
}

class Gear {
  float d, r, ra, rb, rf;
  float alpha, z, m;
  //インボリュート関数
  float inv(float a) { 
    return tan(a) - a;
  }

  Gear(float _alpha, float _z, float _m) {
    alpha = _alpha;
    z = _z;
    m = _m;
    d = m * z;
    r = (m * z)/2; //基準円半径
    ra = ((z+2) * m)/2; //歯先円半径
    rb = (d * cos(alpha))/2; //基礎円半径
    rf = ((z-2.5) * m)/2; //歯底円半径
  }
  
  void display() {
    float beta = acos(rb/ra);
    float x2 = ra*cos(inv(beta));
    float phi_2 = acos(x2/ra); //点2の角度
    
    float theta_b = PI/z + 2*(inv(alpha));
    float x3 = ra*cos(inv(beta) - theta_b);
    float phi_3 = acos(x3/ra); //点3の角度
    
    float x5 = rf*cos(theta_b);
    float y5 = rf*sin(theta_b);
    
    fill(200);
    beginShape();
    for (float j = 0; j < 2*PI; j+=2*PI/z) {
      //歯元部
      vertex(rf*cos(j), -rf*sin(j));
      vertex(rb*cos(j), -rb*sin(j));
      
      //基礎円から歯先円までのインボリュート曲線
      for (float r = rb; r <= ra; r+=0.5) {
        float beta_r = acos(rb/r);
        float x12 = r*cos(inv(beta_r));
        float y12 = r*sin(inv(beta_r));
        float x12j = x12*cos(j) - y12*sin(j);
        float y12j = x12*sin(j) + y12*cos(j);
        vertex(x12j, -y12j);
      }
      
      //歯先円
      for (float i = phi_2; i <= phi_3; i+=0.03f) {
        float x23 = ra*cos(i);
        float y23 = ra*sin(i);
        float x23j = x23*cos(j) - y23*sin(j);
        float y23j = x23*sin(j) + y23*cos(j);
        vertex(x23j, - y23j);
      }
      
      //反転のインボリュート曲線
      for (float r = ra; r >= 0; r-=0.5) {
        float beta_r = acos(rb/r);
        float x34 = r*cos(inv(beta_r) - theta_b);
        float y34 = r*sin(inv(beta_r) - theta_b);
        float x34j = x34*cos(-j) - y34*sin(-j);
        float y34j = x34*sin(-j) + y34*cos(-j);
        vertex(x34j, y34j);
      }
      
      //点4から点5の線
      vertex(x5*cos(j)-y5*sin(j), -x5*sin(j)-y5*cos(j));
      
      //歯底円
      for (float i = theta_b; i <= 2*PI/z; i+=0.03f) {
        float x56 = rf*cos(i);
        float y56 = rf*sin(i);
        float x56j = x56*cos(j) - y56*sin(j);
        float y56j = x56*sin(j) + y56*cos(j);
        vertex(x56j, -y56j);
      }
    }
    endShape();
  }
  
  //穴の作成
  void hole() {
    fill(255);
    ellipse(0,0,50,50);
  }
}

参考文献

歯車技術資料 – 小原歯車工業株式会社
https://www.khkgears.co.jp/gear_technology/guide_info.html

歯車を描く
https://qiita.com/chromia/items/629311346c80dfd0eac7#歯車を作る

・実用メカニズム事典

関連記事

Processingおすすめ本
Processingのおすすめ本を紹介します

コメント

タイトルとURLをコピーしました