python用函数绘制椭圆_python - 如何使用python从3个点找到椭圆的方程 - SO中文参考 - www.soinside.com...
聽起來很有趣!如果您的3個點擊點位于同一象限中,則由這些點定義的三角形的一個角度必須是鈍角。調(diào)用B和其他兩個頂點A和C. x-y定向橢圓的一般方程中有4個參數(shù)。將A,B和C的x和y坐標代入橢圓方程將給出三個方程。你需要拿出第4個。您可以自由選擇在游戲環(huán)境中有意義的第四點。這是一個SymPy代碼片段,它根據(jù)A,B和C以及參數(shù)“f”將x值分配給橢圓的中心。
def e3(p1, p2, p3, f):
t = Triangle(p1, p2, p3)
a = t.angles
for p in a:
if a[p] > pi/2:
break
else:
return
while p != p2:
p1, p2, p3 = p2, p3, p1
pts = A, B, C = p1, p2, p3
# perpendicular line to AB passing through A
perp = Segment(A, B).perpendicular_line(A)
# intersection between that and the perpendicular to that
# which passes through C
m = perp.perpendicular_line(C).intersection(perp)[0]
delta = m - A
c = A + delta*f
x, y, h, r, y0 = symbols('x y h r y0', cls=Dummy)
eq = Ellipse((c.x, y0), h, r).equation(x, y)
s = solve([
eq.xreplace(dict(zip((x, y), p))) for p in pts], dict=True)[0]
return eq.subs(s) # for desmos graphing: str(eq.subs(s)).replace('**','^').replace('_','')+'=0'
f = .125,.25,.5,1,2的一些結果顯示在desmos。
您可以看到他們都通過您提供的要點作為示例。紅色圓圈提供了一個有趣的參考點。您可能想要選擇一個f,因此橢圓的最終寬度是圓的直徑的一小部分,它將通過這些點。
然而,橢圓經(jīng)過的點不在每個橢圓的相同象限中。要滿足該標準,您必須考慮“離軸”橢圓。使用here發(fā)布的任意橢圓方程可能也會有所幫助,以指導您在定義橢圓時選擇要控制的變量。
為了使方程盡可能簡單地求解和確定,如果該角度產(chǎn)生銳角,則可以使軸穿過第二個點擊點,否則通過第1和第3點。這是代碼證明:
def e3(A, B, C, n=7):
'''Return centered at the midpoint of A and C with the axis going through B if the angle at B is acute, else going through A and C.
'''
from sympy import Line
xc, yc = ctr = (A + C)/2
AC = A.distance(C)
smalls = True
if AC >= B.distance(A) and AC >= B.distance(C):
s = Line(A, C).slope
M2 = ctr.distance(A)**2
b = B
if abs(s) <= 1:
m2 = -M2*(s*(b.x - xc) - b.y + yc)**2/(
-M2*(s**2 + 1) + (s*(b.y - yc) + b.x - xc)**2)
else:
s = 1/s
m2 = M2*(s*(b.y - yc) - b.x + xc)**2/(
M2*(s**2 + 1) - (s*(b.x - xc) + b.y - yc)**2)
smalls = False
else:
s = Line(B, ctr).slope
M2 = ctr.distance(B)**2
p = A # or C
if abs(s) <= 1:
m2 = -M2*(s*(p.x - xc) - p.y + yc)**2/(
-M2*(s**2 + 1) + (s*(p.y - yc) + p.x - xc)**2)
else:
s = 1/s
m2 = M2*(s*(p.y - yc) - p.x + xc)**2/(
M2*(s**2 + 1) - (s*(p.x - xc) + p.y - yc)**2)
smalls = False
if smalls:
el = -1 + (-s*(x - xc) + y - yc)**2/(m2*(s**2 + 1)) + (
s*(y - yc) + x - xc)**2/(M2*(s**2 + 1))
else:
el = (M2*(s**2 + 1)*(-m2*(s**2 + 1) + (s*(y - yc) - x + xc)**2
) + m2*(s**2 + 1)*(s*(x - xc) + y - yc)**2)/(
M2*m2*(s**2 + 1)**2)
return el.expand().n(n=n)
from sympy import Point
a,b,c = Point(7/5, 12/5), Point(3/2, 5/2), Point(19/10, 3/2)
e3(a,b,c)
e3(b,c,a)
e3(c,a,b)
根據(jù)第二個單擊點,您將獲得1或3個省略號:
總結
以上是生活随笔為你收集整理的python用函数绘制椭圆_python - 如何使用python从3个点找到椭圆的方程 - SO中文参考 - www.soinside.com...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python取列表前几个元素_Pytho
- 下一篇: 用python处理excel表格_pyt