我想根据点(0, 0) (0, 1), (1, 0.5)
在三角形中生成随机点。我认为最简单的方法是使用numpy生成(0, 0), (0, 1), (1, 1), (1, 0)
正方形中的点,然后将其过滤到三角形中。
下面是代码,它将生成该正方形内的点。
pts = np.random.rand(1000, 2)
但是,我不知道如何将numpy数组过滤到该三角形内的点。
发布于 2021-03-29 21:30:14
如果您想要进行过滤方法,您必须找到一个条件来检查哪些点在三角形内。然后,您可以使用numpys argwhere函数来查找所有完全填充条件的点的索引:
pts = np.random.rand(1000, 2)
x_coord = pts[:, 0]
y_coord = pts[:, 1]
def _in_triangle(x, y):
# You might want to doublecheck if this condition is correct, I am sure there is a better way.
return (((x <= 0.5) & (y <= 2*x)) | ((x <= 0.5) & (y <= 2-2*x))) & (0 <= x) & (x <= 1) & (0 <= y) & (y <= 1)
points_in_triangle = pts[np.argwhere(_in_triangle(x_coord, y_coord))]
发布于 2021-03-29 20:25:13
对于尚未解决的紧急情况,我将尝试一个多管齐下的答案:
如果不需要统一的分布,那么只需从0,1均匀地生成x-coord,然后从0.5-((1-x)/2), 0.5+((1-x)/2)生成y-coord。这使得每个x坐标的可能性相等,因此倾向于以较少的y坐标对应点:三角形顶点附近的点将比靠近基座的点更多地被选中。
在选择y之前,您可以通过x-坐标上的逆变换来纠正这一点:正方形x
。
如果您需要使用您已经生成的点,那么您别无选择,只能以某种方式过滤它们。其中一半将是不合适的,这些点通过你的数组随机分布。没有办法分割数组来实现这个结果。
编辑斯科特·亨特的信用
但是,您可以过滤和转换不合适的点:用简单的从三角形到内部的转换来映射它们。你的三角形在线的上方。
y = 2x
y = -2x + 2
一个简单的映射是反映这些线之上的每一个点,穿过线段的中点:(0.25,0.5)或(0.75,0.5)。这是一个简单的等式:为了反映点(x, y)
跨点(a, b)
,反射是(2a-x, 2b-y)
。
https://stackoverflow.com/questions/66860762
复制相似问题