c 中怎麼用rand函式在指定的三角形區域內隨機生成點?

時間 2021-05-13 00:47:55

1樓:Belleve

在平行四邊形中均勻地隨機取點,然後把其中一半丟棄,或者矩陣變換旋轉到想要的那一邊來。

四面體的處理也是相似的,用八個等體積的四面體拼成乙個平行六面體。

如果想要支援任意形狀,有個詞叫做三角化……

2樓:葉飛影

假設三角形三個頂點為:A,B,C

首先:求得兩個向量

ab = B - A

ac = C - A。

然後:使用rand()獲得兩個0~1之間的隨機實數x, y如果x+y>1, 那麼令x'=1-x, y'=1-y如果x+y<=1, 那麼令x'=x, y'=y最後:隨機點 = A + x' * ab + y' * ac給個影象:

另見:如何在三角形(比如正三角形)裡隨機取點? - 葉飛影的回答還有個公式:

P=A*(1 - sqrt(r1)) + B*sqrt(r1)*(1 - r2) + C*r2*sqrt(r1)也能做到三角形內隨機取點.

至於將該問題擴充套件到三維空間中,即實現四面體內的隨機取點.

假設四面體四個頂點為:A,B,C,D

首先:求得三個向量

ab = B - A

ac = C - A

ad = D - A

然後:使用rand()獲得三個0~1之間的隨機數u, v, w如果u+v+w>2, 那麼令u'=1-u, v'=1-v, w'=1-w

如果u+v+w<1, 那麼令x'=x, y'=y, w'=w否則重新生成u, v, w這三個隨機數.

最後:隨機點 = A + u' * ab + v『 * ac + w'*ad

給個影象:

3樓:WenX

rand()函式可以隨機生成的點?這個說法對也不對,rand可以生成0到RAND_MAX 的隨機整數,然後可以轉化為float或者double,但是精度肯定是受影響的。比如說生成的隨機整數是0到32767,那麼要生成[0,1]上面的點,基本上只能到小數點後4位。

如果生成[0,100,000]範圍內的實數,恐怕就有心無力了。

可以考慮使用C++11中的std::uniform_real_distribution

但是怎麼用rand()的函式在指定的三角形區域內產生點呢?

最簡單的方法,先算出來三角形所處的x,y的範圍,隨機生成乙個點,然後判斷在不在三角形內。

可以證明隨機點落在三角形的概率是1/2。這個演算法的平均複雜度是O(1)的,但是最壞情況比較差。

要想有穩定的求解時間的話(比如在乙個實時系統中),的可以先求出點在乙個方向上的概率分布,按照這個分布產生這個方向上的數值,然後再均勻分布取另乙個方向上的值。

4樓:

先rand一次取出隨機的x座標,根據x座標確定y可以取值的範圍,然後再在這個範圍內隨機取值,這樣你就能得到給定三角形內的隨機整點。如果要更加任意的話,可以根據自己需要的精度做除法。

C 中是否允許在函式中定義函式?

暗能量泡泡 C 不能支援直接在函式中定義函式。C 11通過支援Lambda函式 實際上是個匿名class的物件 來實現類似功能。其他方式可以使用函式中定義struct class的方式再定義其靜態成員函式的方式來模擬一樣的效果。 Johnny Wong 可以使用class struct的實現,它們支...

在C 中如何實現復合多個函式的高階函式

guohc FuncCombinator的引數不固定所以只能傳入delegate的陣列。static void Main string args static Func FuncCombinator Delegate da TResult result TResult param return re...

C 有提供像是 C 中 realloc 這樣的函式的新版本嗎?

自己實現可以使用從c那繼承過來的realloc,但是c 的new和allocator體系沒有類似的支援,這就導致了vector在擴容時必須申請一塊新的記憶體並複製,標準也是這樣要求的,就算是標準庫的作者想在底層用realloc去針對可平凡複製構造 析構的型別做這樣的優化也不行。我想c 不提供新的re...