均勻的生成圓和三角形內的隨機點
阿新 • • 發佈:2020-12-14
技術標籤:演算法
看到均勻的生成圓和三角形內的隨機點,這裡分別把均勻生成圓和三角形內隨機點的方法先列出來:
double radius = 1.0, x_center = 0.0, y_center = 0.0;
mt19937 rng{random_device{}()};
uniform_real_distribution<double> uni{0, 1};
double d = radius * sqrt(uni(rng));
double theta = uni(rng) * (2 * M_PI);
cout << d * cos(theta) + x_center << ", " << d * sin(theta) + y_center << endl;
import numpy as np
import matplotlib.pyplot as plt
import random
def GeneratePointInTriangle(point_num, pointA, pointB, pointC):
for i in range(0, point_num):
u = random.uniform(0.0, 1.0)
v = random.uniform(0.0, 1.0)
if u+v > 1.0: #以(0.5,0.5)為中心進行對映
u=1-u
v=1-v
pointP = u*pointC + v*pointB + (1.0-u-v)*pointA;
plt.plot(pointP[0], pointP[1], '.', color = "black")
fig = plt.figure()
pointA = np.array([0,10])
pointB = np.array([33,15])
pointC = np.array([-50,20])
plt.plot([pointA[0],pointB[0]], [pointA[1],pointB[1]])
plt. plot([pointA[0],pointC[0]], [pointA[1],pointC[1]])
plt.plot([pointB[0],pointC[0]], [pointB[1],pointC[1]])
GeneratePointInTriangle(4000, pointA, pointB, pointC)
plt.show()
在圓內隨機生成點的方法,和文中方法相同,證明參考一種解法的證明。
在三角形內隨機生成點的方法,我在看了文中解法5和解法6後,發現解法6只適用於底邊平行於座標軸,且底邊鄰角不是鈍角的情況,當然可以讓不滿足條件的三角形旋轉以滿足條件,但太複雜了。考慮解法5:
對於三角形ABC和一點P,可以有如下的向量表示:
AP = uAC + vAB
p點在三角形內部的充分必要條件是:1 >= u >= 0, 1 >= v >= 0, u+v <= 1。
先生成[0,1]的隨機數u,然後生成[0, 1-u]內的隨機數v,u、v生成後,就可以得到p點的座標:
P = uC + vB + (1-u-v)A
生成的點不是均勻的,是因為u,v的生成不是獨立的,如果能讓u,v是獨立生成的,結果就是正確的了。
看這個圖片:
u作為橫軸,v作為縱軸,都取[0,1]之間的隨機值,滿足u+v<1的是左下的三角形,那右上的三角形內的點,通過一定的變換一一對映到左下三角形中不就可以了嘛。可以通過軸對稱對映,也可以通過(0.5,0.5)中心對稱對映,後者計算比較簡單。
所以就得到了最後的演算法,該方法可以支援任意的三角形。