为了账号安全,请及时绑定邮箱和手机立即绑定

计算直线和椭圆之间的截点-python

计算直线和椭圆之间的截点-python

白猪掌柜的 2021-09-11 21:06:26
我最近一直在尝试计算一个椭圆的点所需的点是绿点,知道红点和椭圆方程。我使用 numpy linspace 在点上创建一个数组,并使用 zip(x 轴,y 轴) 在红点之间迭代它们,并使用椭圆方程图哪个点最接近 1。(这是结果椭圆方程)。这个概念大部分时间都有效,但在红色外点的某些位置,这种方法似乎没有给出好的结果长话短说,知道如何计算python中的绿点吗?ps - 椭圆可能有角度,两个轴都是已知的。
查看完整描述

2 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

我最终使用了这个答案中的椭圆方程:


并创建了一个 in_ellipse 函数


然后我使用了中值定理,对点进行了很好的估计


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) 位分辨率给出点,您可以增加范围以获得更好的分辨率。


查看完整回答
反对 回复 2021-09-11
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

让椭圆中心为(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)


查看完整回答
反对 回复 2021-09-11
  • 2 回答
  • 0 关注
  • 352 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信