Python隨機生成均勻分布在三角形內(nèi)或者任意多邊形內(nèi)的點
Python有一隨機函數(shù)可以產(chǎn)生[0,1)區(qū)間內(nèi)的隨機數(shù),基于此函數(shù)生成隨機分布在任意三角形內(nèi)的點
由數(shù)學(xué)知識得知:
幾何體的向量表達(dá)形式
直線:

線段:

推廣到高維
三維平面:

三角形:

注釋,v這個向量表示的是在圖形上的點的坐標(biāo),根據(jù)數(shù)學(xué)知識得知,直線和三維平面內(nèi)的v構(gòu)成的點集是放射集,而線段則是凸集, 其余向量是不在同一個點或者同一個平面的點的坐標(biāo)構(gòu)成的列向量
那么針對三角形可以寫成如下:
我們可以先生成隨機的貝塔,然后隨機生成阿爾法,然后處理阿爾法,使得點是隨機落在三角形內(nèi)的,這里用的是開始生成的隨機數(shù)的算術(shù)平方根作為阿爾法數(shù)值,關(guān)于為什么這樣可以參考
Python隨機生成均勻分布在單位圓內(nèi)的點
現(xiàn)附代碼如下:
import numpy as np
import matplotlib.pyplot as plt
if __name__ == '__main__':
x1, y1 = 0, 30
x3, y3 = 200, -10
x2, y2 = 100, 200
sample_size = 500
theta = np.arange(0,1,0.001)
x = theta * x1 + (1 - theta) * x2
y = theta * y1 + (1 - theta) * y2
plt.plot(x,y,'g--',linewidth=2)
x = theta * x1 + (1 - theta) * x3
y = theta * y1 + (1 - theta) * y3
plt.plot(x, y, 'g--', linewidth=2)
x = theta * x2 + (1 - theta) * x3
y = theta * y2 + (1 - theta) * y3
plt.plot(x, y, 'g--', linewidth=2)
rnd1 = np.random.random(size = sample_size)
rnd2 = np.random.random(size=sample_size)
rnd2 = np.sqrt(rnd2)
x = rnd2 * (rnd1 * x1 + (1 - rnd1) * x2) + (1 - rnd2) * x3
y = rnd2 * (rnd1 * y1 + (1 - rnd1) * y2) + (1 - rnd2) * y3
plt.plot(x,y,'ro')
plt.grid(True)
# plt.savefig('demo.png')
plt.show()
生成圖:

作為推廣,其實多個多邊形也是可以這樣生成的,只需要分割為多個三角形,根據(jù)三角形面積比例,控制樣本比例即可。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python合并已經(jīng)存在的sheet數(shù)據(jù)到新sheet的方法
今天小編就為大家分享一篇python合并已經(jīng)存在的sheet數(shù)據(jù)到新sheet的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12
python中根據(jù)字符串調(diào)用函數(shù)的實現(xiàn)方法
下面小編就為大家?guī)硪黄猵ython中根據(jù)字符串調(diào)用函數(shù)的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考,一起跟隨小編過來看看吧2016-06-06

