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

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個までの点の座標を採用しました。

参考文献

関連記事