ねこでじ(Nekodigi)

Nekodigi’s diary

学習中の気づきをまとめています。応援よろしくお願いします

【Processing】ばねのように元の形に戻ろうとする木を作る

成果物

www.youtube.com
形状記憶するばねのコードを作ったので、木のフラクタルに適応してみました。

仕組み

形状記憶するばね
nekodigi.hatenablog.com
木のフラクタル
nekodigi.hatenablog.com
形状記憶するばねはNodeとそれをつなぐSpringがあれば使うことができます。なので、木のフラクタルの初期位置関係をばねに記録しておき、一番根元のNodeだけマウスで動かしてやるとこのようになります。

コード

Flexible Treeという名前で追加しています。
github.com

【Processing】形状記憶するばねを作る

成果物

www.youtube.com
動画では滑らかに動いていますが、速度の減衰などを変えるとばねのような動きをすることもできます。

仕組み

相対的(親ノード基準の座標)な初期位置をはじめに記録しておき、変形したときに、最初の位置関係に少しずつ移動していくと、このような動きになります。また、位置を直接変えず、速度を変えることで慣性を再現しています。
また、3つのノードの位置を使ってベジエ曲線でつないでいます。
ちなみに、Springの初期化で先に設定する方が親ノードで、形状記憶が適応されるのは動かしたノードの子ノードたちみたいです。双方向に適応させるアイデアが見つかったらまた投稿しようと思います。

コード

Shape memory spring smoothという名前で追加しています。
github.com

【Processing】コロナウイルスの感染者を国の大きさで表す

成果物

www.youtube.com
今回は、コロナウイルスの感染者数を国の大きさで表してみました。中央に集まるグラフと組み合わせて大きいものが真ん中に行くようにしました。

仕組み

国の画像 https://github.com/djaiss/mapsicon
コロナウイルスデータ https://github.com/owid/covid-19-data/tree/master/public/data
国名から国名コードに変換 https://datahub.io/core/country-list
こちらの画像データとCSVデータを組み合わせて視覚的に表示してみました。

手順

まず、コロナウイルスデータから、感染者と国名を取得します。ただし、国の画像のフォルダ名は国名コードになっているので、もう一つCSVを使って、国名コードに変換し、感染者と国の画像をひも付けします。
あとは、前回のコードを使って大きいものが真ん中に行くようにします。
nekodigi.hatenablog.com

コード

Covid_Map_Attractという名前で追加しています。
github.com

【Processing】中央に集まるグラフを作る

成果物

www.youtube.com
今回は、中央に大きいものが集まるグラフを作ってみました。ただ少し欠陥があり、時間が経つと混ざってしまうので、今後改良していきたいです。

仕組み

丸に真ん中に集まる向きの力と、ぶつからないように回避する力を加えています。また、大きなものの方が早く移動するようにすることで真ん中に大きいものが集まるようにしました。(現実の物理法則とは異なります)

コード

Center Attractという名前で追加しています。
github.com

【Processing】画像を極座標とイージングを使って変形させる

成果物

www.youtube.com
今回は、顔をゆがませるような円形の変形で極座標の考え方が使えそうだと思ったので、早速やってみました。

仕組み

まず、直交座標を、極座標に変換します。今回は、そのr成分をEaseOutCubic使って加工してみました。ただ、画像を変形させるためには、画面上の位置から逆変換して画像上の位置を求めなければならないので、逆変換の式を求めました。
 \begin{array}{l}
EaseOutCubicの式\\
y=1-( 1-x)^{3}\\
1-y=( 1-x)^{3}\\
1-x=\sqrt[3]{1-y}\\
x=1-\sqrt[3]{1-y}
\end{array}

コード

Polar_Coordinate_Cubic_Transformという名前で追加しています。
github.com

【工作】爪楊枝で二つの正四面体が合体した形のTensegrityを作る

成果物

www.youtube.com

仕組み

今回は、こーじさんの動画を参考にして作りました。こーじさんは正四面体と似た形で作ってましたが、思い切って正四面体で作ってみたらもっと綺麗に作れるのでは、ということで作ってみました。
www.youtube.com

