[英]Points of Intersection of an Ellipse and a line after rotating ellipse by angle theta
[英]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.