【问题标题】: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 - 椭圆可能有角度,两个轴都是已知的。

【问题讨论】:

  • This Answer 可能会有所帮助。
  • 我投票结束这个问题,因为它与编程无关。

标签: 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      • 2018-09-01
      • 2012-01-01
      • 1970-01-01
      • 2021-12-24
      相关资源
      最近更新 更多