python – 带有移位孔的环内随机点
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 带有移位孔的环内随机点,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2189字,纯文字阅读大概需要4分钟。
内容图文
![python – 带有移位孔的环内随机点](/upload/InfoBanner/zyjiaocheng/754/6cf3829d7d8a4f519d481c94c01a12e5.jpg)
首先,如果有人给我一个适当的术语“带有一个移位孔的环”,我将不胜感激,看看我在下面的图片中究竟是什么样的形状.
回到主要问题:我想在橙色区域中选择一个随机点,不需要均匀分布.对于通常环的情况,我会选择随机点(r:R)范围和随机角度,然后将它们转换为x,y并完成.但对于这种不寻常的形状……是否有一个“简单”的公式,或者我应该通过做某种形状的多边形近似来接近它?
我对一般方法感兴趣但会欣赏python,javascript或您选择的任何编码语言的示例.
解决方法:
这是一种简单的方法,可以在没有重新采样的情况下提供均匀分布.
为简单起见,假设外边界圆(半径r_outer)的中心位于(0,0)并且内圆边界(半径r_inner)的中心位于(x_inner,y_inner).
写入D为外盘,H1为偏心内孔给出的平面子集,H2为半径为r_inner的中心盘,以(0,0)为中心.
现在假设我们忽略了内圈不是中心的事实,而不是从D-H1采样,我们从D-H2采样(这很容易均匀).然后我们犯了两个错误:
>有一个区域A = H1 – H2我们可以从中采样,即使这些样本不应该在结果中.
>即使我们应该,也有一个我们从不采样的区域B = H2-H1
但事情就是这样:区域A和B是全等的:给定平面中的任何点(x,y),(x,y)在H2中,当且仅当(x_inner – x,y_inner – y)在H1中时,并且它遵循(x,y)在A中,当且仅当(x_inner – x,y_inner – y)在B中时!地图(x,y) – > (x_inner – x,y_inner – y)表示围绕该点旋转180度(0.5 * x_inner,0.5 * y_inner).所以有一个简单的技巧:从D-H2生成,如果我们在H1-H2中得到一些东西,则旋转以获得H2-H1的对应点.
这是代码.注意使用均匀分布的平方根来选择半径:这是一个标准技巧.例如,见this article.
import math
import random
def sample(r_outer, r_inner, x_inner, y_inner):
"""
Sample uniformly from (x, y) satisfiying:
x**2 + y**2 <= r_outer**2
(x-x_inner)**2 + (y-y_inner)**2 > r_inner**2
Assumes that the inner circle lies inside the outer circle;
i.e., that hypot(x_inner, y_inner) <= r_outer - r_inner.
"""
# Sample from a normal annulus with radii r_inner and r_outer.
rad = math.sqrt(random.uniform(r_inner**2, r_outer**2))
angle = random.uniform(-math.pi, math.pi)
x, y = rad*math.cos(angle),rad*math.sin(angle)
# If we're inside the forbidden hole, reflect.
if math.hypot(x - x_inner, y - y_inner) < r_inner:
x, y = x_inner - x, y_inner - y
return x, y
以及由以下内容生成的示例图:
import matplotlib.pyplot as plt
samples = [sample(5, 2, 1.0, 2.0) for _ in range(10000)]
xs, ys = zip(*samples)
plt.scatter(xs, ys, s=0.1)
plt.axis("equal")
plt.show()
内容总结
以上是互联网集市为您收集整理的python – 带有移位孔的环内随机点全部内容,希望文章能够帮你解决python – 带有移位孔的环内随机点所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。