読者です 読者をやめる 読者になる 読者になる

LEDドームのLEDの並びを決めるのに使用した計算式

Python 計算科学

f:id:jakalada:20170320221451p:plain

展示したLEDドームのLEDの並べ方は次の資料で解説されている「一般化螺旋集合」を利用しました。

資料にDelphiで記述されたコードが記載されていたため、そのコードをPythonに移植して点の座標を得て、3Dプリントのデータを作成するのに役立てました。この記事ではそのPythonのコードの使用方法と出力を解説します。

一般化螺旋集合とは

資料より、

一般化螺旋集合を用いると, 非常に単純なアルゴリズムで, 一様性のよい点集合が球面上に生成できる. 単位球面上にほぼ一様かつ規則的に点を配置しながら, その個数は任意なのである.

点の個数が任意に指定できるというのが便利でした。

Pythonスクリプト

Gistにアップロードしました。

実行方法

matplotlibnumpyモジュールに依存しているので環境に合わせて次のようにインストールしてください。

$ pip install matplotlib numpy

前述のスクリプトをダウンロードして次のように実行すると600個の点を生成、対応するファイルが出力されます。

$ python gss_generator.py 600

出力ファイル一覧

次のファイルがカレントディレクトリに出力されます。実行ごとにファイルは上書きされるため、複数回使用して結果を残したい場合は注意してください。

ファイル名 概要
gss.png 未調整のGSSの下半球に含まれる点の等積投影図
relocated_gss.png 調整後のGSSの下半球に含まれる点の等積投影図
gss_3d.png 未調整のGSSの3D図
relocated_gss_3d.png 調整後のGSSの3D図
gss_spherical_coords.csv 未調整のGSSの球面座標(余緯度, 経度)のCSVファイル
relocated_gss_spherical_coords.csv 調整後のGSSの球面座標(余緯度, 経度)のCSVファイル
gss_cartesian_coords.csv 未調整のGSSの直交座標(x, y, z)のCSVファイル
relocated_gss_cartesian_coords.csv 調整後のGSSの直交座標(x, y, z)のCSVファイル

未調整のGSSの下半球に含まれる点の等積投影図

f:id:jakalada:20170320230654p:plain

資料の第(4)図(a)に対応する図です。

調整後のGSSの下半球に含まれる点の等積投影図

f:id:jakalada:20170320230712p:plain

資料の第(4)図(b)に対応する図です。

前述の(a)と比較して、中央部分の一様性が増しています。

未調整のGSSの3D図

f:id:jakalada:20170320231659p:plain

直交座標を3Dの散布図で表示した図です。

資料に記載はありませんが、matplotlibが3Dの散布図をサポートしていたので追加してみました。

調整後のGSSの3D図

f:id:jakalada:20170320231757p:plain

前述の未調整のGSSと比較しても、数が多くてピンとこない感じです。

球面座標(余緯度, 経度)のCSVファイル

未調整のGSSの球面座標(余緯度, 経度)のCSVファイル

600点のGSSの未調整の球面座標の先頭と末尾が次のような内容です。

3.14159265359,0.0
3.05985211457,1.80000250836
3.0259618467,3.07386203376
2.99993488526,4.11483618387
2.97797463727,5.017103496
...
0.163618016318,3.25246274456
0.141657768329,4.29343689467
0.115630806891,5.56729642007
0.0817405390231,1.08411362125
0.0,0.0

余緯度の範囲が0〜π、経度の範囲が0〜2πです。資料のコードでは経度の値が点数が増えるごとに増加していたので、Pythonのコードでは2πに丸め込むようにしています。

調整後のGSSの球面座標(余緯度, 経度)のCSVファイル

600点のGSSの調整後の球面座標の先頭と末尾が次のような内容です。

3.08384172559,-0.334005621435
3.05985211457,1.80000250836
3.0259618467,3.07386203376
2.99993488526,4.11483618387
2.97797463727,5.017103496
...
0.163618016318,3.25246274456
0.141657768329,4.29343689467
0.115630806891,5.56729642007
0.0817405390231,1.08411362125
0.0698556973497,2.04851241234

未調整のGSSと比較して、先頭と末尾の座標が調整されていることが分かります。

直交座標(x, y, z)のCSVファイル

未調整のGSSの直交座標(x, y, z)のCSVファイル

600点のGSSの未調整の直交座標の先頭と末尾が次のような内容です。

1.22464679915e-16,0.0,-1.0
-0.0185511469485,0.0795141687573,-0.996661101836
-0.11510877307,0.00780833227827,-0.993322203673
-0.0794333510688,-0.11671931096,-0.989983305509
0.0488700851286,-0.155385096561,-0.986644407346
...
-0.161888855616,-0.0180225381446,0.986644407346
-0.0574343214195,-0.12897423594,0.989983305509
0.0870503329298,-0.0757181565243,0.993322203673
0.0381871935394,0.07216915086,0.996661101836
0.0,0.0,1.0

各値の範囲は-1.0〜+1.0です。

先頭の座標xが0に近いけど0ではない値になってしまっているのが気になる…。

調整後のGSSの直交座標(x, y, z)のCSVファイル

600点のGSSの調整後の直交座標の先頭と末尾が次のような内容です。

0.054529102388,-0.0189219592206,-0.998332878579
-0.0185511469485,0.0795141687573,-0.996661101836
-0.11510877307,0.00780833227827,-0.993322203673
-0.0794333510688,-0.11671931096,-0.989983305509
0.0488700851286,-0.155385096561,-0.986644407346
...
-0.161888855616,-0.0180225381446,0.986644407346
-0.0574343214195,-0.12897423594,0.989983305509
0.0870503329298,-0.0757181565243,0.993322203673
0.0381871935394,0.07216915086,0.996661101836
-0.0320901932948,0.0619847204277,0.997561082805

LEDドーム作成時の活用方法

LEDドームの半径が5cmなので、調整後のGSSの直交座標の値に5を掛けることで3Dデータの作成に活用できました。

点数としては160を指定してGSSを生成、Fusion 360でデータを作成するときに埋め込むLEDの基板が収まるかどうかを判断基準として、70個までの点の座標を採用しました。

参考文献

Fusion 360 - 3Dスケッチの許可設定

Fusion 360

f:id:jakalada:20170219175915p:plain

上記の画像のような、中心点から3次元上の点に対して線分のスケッチを作成するときに、点と点を選択するだけで済ませたかったが、初期設定だと次のような手順を踏む必要があった。

  1. 中心点を始点として適当なところを終点に指定して線分を作成する
  2. 終点を選択して、「点から点」のタイプ移動で任意の3次元上の点に移動する

途中で疲れてきて、設定を探すと次のようなものが見つかった。

f:id:jakalada:20170219180017p:plain

「線分およびスプラインの 3D スケッチを許可」を有効にすることで、3次元上であっても、任意の点と点を選択するだけで線分を作成することができた。