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のおすすめ本を紹介します
コメント