【数学友達にプログラミングを教える】#1-Processing入門編

目標

f:id:Nekodigi:20200501231728g:plain
左の二つのコードをもとに、右のカラフルなSin波のグラフを作る。できれば、アレンジしてグラフなど表示してみる。

教えたこと

  • Processingが描画系に特化していることや、記述がコンパクトにできることを教える。
  • Processingの描画系について教える。

  • PVector.fromAngle()でなぜnewがいらないのか、ちょっとやりすぎな気もするけどサンプルコードで解説(やりすぎたので一旦保留)


PVector.fromAngleがそれ自身のクローンを返してることについて解説

目標の手掛かり

この、色のサンプルと、Sin波のサンプルを組み合わせると、カラフルなSin波が作れます。

コード

github.com

【Processing】カルマン渦をシュミレーションする。

成果物

濃度表示

www.youtube.com

粒子を使った速度場の視覚化

www.youtube.com
今回は、Cのプログラムを参考にしてカルマン渦のシュミレーションを行ってみました。前回作ったシュミレーションはゲーム用の目的で考案されたアルゴリズムで、直感的なアプローチで計算されていたのですが、今回のシュミレーションではPoisson方程式などを使って求めていて、より忠実というイメージでした。ただ、あまり渦を巻いていないのが残念です。情報が集まったらまたリベンジしたいです。

コード

Karman Vortexという名前で追加しています。視覚化の仕方を変えて3種類用意しています。
github.com
今回は、こちらのサイトを参考に作っています。
github.com

【Processing】パーリンノイズを多角形状に配置し、干渉させてみる

成果物

www.youtube.com
今回は、見やすくするため、数値を割ったあまりを表示しています。特に、三角形の場合は、計算コストもある程度抑えられ、違和感を感じずにダイナミックに変化するノイズを作り出してくれます。また、いくつもの対称性があるのでそのままでもきれいです。

仕組み

多角形に配置すると言っても、辺の角度に合わせて原点を通る軸を配置し、各軸からの距離をパーリンノイズの入力とすることで同じようなことを実現しています。ちなみに、軸からの距離は、軸の法線と位置ベクトルとの内積で求めています。

コード

Interfrence of polygonal perlin noiseという名前で追加しています。
github.com

【Processing】回転を加えるアトラクタを作ってみる。

成果物

www.youtube.com
今回は、物体を引き寄せるアトラクタに回転加える動作を加えてみました。なかなかきれいな見た目に仕上がったかと思いますが。多少違和感があるので今後改良したいです。

仕組み

アトラクタは、点に近づけるような力を加えますが。近づける方向と垂直な方向に力を加えると回転運動を始めるようになります。ただし、そのままではうまく回らないので、距離によって力の強さなどを変えています。

コード

Rotation_Attractor_1という名前で追加しています。
github.com

【Processing】シンプルなBox Softbody

成果物

www.youtube.com
前回は円のSoftbodyを作ったのですが、今回は、箱型のSoftbodyを作ってみました。さすがに箱では地味なので、画像を変形させてみました。

仕組み

基本的にはばねを弾ませているような感じです。フックの法則に従って縮んだ分に比例して上に力を加えています。最後に、体積が等しくなるように幅を体積÷高さで求めれば完了です。

コード

Box Softbodyという名前で追加しています。
github.com

【イラスト】猫を書いてみた#3

成果物

f:id:Nekodigi:20200417121955p:plain:w200
今回は、Wikipediaの猫を参考に、猫を書いてみました。目が怖いのが残念ですが、前回のぐちゃぐちゃな色使いからはだいぶましになってきました。デフォルメ猫を書く時はあまり表に出ないのですが、リアル猫を書こうとすると、どうしても恐ろしい見た目になってしまうので、これから解決していこうと思います。
nekodigi.hatenablog.com
参考にしたWikipedia
ネコ - Wikipedia
小さいときはいい感じに見えますが、大きくすると、怖さが際立ちます↓



















