如何解决如何在凸多边形的周界上生成随机/单点?
我有什么?
我的凸多边形看起来像这样:
使用以下代码:
import numpy as np
from scipy.spatial import ConvexHull
import matplotlib.pyplot as plt
# Generate some random points for the demo.
np.random.seed(4321)
pts = 0.1 + 0.8*np.random.rand(15,2)
ch = ConvexHull(pts)
# Get the indices of the hull points.
hull_indices = ch.vertices
# These are the actual points.
hull_pts = pts[hull_indices,:]
plt.plot(hull_pts[:,0],hull_pts[:,1],'ko',markersize=10)
plt.fill(hull_pts[:,fill=False,edgecolor='b')
plt.xlim(0,1)
plt.ylim(0,1)
plt.show()
我想要什么?
- 我想在多边形的周长上生成 N 个随机点
- 我想在示波器的有效范围内生成 N 个点
我可以使用scipy.spatial吗?以及如何?
解决方法
此代码将值从间隔(0,1)映射到多边形周长并执行1。(在此解决方案中,2是微不足道的):
from scipy.spatial.distance import pdist
class IntervalToPerimeter:
def __init__(self,vertices):
self.vertices = np.concatenate([vertices,vertices[0][None]])
self.mapping = np.array([pdist(self.vertices[i:i+2]) for i in range(len(self.vertices)-1)]).cumsum()
self.mapping /= self.mapping.max()
def transform(self,points):
indices = (points[:,None] < self.mapping).argmax(axis=1)
a,b = np.concatenate([[0],self.mapping])[indices],self.mapping[indices]
return ((points - a)[:,None] * self.vertices[indices] + (b-points)[:,None] * self.vertices[indices+1])/(b-a)[:,None]
itp = IntervalToPerimeter(hull_pts)
transformed_points = itp.transform(np.random.uniform(size=50))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。