亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

java - 求算法. 在球面上取隨機N個均勻的點(或者間距不小于某距離的點)

瀏覽:116日期:2023-10-13 18:41:43

問題描述

希望能在球上獲得均勻分布, 或者 每兩個點之間的間距不小于某個值的N個點的坐標(biāo).點的數(shù)量不需要太大, 在100到200之間就夠用了.球的中心點就是坐標(biāo)系原點.

有看到另外一個大牛寫的.https://www.oschina.net/code/...但是傳入100個點的時候, 相鄰很近的點出現(xiàn)幾率非常大. 導(dǎo)致在球面上的點上放東西的時候, 就疊在一起了.

求教, 有沒有什么其他算法能實現(xiàn).

問題解答

回答1:

球面上要實現(xiàn)均勻采樣不難,用正態(tài)分布隨機變量產(chǎn)生三維向量再單位化就可以了。

java - 求算法. 在球面上取隨機N個均勻的點(或者間距不小于某距離的點)

#include <iostream>#include <fstream>#include <random>using namespace std;int main(){ std::default_random_engine gen; std::normal_distribution<float> distrib(0.f, 1.f); ofstream ofs('sphere.txt'); for (int i = 0; i < 1000; i++) {float x = distrib(gen);float y = distrib(gen);float z = distrib(gen);float r = sqrt(x*x + y*y + z*z);ofs << x / r << ’ ’ << y / r << ’ ’ << z / r << endl; } return 0;}

不過不知道滿不滿足相鄰點之間的要求。如果要保證相鄰點比較遠,可以借鑒一下jittering或者stratified sampling之類的思路。

Java版

import java.util.Random;import java.io.*;class SphericalSampling{ public static void main(String[] args){Random rnd = new Random();try{ PrintWriter writer = new PrintWriter('sphere.txt', 'UTF-8'); for(int i = 0; i < 1000; i++){double x = rnd.nextGaussian();double y = rnd.nextGaussian();double z = rnd.nextGaussian();double r = Math.sqrt(x*x + y*y + z*z);writer.println(x/r + ' ' + y/r + ' ' + z/r); } }catch (Exception e) { e.printStackTrace(System.out);} }}

另外,保存的sphere.txt可以用CloudCompare打開查看點云。

回答2:

題主的意思是想讓球面上的點間距盡量大,而均勻隨機分布無法保證不出現(xiàn)距離任意小的兩點,所以這個題與球面上的隨機分布無關(guān)(標(biāo)題太坑人)。

說到球面均勻隨機分布就啰嗦一句。前面@lianera給出的神奇算法我百思不得其解,為啥用正態(tài)分布?后來從單位化上窺見了端倪:單位化其實是體分布到球面的投影。因為正態(tài)分布是球?qū)ΨQ的,因此它投影到球面上就一定是均勻的了。也就是說,真正重要的是分布的球?qū)ΨQ性,具體形式無所謂。比如圓內(nèi)的面積均勻分布投影可以得到圓上的均勻分布:

java - 求算法. 在球面上取隨機N個均勻的點(或者間距不小于某距離的點)

Spherical Codes

網(wǎng)上一搜才發(fā)現(xiàn),原來這個問題還是蠻有來頭的,叫做Tamme’s problem,問題的解稱為“spherical codes”。這里有一些計算好的結(jié)果。同時也知道,當(dāng)點數(shù)比較多時尋找和證明最優(yōu)解是很困難的。所以題主找到個還不錯的次優(yōu)解就可以啦。

題主給出的鏈接其實就是基于一種平均化的碼放策略:把球面用緯線平均分成若干個圓,每個圓再做等角劃分,但高緯度的圓上方的點少些,低緯度的多些。

最值問題

要想求得更好的結(jié)果,可以借助各種優(yōu)化工具包求解球面點最小間距的最大值。目標(biāo)函數(shù)直接寫成球面點最小間距的形式會導(dǎo)致函數(shù)穩(wěn)定性很差,不容易求到最優(yōu)解。這里將目標(biāo)函數(shù)取為所有點間距平方的倒數(shù)和并求最小值:

$$text{minimize:} quad sum_{ilt{}j}frac{1}{d^2(i,j)}$$

這樣既突出了相鄰點間距又保持函數(shù)相對平滑。

我用的是Mathematica提供的NMinimize函數(shù),點數(shù)比較多時需要很長計算。比如在我機器上算160個點需要四個小時。結(jié)果畫圖:

java - 求算法. 在球面上取隨機N個均勻的點(或者間距不小于某距離的點)

標(biāo)簽: java
相關(guān)文章:
主站蜘蛛池模板: 免费爱爱网站 | 大尺度福利视频在线观看网址 | 国产在线麻豆一区二区 | 日本一级特黄特色大片免费视频 | 成人免费va视频 | 国产视频 每日更新 | 国产色婷婷精品免费视频 | 污影院| 91精品免费观看老司机 | 国产婷婷综合丁香亚洲欧洲 | 99热国产这里只有精品免费 | 国产一区二区福利 | 亚洲综合一区二区三区四区 | 国产成人自拍在线 | 香蕉视频在线观看www | 午夜老司机永久免费看片 | 亚洲欧美日韩在线 | 91啦视频在线观看 | 免费网站www7788con | 亚洲精品在线影院 | 亚洲tv成人天堂在线播放 | 国产在线不卡免费播放 | 麻豆传媒国产 | 国产黄色大片 | xxx.国产| 免费播放aa在线视频成人 | 亚洲xx站| 国产精品嫩模在线播放 | 国内黄色一级片 | 日韩精品久久久久久久电影 | 欧美毛片免费观看 | 亚洲国产成人影院播放 | 日韩亚洲国产欧美精品 | 天天影视综合色 | 日本不卡一区二区三区在线观看 | 精品樱空桃一区二区三区 | 国产自精品| 久久精品国产免费看久久精品 | 欧美另类亚洲一区二区 | 操丝袜美女视频 | 亚洲免费专区 |