pyhthon繪制超炫酷的心形線星形線擺線
擺線
最簡單的旋輪線就是擺線,指圓在直線上滾動時,圓周上某定點的軌跡。
設(shè)圓的半徑為 r ,在x軸上滾動 x距離則意味著旋轉(zhuǎn)了 x \ r 弧度,則其滾動所產(chǎn)生的擺線如下
r = 1 theta = np.arange(0,6.4,0.1) xCircle0 = np.cos(theta) yCircle0 = 1+np.sin(theta) fig = plt.figure(figsize=(15,4)) ax = fig.add_subplot(autoscale_on=False, xlim=(1,10),ylim=(0,2)) ax.grid() circle, = ax.plot(xCircle0,yCircle0,'-',lw=1) point, = ax.plot([1],[1],'o') trace, = ax.plot([],[],'-', lw=1) theta_text = ax.text(0.02,0.85,'',transform=ax.transAxes) textTemplate = '''x = %.1f°\n''' xs,ys = [], [] def animate(x): if(x==0): xs.clear() ys.clear() xCycloid = x + r*np.cos(-x) #由于是向右順時針滾,所以角度為負 yCycloid = 1 + r*np.sin(-x) xCircle = xCircle0+x xs.append(xCycloid) ys.append(yCycloid) circle.set_data(xCircle,yCircle0) point.set_data([xCycloid],[yCycloid]) trace.set_data(xs,ys) theta_text.set_text(textTemplate % x) return circle, point, trace, theta_text frames = np.arange(0,10,0.02) ani = animation.FuncAnimation(fig, animate, frames, interval=5, blit=True) ani.save("Cycloid.gif") plt.show()
如果選取圓內(nèi)或圓外的一點描成軌跡,則為次擺線,圓外點的軌跡為長幅擺線,
反之則為短幅擺線
代碼
r = 1 rIn = 0.5 theta = np.arange(0,6.4,0.1) xCircle0 = np.cos(theta) yCircle0 = 1+np.sin(theta) xCircleOut0 = rIn*np.cos(theta) yCircleOut0 = 1+rIn*np.sin(theta) fig = plt.figure(figsize=(20,3)) ax = fig.add_subplot(autoscale_on=False, xlim=(1,15),ylim=(0,2)) ax.grid() circle, = ax.plot(xCircle0,yCircle0,'-',lw=1) circleOut, = ax.plot(xCircleOut0,yCircleOut0,linestyle='--',lw=1) point, = ax.plot([1],[1],'o') pointOut, = ax.plot([1],[1.5],'o') trace, = ax.plot([],[],'-', lw=1) theta_text = ax.text(0.02,0.85,'',transform=ax.transAxes) textTemplate = '''x = %.1f\n''' xs,ys = [], [] def animate(x): if(x==0): xs.clear() ys.clear() xCycloid = x + r*np.cos(-x) yCycloid = 1 + r*np.sin(-x) xCycloidOut = x + rIn*np.cos(-x) yCycloidOut = 1 + rIn*np.sin(-x) xs.append(xCycloidOut) ys.append(yCycloidOut) circle.set_data(xCircle0+x,yCircle0) circleOut.set_data(xCircleOut0+x,yCircleOut0) point.set_data([xCycloid],[yCycloid]) pointOut.set_data([xCycloidOut],[yCycloidOut]) trace.set_data(xs,ys) theta_text.set_text(textTemplate % x) return circle, circleOut, point, pointOut, trace, theta_text frames = np.arange(0,15,0.1) ani = animation.FuncAnimation(fig, animate, frames, interval=50, blit=True) ani.save("Cycloid.gif") plt.show()
隨著 λ 的變化,圖像的變化過程為
外擺線和心臟線
如果在一個圓繞著另一個固定的圓滾動,如果在圓外滾動,則動圓上的某相對固定點的軌跡為外擺線;若在圓內(nèi)滾動,則某點的軌跡為內(nèi)擺線。設(shè)定圓半徑為 a ,動圓半徑為 b ,則繞行旋轉(zhuǎn) t度后,動圓圓心圓心位置為
若選點 ( a , 0 ) 作為起點,則外擺線的參數(shù)方程為
a = b 時就得到了著名的心臟線,被許多直男奉為經(jīng)典
a = 1 b = 1 theta = np.arange(0,6.4,0.05) fig = plt.figure(figsize=(10,10)) ax = fig.add_subplot(autoscale_on=False, xlim=(-3,3),ylim=(-3,3)) theta_text = ax.text(0.02,0.85,'',transform=ax.transAxes) textTemplate = '''θ = %.1f°\n''' ax.grid() xCircle,yCircle = np.cos(theta),np.sin(theta) ax.plot(a*xCircle,a*yCircle,'-',lw=1) pt, = ax.plot([a+b],[0],'*') cir, = ax.plot(a+b+b*yCircle,b*yCircle,'-',lw=1) cycloid, = ax.plot([], [], '-', lw=1) xs,ys = [],[] def animate(t): if(t==0): xs.clear() ys.clear() cenX = (a+b)*np.cos(t) cenY = (a+b)*np.sin(t) cir.set_data(cenX+b*xCircle,cenY+b*yCircle) newX = cenX - b*np.cos((a+b)/b*t) newY = cenY - b*np.sin((a+b)/b*t) xs.append(newX) ys.append(newY) pt.set_data([newX],[newY]) cycloid.set_data(xs,ys) theta_text.set_text(textTemplate % t) return cycloid, cir, pt, theta_text ani = animation.FuncAnimation(fig, animate, theta, interval=50, blit=True) ani.save("Cycloid.gif") plt.show()
如果更改 a \ b比值,則可得到
a \ b=5
a \ b=1\2
a \ b=2\3
對 a\b進行約分得到 m\ n,曲線由m支組成,總共繞定圓 n周,然后閉合。觀察 1 \b = 1 \2 時的曲線,可以看到其前 p i 個值和后 π 個值組成的心形更好看。
如果 a\b是無理數(shù),則永遠也不會閉合,例如令 b = e ,由于圖片超過5M,所以就不上傳了。這個圖總共轉(zhuǎn)了17圈,到后期十分考驗視力,為了讓規(guī)律更清晰,我們選擇只繪制尖點附近的運動狀態(tài),
內(nèi)擺線與星形線
當動圓在定圓內(nèi)部轉(zhuǎn)動時,則為內(nèi)擺線,其方程為
a\b=4
a\b=5
a \b = 1\3
當 a \b = 4 時,其方程可化簡為
被稱為星形線。
接下來按照慣例,畫一下隨著 a\ b 比值的變化,內(nèi)外擺線形狀的變化過程
內(nèi)擺線
代碼如下
#test.py import argparse #用于命令行的交互 parser = argparse.ArgumentParser() parser.add_argument('bStart', type=float) parser.add_argument('bEnd', type=float) args = parser.parse_args() a = 1 bStart = args.bStart bEnd = args.bEnd fig = plt.figure(figsize=(10,10)) ax = fig.add_subplot(autoscale_on=False, xlim=(-(a+2*bEnd),(a+2*bEnd)),ylim=(-(a+2*bEnd),(a+2*bEnd))) theta_text = ax.text(0.02,0.85,'',transform=ax.transAxes) textTemplate = '''a=1, b= %.2f\n''' ax.grid() t = np.arange(0,6.4,0.05) ax.plot(a*np.cos(t),a*np.sin(t),'-',lw=1) cycloid, = ax.plot([], [], '-', lw=1) xs,ys = [],[] t = np.arange(0,30,0.05) def animate(b): xs = (a+b)*np.cos(t) - b*np.cos((a+b)/b*t) ys = (a+b)*np.sin(t) - b*np.sin((a+b)/b*t) cycloid.set_data(xs,ys) theta_text.set_text(textTemplate % b) return cycloid, theta_text ani = animation.FuncAnimation(fig, animate, np.arange(bEnd,bStart,-0.02), interval=50, blit=True) plt.show() ani.save("Cycloid.gif")
在命令行中輸入
python test.py -2 2
內(nèi)擺線和外擺線同常規(guī)的擺線一樣,皆具有對應(yīng)的長輻或短輻形式,其標準方程為
當 b > 0時為外擺線, b < 0時為內(nèi)擺線,對于星形線而言,其變化過程如圖所示
以上就是pyhthon繪制超炫酷的心形線星形線擺線的詳細內(nèi)容,更多關(guān)于pyhthon繪制心形星形線擺線的資料請關(guān)注本站其它相關(guān)文章!
版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。