簡體   English   中英

旋轉橢圓與直線的交點

[英]Intersection points of rotated ellipse and a line

我想在 python 中計算 1) 旋轉的橢圓和線是否相交,以及 2) 如果相交,相交點的 xy 坐標。 我有:

  • 線定義為:斜率m和直線x1 & y1上的參考點
  • 橢圓定義為:中心x0 & y0 ,半軸a & b ,以弧度theta旋轉。

具體來說,我需要的交點是離參考點較近的那個。 有人可以幫我解決這個問題嗎?

編輯:與此問題類似,但橢圓由theta旋轉。

暗示:

如果您執行以下操作:

  • 通過 -(X0, Y0) 翻譯,

  • 旋轉-Θ,

  • X 縮放 1/a,Y 縮放 1/b,

橢圓變成單位圓,線變成另一條線,比如方程 Ax + By = C。所以你得到一個經典的三角方程 A cos α + B sin α = C**。

找到解決方案后,您應用逆變換。

要找到變換后的直線方程,可以使用點(X1, Y1) 和(X1 + 1, Y1 + M),將它們變換並寫出由兩點構成的直線隱方程。


**A cos α = C - B sin α --> A² (1 - sin²α) = C² - 2 BC sin α + B² sin²α 是 sin α 的二次方程。

由於您的問題沒有太多可處理的,我開始使用sympy求解方程(到目前為止沒有theta ...):

from sympy import var, Eq, solveset

# line:
# x(alpha) = x1 + alpha
# y(alpha) = y1 + m * alpha

# ellipse:
# (x - x0) ** 2 / a ** 2 + (y - y0) ** 2 / b ** 2 == 1

x0, y0 = var("x0 y0")
x, y = var("x y")
a, b = var("a b")
x1, y1 = var("x1 y1")
m = var("m")
alpha = var("alpha")
ell = Eq((x - x0) ** 2 / a ** 2 + (y - y0) ** 2 / b ** 2, 1)

ell_line = ell.subs({x: x1 + alpha, y: y1 + m * alpha})

sol = solveset(ell_line, alpha)
print(sol)

這產生了解決方案

FiniteSet(a*b*sqrt(a**2*m**2 + b**2 - m**2*x0**2 + 2*m**2*x0*x1 - m**2*x1**2 + 2*m*x0*y0 - 2*m*x0*y1 - 2*m*x1*y0 + 2*m*x1*y1 - y0**2 + 2*y0*y1 - y1**2)/(a**2*m**2 + b**2) + (a**2*m*y0 - a**2*m*y1 + b**2*x0 - b**2*x1)/(a**2*m**2 + b**2),
          -a*b*sqrt(a**2*m**2 + b**2 - m**2*x0**2 + 2*m**2*x0*x1 - m**2*x1**2 + 2*m*x0*y0 - 2*m*x0*y1 - 2*m*x1*y0 + 2*m*x1*y1 - y0**2 + 2*y0*y1 - y1**2)/(a**2*m**2 + b**2) + (a**2*m*y0 - a**2*m*y1 + b**2*x0 - b**2*x1)/(a**2*m**2 + b**2))

對於參數(我隨機選擇的...):

print(sol.subs({a: 1, b: 2, x0: -1, y0: 3, x1: 2, y1: -3, m: -2}))

我得到(對於alpha ):

FiniteSet(-3 - sqrt(2)/2, -3 + sqrt(2)/2)

如果解決方案是真實的(而不是復雜的),則存在交集。 您需要做的就是計算到參考點的距離並選擇您感興趣的點。

警告:這些都沒有經過真正的測試……這只是我嘗試的第一槍……

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM