【问题标题】:calculating an intercept point between a straight line and an ellipse - python计算直线和椭圆之间的截点 - python
【发布时间】:2018-12-10 12:37:11
【问题描述】:
我最近一直在尝试计算一个点和一个椭圆
想要的点是绿点,知道红点
和椭圆方程。
我使用 numpy linspace 在点上创建了一个数组
并使用 zip(x axis , y axis) 迭代它们
在红点之间,并使用椭圆
方程图哪个点最接近1。
(这是椭圆方程的结果)。
这个概念大部分时间都有效,但在某些地方
红色外点,这种方法似乎没有很好的结果
长话短说,知道如何在 python 中计算绿点吗?
p.s - 椭圆可能有角度,两个轴都是已知的。
【问题讨论】:
标签:
python
python-3.x
math
【解决方案1】:
我最终使用了 answer 中的椭圆方程:
并创建了一个 in_ellipse 函数
然后我使用了 Intermediate value theorem ,得到一个很好的估计
重点
def in_ellipse(point, ellipse):
return true if point in ellipse
return false
dot_a = ellipse_center
dot_b = dot
for i in range(20):
center_point = ((dot_b.y - dot_a.y)/2, (dot_b.x - dot_a.x)/2)
if in_ellipse(center_point):
dot_a = center_point
else:
dot_b = center_point
return center_point
本系统给出小数点后 7 (2^20) 位分辨率的点
您可以增加范围以获得更好的分辨率。
【解决方案2】:
设椭圆中心为(0,0)(否则只需减去中心坐标),半轴为a, b,旋转角度为theta。我们可以构建仿射变换将椭圆变换为圆形,并将相同的变换应用于点 P。
1) 通过 -theta 旋转
px1 = px * Cos(theta) + py * Sin(theta)
py1 = -px * Sin(theta) + py * Cos(theta)
2) 沿 OY 轴延伸(或收缩)a/b 倍
px2 = px1
py2 = py1 * a / b
3) 寻找交点
plen = hypot(px2, py2) (length of p2 vector)
if (a > plen), then segment doesn't intersect ellipse - it fully lies inside
ix = a * px2 / plen
iy = a * py2 / plen
4) 向后收缩
ix2 = ix
iy2 = iy * b / a
5) 向后旋转
ixfinal = ix2 * Cos(theta) - iy2 * Sin(theta)
iyfinal = ix2 * Sin(theta) + iy2 * Cos(theta)