日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

python用函数绘制椭圆_python - 如何使用python从3个点找到椭圆的方程 - SO中文参考 - www.soinside.com...

發(fā)布時間:2025/3/20 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python用函数绘制椭圆_python - 如何使用python从3个点找到椭圆的方程 - SO中文参考 - www.soinside.com... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

聽起來很有趣!如果您的3個點(diǎn)擊點(diǎn)位于同一象限中,則由這些點(diǎn)定義的三角形的一個角度必須是鈍角。調(diào)用B和其他兩個頂點(diǎn)A和C. x-y定向橢圓的一般方程中有4個參數(shù)。將A,B和C的x和y坐標(biāo)代入橢圓方程將給出三個方程。你需要拿出第4個。您可以自由選擇在游戲環(huán)境中有意義的第四點(diǎ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的一些結(jié)果顯示在desmos。

您可以看到他們都通過您提供的要點(diǎn)作為示例。紅色圓圈提供了一個有趣的參考點(diǎn)。您可能想要選擇一個f,因此橢圓的最終寬度是圓的直徑的一小部分,它將通過這些點(diǎn)。

然而,橢圓經(jīng)過的點(diǎn)不在每個橢圓的相同象限中。要滿足該標(biāo)準(zhǔn),您必須考慮“離軸”橢圓。使用here發(fā)布的任意橢圓方程可能也會有所幫助,以指導(dǎo)您在定義橢圓時選擇要控制的變量。

為了使方程盡可能簡單地求解和確定,如果該角度產(chǎn)生銳角,則可以使軸穿過第二個點(diǎn)擊點(diǎn),否則通過第1和第3點(diǎn)。這是代碼證明:

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ù)第二個單擊點(diǎn),您將獲得1或3個省略號:

總結(jié)

以上是生活随笔為你收集整理的python用函数绘制椭圆_python - 如何使用python从3个点找到椭圆的方程 - SO中文参考 - www.soinside.com...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。