python畫出三角形外接圓和內(nèi)切圓的方法
剛看了《最強大腦》中英對決,其中難度最大的項目需要選手先腦補泰森多邊形,再找出完全相同的兩個泰森多邊形。在驚呆且感嘆自身頭腦愚笨的同時,不免手癢想要借助電腦弄個圖出來看看,閑來無事吹吹牛也是極好的。
今天先來畫畫外接圓和內(nèi)切圓,留個大坑后面來填。
外接圓圓心:三角形垂直平分線的交點。
內(nèi)切圓圓心:三角形角平分線的交點。
有了思路,就可以用萬能的python來計算了
import matplotlib.pyplot as plt from scipy.linalg import solve import numpy as np from matplotlib.patches import Circle ''' 求三角形外接圓和內(nèi)切圓 ''' # 畫個三角形 def plot_triangle(A, B, C): x = [A[0], B[0], C[0], A[0]] y = [A[1], B[1], C[1], A[1]] ax = plt.gca() ax.plot(x, y, linewidth=2) # 畫個圓 def draw_circle(x, y, r): ax = plt.gca() cir = Circle(xy=(x, y), radius=r, alpha=0.5) ax.add_patch(cir) ax.plot() # 外接圓 def get_outer_circle(A, B, C): xa, ya = A[0], A[1] xb, yb = B[0], B[1] xc, yc = C[0], C[1] # 兩條邊的中點 x1, y1 = (xa + xb) / 2.0, (ya + yb) / 2.0 x2, y2 = (xb + xc) / 2.0, (yb + yc) / 2.0 # 兩條線的斜率 ka = (yb - ya) / (xb - xa) if xb != xa else None kb = (yc - yb) / (xc - xb) if xc != xb else None alpha = np.arctan(ka) if ka != None else np.pi / 2 beta = np.arctan(kb) if kb != None else np.pi / 2 # 兩條垂直平分線的斜率 k1 = np.tan(alpha + np.pi / 2) k2 = np.tan(beta + np.pi / 2) # 圓心 y, x = solve([[1.0, -k1], [1.0, -k2]], [y1 - k1 * x1, y2 - k2 * x2]) # 半徑 r1 = np.sqrt((x - xa)**2 + (y - ya)**2) return(x, y, r1) # 內(nèi)切圓 def get_inner_circle(A, B, C): xa, ya = A[0], A[1] xb, yb = B[0], B[1] xc, yc = C[0], C[1] ka = (yb - ya) / (xb - xa) if xb != xa else None kb = (yc - yb) / (xc - xb) if xc != xb else None alpha = np.arctan(ka) if ka != None else np.pi / 2 beta = np.arctan(kb) if kb != None else np.pi / 2 a = np.sqrt((xb - xc)**2 + (yb - yc)**2) b = np.sqrt((xa - xc)**2 + (ya - yc)**2) c = np.sqrt((xa - xb)**2 + (ya - yb)**2) ang_a = np.arccos((b**2 + c**2 - a**2) / (2 * b * c)) ang_b = np.arccos((a**2 + c**2 - b**2) / (2 * a * c)) # 兩條角平分線的斜率 k1 = np.tan(alpha + ang_a / 2) k2 = np.tan(beta + ang_b / 2) kv = np.tan(alpha + np.pi / 2) # 求圓心 y, x = solve([[1.0, -k1], [1.0, -k2]], [ya - k1 * xa, yb - k2 * xb]) ym, xm = solve([[1.0, -ka], [1.0, -kv]], [ya - ka * xa, y - kv * x]) r1 = np.sqrt((x - xm)**2 + (y - ym)**2) return(x, y, r1) if __name__ == '__main__': A = (1., 1.) B = (5., 2.) C = (5., 5.) plt.axis('equal') plt.axis('off') plot_triangle(A, B, C) x, y, r1 = get_outer_circle(A, B, C) plt.plot(x, y, 'ro') draw_circle(x, y, r1) x_inner, y_inner, r_inner = get_inner_circle(A, B, C) plt.plot(x_inner, y_inner, 'ro') draw_circle(x_inner, y_inner, r_inner) plt.show()
下面看看兩個三角形的結果:
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
python中找出numpy array數(shù)組的最值及其索引方法
下面小編就為大家分享一篇python中找出numpy array數(shù)組的最值及其索引方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04python GUI庫圖形界面開發(fā)之PyQt5信號與槽多窗口數(shù)據(jù)傳遞詳細使用方法與實例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5信號與槽多窗口數(shù)據(jù)傳遞詳細使用方法與實例,需要的朋友可以參考下2020-03-03vscode autopep8無法格式化python代碼問題解決
這篇文章主要為大家介紹了vscode autopep8無法格式化python代碼問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09使用Python Flask實現(xiàn)簡易文件上傳功能
在平時工作中,文件上傳是一項常見的需求,例如將應用異常時通過腳本生成的dump文件收集起來進行分析,但實現(xiàn)起來卻可能相當復雜,在本文中,我們將探討如何使用Flask實現(xiàn)文件上傳功能,編寫Dockerfile將應用程序通過docker部署,需要的朋友可以參考下2024-05-05Python 實現(xiàn)一行輸入多個數(shù)字(用空格隔開)
這篇文章主要介紹了Python 實現(xiàn)一行輸入多個數(shù)字,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-04-04