-
Jupyterhub 繪圖 - 漸開線範例(已儲存8888.kmol.info)
-
CentOS 安裝 Python 3.3
-
倉儲python-solvespace已更新
漸開線範例
嘗試使用純 slvs
程式庫(而非使用 matlab 的公式)的方式畫出漸開線。
雖然程式庫中有比較弧長和線段長的公式,但是無法因應多圈的狀況,所以使用內建math的 pi
來計算弧長。
越多圈的漸開線計算越久,角度參照是基圓而非漸開線尾。
%matplotlib inline #漸開線解題 #由端點Point3畫出圖形 from slvs import * import matplotlib.pyplot as plt from math import * #參數 r = 10.0#基圓半徑 def Involute(degree): #角度換算:degree去除重複圈數 d = r*(degree*pi/180) n = degree//360 degree -= 360*n #開始繪圖 sys = System(500) g = 1 #3D原點Point0 p0 = sys.add_param(0.0) p1 = sys.add_param(0.0) p2 = sys.add_param(0.0) Point0 = Point3d(p0, p1, p2) #XY法線 qw, qx, qy, qz = Slvs_MakeQuaternion(1, 0, 0, 0, 1, 0) p3 = sys.add_param(qw) p4 = sys.add_param(qx) p5 = sys.add_param(qy) p6 = sys.add_param(qz) Normal1 = Normal3d(p3, p4, p5, p6) #工作平面 Workplane1 = Workplane(Point0, Normal1) #2D原點Point1 p7 = sys.add_param(0.0) p8 = sys.add_param(0.0) Point1 = Point2d(Workplane1, p7, p8) Constraint.dragged(Workplane1, Point1) #Angle約束判斷 if degree >= 180: other = -1 else: other = 1 #Point2繞行圓周,距離r p9 = sys.add_param(0.0) p10 = sys.add_param(10.0*other) Point2 = Point2d(Workplane1, p9, p10) Constraint.distance(r, Workplane1, Point1, Point2) Line1 = LineSegment2d(Workplane1, Point1, Point2) #Point3距離Point2為目前圓周長 #並且連線d會垂直半徑連線r p11 = sys.add_param(10.0*other) p12 = sys.add_param(10.0*other) Point3 = Point2d(Workplane1, p11, p12) if d == 0: Constraint.on(Workplane1, Point2, Point3) else: Line2 = LineSegment2d(Workplane1, Point2, Point3) Constraint.distance(d, Workplane1, Point2, Point3) Constraint.perpendicular(Workplane1, Line1, Line2, False) #輔助基線Line0 p13 = sys.add_param(10.0) p14 = sys.add_param(0.0) Point4 = Point2d(Workplane1, p13, p14) Constraint.dragged(Workplane1, Point4) Line0 = LineSegment2d(Workplane1, Point1, Point4) #約束角度 Constraint.angle(Workplane1, degree, Line1, Line0, False) #以下解題 sys.solve() if (sys.result == SLVS_RESULT_OKAY): #回傳Point7 x = sys.get_param(11).val y = sys.get_param(12).val return x, y elif (sys.result == SLVS_RESULT_INCONSISTENT): print ("solve failed") print ("SLVS_RESULT_INCONSISTENT") print ("%d DOF" % sys.dof) elif (sys.result == SLVS_RESULT_DIDNT_CONVERGE): print ("solve failed") print ("SLVS_RESULT_DIDNT_CONVERGE") print ("%d DOF" % sys.dof) elif (sys.result == SLVS_RESULT_TOO_MANY_UNKNOWNS): print ("solve failed") print ("SLVS_RESULT_TOO_MANY_UNKNOWNS") print ("%d DOF" % sys.dof) #主程式 Xval = [] Yval = [] degree = 720 for i in range(0, degree+1, 1): x, y = Involute(i) Xval += [x] Yval += [y] print ("Solve Completed") plt.plot(Xval, Yval) plt.xlabel('x coordinate') plt.ylabel('y coordinate') plt.title("Involute - "+str(degree)+" deg") plt.show()
由於 Point2
是逆時針旋轉,必須保持 Point3
在它的後方,之間的連線也必須相切基圓,即與其半徑垂直。
然而 slvs
程式庫無法解決距離為 0
的情況,必須自己改成重合約束,目前在程式庫說明中加上註解,不過應該有辦法透過原始碼的標頭檔避開這個問題,晚點會修正這個情況,如果情況順利,明天的網誌中會更新。
結果圖形:
Jupyter 運行結果(計算時間較長):
CentOS 7
為虛擬機(研究室的電腦)安裝官方的 Everything 版本(ISO映像檔),但是電腦效能只能同時跑一個程式,所以安裝很緩慢。
最後還是灌好了。
但是安裝完後之前選的 Python 工具包中竟然只有 Python 2.7,所以上網找了一下資料,用手動make的方式安裝 Python 3.3.6。
http://tecadmin.net/install-python-3-4-on-centos-rhel-fedora/
CentOS 相較於 Ubuntu 操作方式不太一樣,而雖然安裝畫面是寫 KDE 圖形介面,但卻是 GNOME 包著 KDE 的附屬程式,而且它們的介面還比 Ubuntu 陽春。
慶幸的是 CentOS 的開發者工具包十分完善,應該是不用 Netbeans 了,可以直接用終端機make。
Comments
comments powered by Disqus