[[20050512003305]] 『球面上の任意の点』(むるあに) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『球面上の任意の点』(むるあに)
 原点を中心とするx^2+y^2+z^2=1の球面上の任意の点の座標を、たとえば60個
 あるいは任意の数)取り出してそれぞれのX,Y,Zを別のセルに表示するには、
 どうしたらよいでしょう?
 おのおのの点は球面上でランダムに選ばれている必要があります。
 どなたがお知恵をお貸しくださいませ。お願いいたします。


 回答がないので参考までに
 Sub KYUU()
    For n = 1 To 60
        Cells(n, 1) = Rnd()
        Cells(n, 2) = Rnd() * Sqr(1 - Cells(n, 1) ^ 2)
        Cells(n, 3) = Sqr(1 - Cells(n, 1) ^ 2 - Cells(n, 2) ^ 2)
    Next
 End Sub
 上記は、すべてのポイントを網羅していません。
 すべてプラス側です。
 半分ぐらいはマイナス値とするのもいいかもね。
 検証してないから不具合があるかも。
 (BB)


 ありがとうございます。試したところ一見うまく動いたようなのですが、
 すべて+側だとこれで均等に分布するのでしょうか?よくわかっていませんが、
 x/y,y/z,z/xの散布図を書いたところ分布に偏りがあるようなのです。
 球面上に均等に分布した点はXY平面、YZ平面、ZX平面いずれに投射しても
 円周付近が濃くなる分布になるような気がしますが。。
 問題を変えて、原点を始点とする線分を60本ランダムに引くとすると
 いいんでしょうか。立体になるとわけわかりません。ヒントがあれば。。
 ボールを眺めていてもよくわかりませんし。。(むるあに)
 

 言われてることがあまり理解できないんですけど
 全体に分布させたいということでしょうか?
 的外れなのかな?
 Sub KYUU()
    For n = 1 To 60
        Cells(n, 1) = Rnd() * 2 - 1
        Cells(n, 2) = (Rnd() * 2 - 1) * Sqr(1 - Cells(n, 1) ^ 2)
        If Rnd() < 0.5 Then
            Cells(n, 3) = Sqr(1 - Cells(n, 1) ^ 2 - Cells(n, 2) ^ 2)
        Else
            Cells(n, 3) = -Sqr(1 - Cells(n, 1) ^ 2 - Cells(n, 2) ^ 2)
        End If
    Next
 End Sub
 (BB)

 極座標系で、r=1、θとφを乱数とし、それを直交座標系に変換してはいかがでしょう
 (ごめんなさい、私は検証していません)

	A	B	C	D	E
   1	θ	φ	X	Y	Z

 として、
 A2とB2に	=2*RAND()*PI()
 C2に	=SIN(A2)*COS(B2)
 D2に	=SIN(A2)*SIN(B2)
 E2に	=COS(A2)
 を入力して、これらの式を下にコピー

 なお、XとY、YとZ、ZとXで散布図を書くと、円周付近が濃く、中心付近が薄くなるのは
 当たり前です。
 透明なボール表面に均等に点を書いて、横から見てもそのように見えるはずです。
 《数式を修正しました^2》
 (ちゅうねん)
   ↑
 ごめんなさい。この数式では、Zに比べ、X,Y(の絶対値)が小さい傾向になります。
 無かったことにしてください。
 (ちゅうねん)

 BBさん、ちゅうねんさん、ありがとうございます。
 ちょっと考えてまた書きます。すいませんアメリカなので時差が、ありますが。
 (むるあに)

 ご示唆ありがとうございます。まずBBさんに返信させていただきます。
 球面上からランダムに点をピックアップしたいのです。

 実際に作製して頂いた、プログラムで200の点を発生させて、3Dに
 散布図を書くと、点の分布がかたよってみえるのですけど。。。
 なにか間違っているのでしょうか?

 つたない知識で考えてみますと
 X座標はランダムになると思うのですが、 Y 座標はSqrのなかの数字は
 ランダムな数字を自乗してから引き算してるのでランダムにならないよ
 うに思うのですが。。つまりランダムに5までの数字を発生させて、
 仮に1,2,3,4,5が得られたとすると、その2乗は1,4,9,16,25になりますから、
 各数字間の距離は、元はすべて<1>であるのに対して自乗値の場合は<1><3><5>
 <7><9>になって偏ります。これに仮に1をを足すと2,5,10,17,26になって、
 その平方根は、等間隔になりません。したがってx座標はランダムなのに、
 Y座標はそのX座標の数字によってバイアスがかかると思うのですが。。
 でも球面上なのであたりまえですか???
 とにかく絵を描くと何か変ですけども。。。

 (むるあに)


 ちゅうねんさん。ありがとうございます。
 極座標というのはグラフを半径と角度で表すことですね。
 調べてもちょっと見では、よくわかんなかったんですが、勉強します。
 でもそれをヒントにいいことを思いつきました。

 仮に半径1の球を平面において、平面上の接触点を(0,0)とすると、
 そこから球を転がしていくと平面上に書いた半径paiの円の中に、
 球上のすべての点が接触する範囲が含まれますよね。
 だから方眼紙を用意してその上を球をころがしていき、
 ランダムに選んだマスと接触する球の表面上の点の座標を選び出せば、
 球面上に一様に分布する点が選べるはず!!かな?
 でもどうやるんだろう。また考えます。

 (むるあに)


 >平面上に書いた半径paiの円の中に 
 違うと思います。

 球上の全ての点を平面に展開すると、

          ↑Y
          *
       *******
    *************
   *************** →X
    *************
       *******
          *  
 の様になります。
 X軸上では -π〜+π までの領域で、Y軸上では -π/2〜+π/2 の領域です。 
 面積は、4π (球の表面積と同じ)です。 ←修正しました(2005/5/15)
 この領域を求めさらにそれを球に逆展開するのは、結構手間ですよね。
 (ちゅうねん)

 なるほど!そうですね。球の表面積と同じになるのをなんで気が付かなかっ
 たんだろう。。ありがとうございます。
 教えていただいた極座標の式でシュミレーションしてみたところ、
 おっしゃるとおり偏っているようです。でもなぜかよくわかってません。
 とほほ。。

 目的はいびつな立体の形のものを重心を合わせて球に埋没させ、
 球の表面上の任意の点を中心とし球と接する任意の半径の円を書き、
 それを重心に向かってスライドさせたとき、ぶつかる立体上(または立体内)
 に配置されたエレメントの種類と(全部ラベルがついている)個数を
 シュミレーションすることなんですが。何からとっかかればよいのやら。
 
 極座標のキーワードを得ただけでも収穫です。
 ありがとうございました。(むるあに)

 球体の私的イメージ
 1つの値が決まればただの円

 x2 + y2 + z2 = r2

 x値からランダムに決めた場合
 x値の最小値 = -r
 x値の最大値 = r

 x値が決定した後のy値
 y2 + z2 = r2 - x2
 y値の最小値 = -Sqr(r2 - x2)
 y値の最大値 = Sqr(r2 - x2)

 z値については、x値 , y値より自然と決定。
 ですから上記マクロでカバーしてない点は、
 乱数の発生が0〜1未満なので乱数 1が選択されないだけだから
 9割方のポイントは、カバーできてると思うんですけどね。
 (BB)


 なるほど、そういうふうに考えるんですね。
 ありがとうございます。なんでプロットすると
 パッと見でも偏ってるんでしょうね。
 もしかするとロジックが間違ってるかもしれませんが、
 最初に選んだX軸の値で円周がかわりますよね。本当は
 球面上でランダムな点は、短い円周からは少ない数しか、
 選ばれないんじゃないでしょうか。。もうちょっと
 考えて見ます。 (むるあに)

 衝突しました。

 極座標系で考えると、球体表面はr(半径)が一定で、それぞれ0〜360度に変化する
 θとφの変数2つで表されます。
 問題は、θとφを均質に取っても、球体表面上の距離が均質ではないことでした。
 ちょうど、地球の緯度と経度10度ずつで線を引いて、その交点を観察すると
 赤道付近が疎になって、北極と南極付近が密になることから想像していただけるでしょう。
 数式上は、X、Yは三角関数を2回掛けていますが、Zは1回なので、Zの方が(絶対値が)
 大きくなります。

 [BB]さんへ、
 Xの値はランダムなので、0〜0.5の確率は50%、0.5〜1の確率は50%です。
 もし、Xが0の時は、Yは0〜1の範囲になるので、0〜0.5になる確率は50%、0.5〜1になる
 確率は50%で均質になりますが、
 もし、Xが0.5の時は、Yは0〜0.87の範囲になるので、0〜0.5になる確率は58%、0.5〜に
 なる可能性は42%で、Yは小さい値になる傾向になります。
 残念ながら、均質な分布にはなりません。
 (ちゅうねん)


 確かにおっしゃられるようにy値については、小さい値の確率
 が高いでしょうね。
 ピックアップした任意の座標において(X,Y,Z)値のシャッフル
 を施すとかしてみるのもいいかもね。
 (BB)


 ちゅうねんさん、非常によくわかりました。ありがとうございます。
 BBさん、現実的な方法ありがとうございます。

 確率密度をつけた乱数(表現あってますか?)を発生できると
 一番いいのでしょうが、よくわかりません。
 今思いついたのですけど、適当に区画を区切れば、
 擬似的にできますでしょうか。たとえばある区間内にある数だけ
 乱数が生じたときに、はじめてその乱数を出力するとか。。

 BBさんの考え方で最初のxの値の発生率は、
 そのxで切った円周の長さに比例すると考えれば
 (1-x^2)^(0.5)に比例しそうですね。次にそのxについてのyの値は逆に
 そのxで切ったときの円周に近い値が多く発生しそうですが、
 考え方はあってますでしょうか?
 (むるあに)

 失礼しました。球の表面積の式が間違えていましたので修正しました。(2005/5/15)

 さて、球面上にランダムに点を打つ方法ですが、たとえば球をリンゴと考えたとき、
 表面(球面)を地球の緯度に相当する線で細くスライスし、その皮をむきます。
 (その皮の長さを積算したもの×皮の幅=表面積 になります)
 幅を十分に小さくすれば、表面上の点は長さという一つの変数で表すことができます。
 よって、0〜皮の長さ の範囲でランダムな数値を出して、その皮を元に戻せば、球の
 ランダムな位置に点を打ったことになります。

 式に表すのは、かなり大変そうですが…。
 それぐらいしか思いつきませんでした。
 (ちゅうねん)

 ありがとうございます。
 私のレベルでは無理ですね。少なくともイメージにも見本が必要です。
 来週に、プログラムができる人とのミーティングが
 あるので聞いてみます。恐ろしくうっとうしがられるでしょうが。。
 ボスは全くわかってないので、短期間では無理と言うことが
 わからないみたいです。まあポシャルかな。。。やだなあ。
 どうせいいかげんなもんを出すんでしょうが。。
 (むるあに)


 わかりました!ある方との会話がヒントで。。
 まずX,Y,Zを乱数で1から-1の範囲で出します。
 ついで、a=sqr(x2 + y2 + z2 )を算出し、a>1なら棄却し、
 乱数発生に戻ります。a=<1のときは、選んだ点は
 球内のランダム点になるので、x/a,y/a,z/aを計算すると
 得られた座標はそれらの点を球面上に投影したことになり、
 ランダムですね。
 (むるあに)

 なるほど。目からウロコです。
 a>1の場合に棄却するのがミソですね。拍手!
 (ちゅうねん)

 a>1なら棄却の意味がよくわからない!
 なぜ棄却するのだろう?球内の点だろうが球外の点だろうが
 原点よりの拡大、縮小なのだから問題ないのでは??
 (TOBI)

 X,Y,Zとも、-1から1の範囲で均質な分布で数値が指定された場合、一辺が2の正方形の
 内部に均質に点が打たれます。
 このとき問題の球を考えると、球の内部にも均質に点が分布しています。
 よって、球の内部だけの点を対象にして原点から拡大すると表面に均質に分布します。
 ところが、正方形に分布した全ての点(球外の点も)を対象に原点から拡大縮小すると、
 (1,1,1)や(1,1,-1)などの正方形の頂点方向は密度が高く、(1,0,0)や、(0,-1,0)などの
 正方形の面の中心(X,Y,Z軸上)方向は密度が低くなります。
 (ちゅうねん)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.