こないだの、OpenSCADで作ってたトロコイドポンプの
プログラム、計算の関数周り以外を大改修して、
影との引き算を使わないロジックに変更してみた。
結果、動くといえば動くんだけど、やっぱり妙な
スリットが出来ちゃうのは相変わらずだなぁ。
とりあえず出来た感じはこんな。
外側8歯はもちろん、
外側4歯も大丈夫。
絵は載せてないけど外側3歯もokだった。
けど、やっぱり5枚歯以下が登場すると、変なスリット
が出てきちゃうので、色々と弄り回して、なんとか
スリットが出て来ないようにしてみたのがこの4枚歯
の例。
どうやら、歯の曲面の曲がり具合に対して、特殊変数$fa
(最小角の断片の設定)が小さすぎると、太さゼロの
ポリゴンみたいなものが出来ちゃって、だめみたい。
なので、与えられたパラメタを使い、バグらない範囲に
$faを設定するように計算する処理を入れてみた。
なぜこの値(計算式)に設定するのかについては、
単なる経験則であって、いわゆるマジックナンバー
なので、正直気持ち悪い。
あともう少し微小に分割したいんだけど、これ以上
分けちゃうと、今のロジック・計算式だとどうしても
上手くいかない。ポンプとしては少し表面が粗い。
とりあえず現時点のプログラムを載っけておく。
/**************/
/* parameters */
/**************/
// radial of outer circle
outer_r = 20;
// number of outer teeth (must be a even number)
out_teeth = 4;
// degrees par step
$fa = 15 / out_teeth; // it is a magic number
/******************/
/* sub parameters */
/******************/
// tooth height (radial of small circle)
tooth_h = outer_r / (out_teeth * 2);
// radial of inner circle
inner_r = outer_r - (tooth_h * 2);
// number of inner teeth
in_teeth = out_teeth - 1;
/*************/
/* functions */
/*************/
// Epicycloid(outer circloid) //
function epicycloid_x (r1, r2, agl) =
(r1 + r2) * cos(agl)
- r2 * cos (((r1 + r2) / r2) * agl);
function epicycloid_y (r1, r2, agl) =
(r1 + r2) * sin(agl)
- r2 * sin (((r1 + r2) / r2) * agl);
// hypercycloid(inner circloid) //
function hypercycloid_x (r1, r2, agl) =
(r1 - r2) * cos(agl)
+ r2 * cos ((-(r1 - r2) / r2) * agl);
function hypercycloid_y (r1, r2, agl) =
(r1 - r2) * sin(agl)
+ r2 * sin ((-(r1 - r2) / r2) * agl);
// trochoid //
function trochoid_x (r1, r2, agl) =
(floor( agl / (360 / r2) * 2) % 2 == 1)
? epicycloid_x (r1, tooth_h, agl)
: hypercycloid_x (r1, tooth_h, agl);
function trochoid_y (r1, r2, agl) =
(floor( agl / (360 / r2) * 2) % 2 == 1)
? epicycloid_y (r1, tooth_h, agl)
: hypercycloid_y (r1, tooth_h, agl);
/***********/
/* modules */
/***********/
// a trochoid //
module trochoid_gear (a, b) {
for (i = [1: (360 / $fa)]) {
echo(i);
agl1 = i * $fa; // now angle
agl2 = (i+1) * $fa; // next angle
x1 = trochoid_x(a, b, agl1);
y1 = trochoid_y(a, b, agl1);
x2 = trochoid_x(a, b, agl2);
y2 = trochoid_y(a, b, agl2);
echo (x1, y1);
polygon (points = [[0,0],[x1,y1],[x2,y2]] );
}
}
/**************/
/* draw gears */
/**************/
linear_extrude(10) {
// outer gear
trochoid_gear (outer_r, out_teeth);
// inner gear
translate ([0, outer_r * 3, 0]) {
trochoid_gear (inner_r, out_teeth - 1);
}
translate ([outer_r * 3, 0, 0]) {
difference () {
// outer gear
trochoid_gear (outer_r, out_teeth);
// inner gear
translate ([tooth_h * 2, 0, 0]) {
trochoid_gear (inner_r, out_teeth - 1);
}
}
}
}
「outer_r」に、外側ギヤの平均外周(凸と凹を均した
円周)を指定して、「out_teeth」にギヤの歯数を指定
すれば、外側がその歯数のトロコイドポンプの図形を
描いてくれるという寸法。
これを、そのままライブラリとして利用するための
ことを、まだ詰め切れていないので、あとでもう
ちょっと整理する必要あり。
ちなみに現状は、ポリゴン(2Dオブジェクト)でそれぞれ
の断面を描くところまでが大事な処理の中心で、それを
extrudeで立体化しているのはサンプルとしてのおまけ。
なので、ライブラリ化するとしたら、この立体化している
部分は実行させない必要があるので、「include」では
なく、「use」で読み出す必要あり。
ただ、その際に、ライブラリ内部で$faを操作している
ので、その辺がちゃんと動くのかどうかとか、そもそも
$faをライブラリファイルの中でいじっているときに、
呼び出し元に悪さしないのかどうかとかを忘れて
しまった…。
あとでその辺整理しなおしてみようかなと。
このポンプの図形(断面)はトコロイド曲線だろうから、
https://www.youtube.com/watch?v=2NOpQG_pzq8&t=150
こういう感じの流体ポンプにも応用できるはずなんだ
よな。
なんにしても、現状の計算式を元にしちゃうと、ギヤの
中心からポリゴンを描こうとしちゃうため、太さがゼロ
のポリゴンが出て来ておかしなことになっちゃうので、
http://aozoragakuen.sakura.ne.jp/taiwa/taiwaNch04/hikari/node4.html
この2つのベクトルを別々に扱って、内側は内側の軌跡
だけを繋いで平面を作り、外側は外側だけで平面を作り、
それらを合成する、っていう感じに分ければ、太さゼロ
のポリゴンは出て来ないだろうと思うんだよな…
でもなぁ。厳密に言うと、太さゼロのポリゴンなんて、
本当は出来ていないはずなんだけど、これができちゃう
理由って、なんだろう?内部が単精度か何かで計算して
いたりするの?うーーーん。
https://twitter.com/Yokohama_Geo/status/1036442684016095232
サマータイムで、IoT機器みたいな、すでに配置して
あるような機器のメンテは結構やばそうだな。
特にこういう、地震計みたいなやつ。
https://www.youtube.com/watch?v=1AJ3y5vH4is&t=332
100均でタイマーライトなんて売っているのか…。
作ろうと思っていたのに。
この時間を設定するメカ(というか回路部分)、なかなか
興味深いんだけど、回路自体はこの間Aliexで買った、
長時間タイマーモジュールと似ているなぁ。
でも、これが100円で売ってるなら、1個欲しい。セリア
かな?ダイソーかな?
https://twitter.com/handaru20pF/status/1029936308553052160
「よし」
https://twitter.com/yori_shirou/status/1030431258231300097
「よし」
https://twitter.com/tks/status/1036423945778475008
>「がんばったらできた」経験を現在進行系で
>やってないと老け込む
解る気がする。
そういえば、多感な時期に聴いた音楽って、それから
ずっと引きずるものなんだけど、それって、若いころ
は気になった音楽があったら、歌詞やメロディーを
一生懸命覚えたり、楽器持ってる人は弾けるように
練習したりっていう、「がんばる」を無意識のうちに
多かれ少なかれやっていたからなのかなぁ?って気が
してたりする。
最近は、良い音楽に出会っても、あまり一生懸命
聴かないもんな。