1. 程式人生 > 其它 >均勻的生成圓和三角形內的隨機點

均勻的生成圓和三角形內的隨機點

技術標籤:演算法

看到均勻的生成圓和三角形內的隨機點,這裡分別把均勻生成圓和三角形內隨機點的方法先列出來:

	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)中心對稱對映,後者計算比較簡單。
所以就得到了最後的演算法,該方法可以支援任意的三角形。

參考
均勻的生成圓和三角形內的隨機點
在圓內隨機生成點