畫橢圓

閒聊的時候看到一張圖片,一家網站的18歲認證,頓時就想吐槽,這是針對中學生的吧。html

既然勾起了興趣,就試着作一下。正則表達式

x+y+z=3在三維座標系中是一個平面,x^2+y^2+z^2=9是一個球,它倆相截獲得的是一個圓心在(1,1,1),通過(0,0,3),(0,3,0),(3,0,0),(2,2,-1),(2,-1,2),(-1,2,2)的圓,在二維座標系的投影是一箇中心在(1,1),通過(0,0),(0,3),(3,0),(2,2),(2,-1),(-1,2)的橢圓,x,y就在橢圓上取值。這個橢圓的方程是x^2+y^2-3x-3y+xy=0,求y-x的最值,就是求切線斜率爲45度的切點。函數

 粗略畫一個草圖,目測橢圓的斜率是-45度(事實上也確實是),因此能夠這樣計算四周的點:網站

當x=y,可得(0,0),(2,2);當x+y=2,可得(1-√3,1+√3),(1+√3,1-√3),因此橢圓a=√6,b=√2,焦點是(1-√2,1+√2),(1+√2,1-√2)。當位於(1-√3,1+√3)時,y-x的最大值是2√3,至於怎麼證實這個點的切線斜率是45度,母雞了╮(╯_╰)╭。url

 

問題已經解決,這時候我又想,可不能夠用程序把它畫出來呢,這樣顯得比較有bigger。因而就上網搜了一下matplotlib的知識點,把demo拿過來稍微修改了一下。有時候完成需求真的不須要去細學每一個知識點,那樣會給本身太大負擔。好比我安裝的漫畫自動翻頁的油猴腳本失效了,因而就想着看本身能不能修。可是js方面我是外行,若是去補基礎,搞明白腳本里每一條語句的意思,不知道須要多少天呢。後來發現腳本失效的緣由是那家網站img src url的格式變了,因此找不到圖。把解析url的正則表達式修改一下就好啦,解決問題只用了不到一小時。spa

img代碼是這樣的:code

本來的格式是/4085/219/005.png或者.html什麼的,無從得知,如今把後面的去掉了。htm

因此把blog

let imgData = getEl('tbody > tr:nth-of-type(5) img').src.match(/(.+\/)\d{3}(\.\w+)/);

修改成圖片

let imgData = getEl('tbody > tr:nth-of-type(5) img').src.match(/(.+\/)\d{3}/);
就行了。
 

畫圖這個需求的重點在於計算橢圓點集,至於怎麼操做圖像,抄就行了。

代碼以下:

 1 # -*- coding: utf-8 -*-
 2 
 3 import matplotlib.pyplot as plt  4 import numpy as np  5 from matplotlib.patches import Ellipse  6 import math  7 
 8 #利用matplotlib的Ellipse函數,提供中心點,長,寬,斜率,來計算點集
 9 def method1(): 10     delta = -45.0 # degrees
11 
12     ell = Ellipse((1, 1), 2*math.sqrt(6), 2*math.sqrt(2), delta) 13 
14     a = plt.subplot(111) 15  ell.set_clip_box(a.bbox) 16     ell.set_alpha(0.1) 17  a.add_artist(ell) 18 
19     plt.xlim(-1.5, 3.5) 20     plt.ylim(-1.5, 3.5) 21  plt.show() 22 
23 #利用橢圓的參數方程x=acosθ, y=bsinθ,和三角函數和差公式(旋轉)來計算x,y點集
24 def method2(): 25     plt.subplot(111) 26 
27     #設置座標軸
28     ax = plt.gca() 29     ax.spines['right'].set_color('none') 30     ax.spines['top'].set_color('none') 31     ax.xaxis.set_ticks_position('bottom') 32     ax.spines['bottom'].set_position(('data',0)) 33     ax.yaxis.set_ticks_position('left') 34     ax.spines['left'].set_position(('data',0)) 35 
36     theta = np.linspace(0, 2*np.pi,800) 37     delta = math.pi/4
38     #橢圓公式
39     x,y = np.cos(theta)*math.sqrt(6), np.sin(theta)*math.sqrt(2) 40     #旋轉+平移
41     X,Y = 1+x*math.cos(delta)+y*math.sin(delta),1+y*math.cos(delta)-x*math.sin(delta) 42     #plt.plot(x, y, color='red', linewidth=2.0)
43     plt.plot(X, Y, color='blue', linewidth=2.0) 44 
45     px = [0,0,3,2,2,-1,1,1-math.sqrt(3),1+math.sqrt(3),1-math.sqrt(2),1+math.sqrt(2)] 46     py = [0,3,0,2,-1,2,1,1+math.sqrt(3),1-math.sqrt(3),1+math.sqrt(2),1-math.sqrt(2)] 47     #畫點
48     plt.scatter(px,py, 50, color ='red') 49     #畫線
50     plt.plot([1-math.sqrt(3),1+math.sqrt(3)],[1+math.sqrt(3),1-math.sqrt(3)], color ='black', linewidth=2.5, linestyle="--") 51     plt.plot([0,2],[0,2], color ='black', linewidth=2.5, linestyle="--") 52     plt.plot([1-math.sqrt(2),2,1+math.sqrt(2)],[1+math.sqrt(2),2,1-math.sqrt(2)], color ='black', linewidth=2.5, linestyle="--") 53     #標註
54     plt.annotate('(0,0)',(0,0),xytext=(+15, +5), textcoords='offset points') 55     plt.annotate('(0,3)',(0,3),xytext=(+10, +10), textcoords='offset points') 56     plt.annotate('(3,0)',(3,0),xytext=(+10, +10), textcoords='offset points') 57     plt.annotate('(2,2)',(2,2),xytext=(+10, 0), textcoords='offset points') 58     plt.annotate('(2,-1)',(2,-1),xytext=(0, +10), textcoords='offset points') 59     plt.annotate('(-1,2)',(-1,2),xytext=(+10, 0), textcoords='offset points') 60     plt.annotate('(1,1)',(1,1),xytext=(+12, 0), textcoords='offset points') 61     plt.annotate('(1-√3,1+√3)',(1-math.sqrt(3),1+math.sqrt(3)),xytext=(-40, +20), textcoords='offset points', 62     arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2")) 63     plt.annotate('(1+√3,1-√3)',(1+math.sqrt(3),1-math.sqrt(3)),xytext=(0, -20), textcoords='offset points', 64     arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2")) 65     plt.annotate('(1-√2,1+√2)',(1-math.sqrt(2),1+math.sqrt(2)),xytext=(-105, -5), textcoords='offset points', 66     arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2")) 67     plt.annotate('(1+√2,1-√2)',(1+math.sqrt(2),1-math.sqrt(2)),xytext=(-80, -10), textcoords='offset points', 68     arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2")) 69 
70  plt.show() 71 
72 if __name__ == '__main__': 73 # method1()
74     method2()

最後運行結果是這樣的:

相關文章
相關標籤/搜索