« チェーンアンドスプロケットジェネレータ Ver.1.1 | トップページ | くねくねしたものジェネレータ Ver.1.0 »

2011年4月29日 (金)

チェーンアンドスプロケットジェネレータの導出

チェーンアンドスプロケットジェネレータを作るための数式。
自分用の備忘録。

チェーンの生成

チェーンを構成する円は、正多角形の頂点に位置する。

チェーンのリンク数をnChainとすると円の中心同士がなす角度は、2*Math.PI/nChain。
円の半径は0.1[m]なので、シーンの中心から円の中心までの半径rは、
r = 0.1/Math.sin( 2*Math.PI/nChain/2);
となる。

チェーンを構成する円がなす角度をdelta_theta = 2*Math.PI/nChain;とすると、円の角度は、0, delta_theta, delta_theta*2, delta_theta*3……となる。
円を結合する四角の中心は、2つの円の中心の中点にあるから、delta_theta/2, delta_theta/2*3, delta_theta/2*5……となる。

これを一般化して書くと、四角の中心は、
x = r*Math.cos( delta_theta*i+delta_theta/2);
y = r*Math.sin( delta_theta*i+delta_theta/2);
であり、(delta_theta*i+delta_theta/2)だけ傾いていることになる。

半径rで計算しているので、四角の中心は本来あるべき位置より少し外側に行くが、このずれはヒンジが修正する。

スプロケットの生成

右スプロケットの中心( c0x, c0y)=( 0.5, 0)固定とする。
スプロケットの歯をくりぬくための円の中心を( c1x, c1y)とする。
歯をくりぬく円の半径は0.1で歯の数はnSprocketRなので、チェーン生成の場合と同様に、
delta_theta0 = 2*Math.PI/nSprocketR;
theta0 = delta_theta0*i;
c1x = c0x + r*Math.cos( theta0);
c1y = c0y + r*Math.sin( theta0);
となる。

いま着目している歯車を切り抜くための円の位置がtheta0だとすると、そこから右に90度回転したtheta1start = theta0-Math.PI/2からポリゴンの頂点の記述を始める。

くりぬく円は、180度分の円弧をnCogDivで分割する。
描画の方向は右回りでtheta1が減る方向なので、delta_theta1 = -Math.PI/nCogDivとなる。

addPolygonのvecsの記述は、[ x座標, y座標]をカンマで区切って並べたものであるが、最後の( i == nSprocketR-1 && j == nCogDiv-1)の時だけはカンマを必要としない。

プレビュー表示の部分の説明はまた今度。

« チェーンアンドスプロケットジェネレータ Ver.1.1 | トップページ | くねくねしたものジェネレータ Ver.1.0 »

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1499066/39797079

この記事へのトラックバック一覧です: チェーンアンドスプロケットジェネレータの導出:

« チェーンアンドスプロケットジェネレータ Ver.1.1 | トップページ | くねくねしたものジェネレータ Ver.1.0 »