f:id:Nekodigi:20200417122440p:plain

【レビュー】メンブレンを使っていた人が、Majestouch Convertible2 赤軸を使ってみた感想。

きっかけ

今までずっと付属のメンブレンキーボードを使っていたのですが、誤動作が増えてきたので買い替えることにしてみました。フェザータッチTopreのキーボードにしようかと思っていましたが、価格が高いことや、Bluetoothがついていないことから、Topreではなく、Majestouchを選んでみました。
f:id:Nekodigi:20200417111803j:plain
f:id:Nekodigi:20200417111814j:plain

感想

カニカルキーボードはメンブレンキーボードよりもカチカチするものだと思っていましたが、赤軸はむしろその逆で前のキーボードよりもストンとした打ち心地になりました。まだまだ慣れていませんが、以前よりもミスタイプが減り、打つ速度も速くなった気がします。赤軸は軽すぎるのではないかと思っていましたが、思ったりより重かったです。また、キーストロークも思ったより深かったのでこれから慣らしていこうと思います。
Bluetoothの方は十分すぎるぐらいうまく動いていて、四つの機器を設定することができ、キーで簡単に切り替えることができます。USB給電をしながらBluetoothを使えるのも地味に便利です。ただ、IPadではIOSの仕様で純正以外のキーボードは英語キーとして認識されてしまうようです。それが嫌な方は、あえて英語キーボードを選んでみるのもいいかもしれません。

結論

いいキーボードなのですが、長年メンブレンを使ってきたので慣れるまでにはもう少し時間がかかりそうです。
Amazon CAPTCHA

【Processing】円を集団発生させ、膨張させることで、さまざまな平面の埋め尽くし方ができるようにする。

成果物

www.youtube.com
以前、画像を平面を埋め尽くす円で表しているアートをみて、狙い通りの埋め尽くし方を実現するにはどうすればいいのかと思ったので、私なりに方法を考えてみました。

仕組み

普通平面を円で埋め尽くすには、毎フレーム円を追加し、ほかの円とぶつかるまで円を膨張させていくのですが、今回は、一定の確率で円を大量に追加しています。このようにすると、二つのパラメータを使ってさまざまなパターンを作り出せます。
私の予想では、発生確率を上げると、円のサイズ、サイズ差が小さくなり、一度に追加する量を多くすると、全体のサイズが小さくなります。

コード

Space_filling_with_circleという名前で追加しています。
github.com

【Processing】球面の画像をAzimuthal Equidistant Projection(正距方位図法)で投影する

仕組み

こちらの式を使って座標を変換していきます。
 \begin{array}{l}
球面上の経度\lambda 緯度\varphi と、回転\lambda _{0} ,\varphi _{0} から、平面上での位置x,yを求める式です。\\
x=k\cos \varphi \sin( \lambda -\lambda _{0})\\
y=k[\cos \varphi _{1}\sin \varphi -\sin \varphi _{1}\cos \varphi \cos( \lambda -\lambda _{0})]\\
k=\frac{c}{\sin c}\\
c=\arccos[\sin \varphi _{1} +\sin \varphi +\cos \varphi _{1}\cos \varphi \cos( \lambda -\lambda _{0})]\\
逆変換\\
c=\sqrt{x^{2} +y^{2}}\\
\varphi =\arcsin\left(\cos c\sin \varphi _{1} +\frac{y\sin c\cos \varphi _{1}}{c}\right)\\
atan2に変えると広い範囲に対応できます。\\
\lambda =\lambda _{0} +\arctan\left(\frac{x\sin c}{c\cos \varphi _{1}\cos c-y\sin \varphi _{1}\sin c}\right)
\end{array}
画像を投影するときは、画面上の位置から逆変換して画像上の位置を求め、Bicubic補間で補完します。
nekodigi.hatenablog.com
こちらのサイトを参考にしました。
Azimuthal Equidistant Projection -- from Wolfram MathWorld

コード

Azimuthal Equidistant Projectionという名前で追加しています。
github.com