Python实现三角形及任意多边形内均匀随机点生成
本文介绍利用Python生成均匀分布在任意三角形内的随机点的方法。通过结合贝塔分布与线性插值,确保点在三角形内均匀分布,并推广至任意多边形。提供完整代码示例及可视化效果,适用于机器学习数据增强等场景。
Python内置的随机函数可生成[0,1)区间内的随机数。基于这一基础,我们可以进一步实现生成随机分布在任意三角形内部的点。
根据几何学原理,直线的向量表达形式为:

线段的向量表达形式为:

上述概念可推广至高维空间。
在三维空间中,平面的向量表达形式为:

三角形的向量表达形式为:

注:向量v表示图形上点的坐标。根据数学知识,直线和三维平面内的v构成的点集属于仿射集,而线段构成的点集属于凸集。其余向量由不在同一点或同一平面的点坐标组成的列向量构成。
针对三角形,其向量表达式可写为: 我们可以先生成随机的贝塔(Beta)分布变量,然后生成随机的阿尔法(Alpha)变量,并对阿尔法进行处理,以确保点均匀落在三角形内。这里采用初始生成随机数的算术平方根作为阿尔法的数值。具体原理可参考《Python随机生成均匀分布在单位圆内的点》一文。
以下是具体实现代码:
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()
生成的随机点分布图如下:

作为推广,任意多边形也可以通过类似方法生成随机点。只需将多边形分割为多个三角形,并根据各三角形的面积比例控制样本数量即可。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













