-
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