问题描述
如果我想生成一堆均匀分布在一个圆圈周围的点,我可以这样做(python):
r = 5 #radiusn = 20 #points 要生成圆点 = [(r * math.cos(theta), r * math.sin(theta))对于 theta in (math.pi*2 * i/n for i in range(n))]
但是,相同的逻辑不会在椭圆上生成均匀的点:端"上的点比边"上的点间距更近.
r1 = 5r2 = 10n = 20 #points 要生成椭圆点 = [(r1 * math.cos(theta), r2 * math.sin(theta))对于 theta in (math.pi*2 * i/n for i in range(n))]
有没有一种简单的方法可以在椭圆周围生成等距点?
(已更新:反映新包装).
在数值分支
If I want to generate a bunch of points distributed uniformly around a circle, I can do this (python):
r = 5 #radius
n = 20 #points to generate
circlePoints = [
(r * math.cos(theta), r * math.sin(theta))
for theta in (math.pi*2 * i/n for i in range(n))
]
However, the same logic doesn't generate uniform points on an ellipse: points on the "ends" are more closely spaced than points on the "sides".
r1 = 5
r2 = 10
n = 20 #points to generate
ellipsePoints = [
(r1 * math.cos(theta), r2 * math.sin(theta))
for theta in (math.pi*2 * i/n for i in range(n))
]
Is there an easy way to generate equally spaced points around an ellipse?
(UPDATED: to reflect new packaging).
An efficient solution of this problem for Python can be found in the numeric branch FlyingCircus-Numeric
of FlyingCircus
Python package.
Disclaimer: I am the main author of them.
Briefly, the (simplified) code looks (where a
is the minor axis, and b
is the major axis):
import numpy as np
import scipy as sp
import scipy.optimize
def angles_in_ellipse(
num,
a,
b):
assert(num > 0)
assert(a < b)
angles = 2 * np.pi * np.arange(num) / num
if a != b:
e = (1.0 - a ** 2.0 / b ** 2.0) ** 0.5
tot_size = sp.special.ellipeinc(2.0 * np.pi, e)
arc_size = tot_size / num
arcs = np.arange(num) * arc_size
res = sp.optimize.root(
lambda x: (sp.special.ellipeinc(x, e) - arcs), angles)
angles = res.x
return angles
It makes use of scipy.special.ellipeinc()
which provides the numerical integral along the perimeter of the ellipse, and scipy.optimize.root()
for solving the equal-arcs length equation for the angles.
To test that it is actually working:
a = 10
b = 20
n = 16
phi = angles_in_ellipse(n, a, b)
print(np.round(np.rad2deg(phi), 2))
# [ 0. 16.4 34.12 55.68 90. 124.32 145.88 163.6 180. 196.4 214.12 235.68 270. 304.32 325.88 343.6 ]
e = (1.0 - a ** 2.0 / b ** 2.0) ** 0.5
arcs = sp.special.ellipeinc(phi, e)
print(np.round(np.diff(arcs), 4))
# [0.2829 0.2829 0.2829 0.2829 0.2829 0.2829 0.2829 0.2829 0.2829 0.2829 0.2829 0.2829 0.2829 0.2829 0.2829]
# plotting
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.gca()
ax.axes.set_aspect('equal')
ax.scatter(b * np.sin(phi), a * np.cos(phi))
plt.show()
这篇关于如何生成沿椭圆周长均匀分布的一组点?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!