LEDドームのLEDの並びを決めるのに使用した計算式
展示したLEDドームのLEDの並べ方は次の資料で解説されている「一般化螺旋集合」を利用しました。
資料にDelphiで記述されたコードが記載されていたため、そのコードをPythonに移植して点の座標を得て、3Dプリントのデータを作成するのに役立てました。この記事ではそのPythonのコードの使用方法と出力を解説します。
一般化螺旋集合とは
資料より、
一般化螺旋集合を用いると, 非常に単純なアルゴリズムで, 一様性のよい点集合が球面上に生成できる. 単位球面上にほぼ一様かつ規則的に点を配置しながら, その個数は任意なのである.
点の個数が任意に指定できるというのが便利でした。
Pythonスクリプト
Gistにアップロードしました。
実行方法
matplotlib
とnumpy
モジュールに依存しているので環境に合わせて次のようにインストールしてください。
$ 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の下半球に含まれる点の等積投影図
資料の第(4)図(a)に対応する図です。
調整後のGSSの下半球に含まれる点の等積投影図
資料の第(4)図(b)に対応する図です。
前述の(a)と比較して、中央部分の一様性が増しています。
未調整のGSSの3D図
直交座標を3Dの散布図で表示した図です。
資料に記載はありませんが、matplotlibが3Dの散布図をサポートしていたので追加してみました。
調整後のGSSの3D図
前述の未調整の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個までの点の座標を採用しました。