好用的visual python pdf詳述功能
http://www.cmsthailand.com/docs/python.pdf
參考網站http://itrs.tw/wiki/Vpython_tutorial
Vpython tutorial
Contents[hide] |
vpython
vpython是python的visual package,今天這堂社課將教你如何使用vpython化出3D圖形,構造機械模型,與畫出二維函數圖
installation
pyhon & ipython & box
在command line打入
ipython
按Ctrl+d可以離開
進入ipython 首先,第一行
from visual import *
這是引入visual函式庫的意思
再來,用box()造出一個盒子
a = box()
嘿!跑出了一個繪圖視窗。 在繪圖視窗按 滑鼠右鍵,可以用來 旋轉場景 在繪圖視窗按 滑鼠中鍵,可以用來 縮放場景 試試!
a.<tab鍵>
就會跑出
a.__class__ a.__setattr__ a.frame
a.__copy__ a.__str__ a.green
a.__delattr__ a.__weakref__ a.height
a.__dict__ a._complete_init a.length
a.__doc__ a._get_axis a.pos
a.__getattribute__ a._get_pos a.red
a.__hash__ a._get_up a.rotate
a.__init__ a._set_axis a.size
a.__instance_size__ a._set_pos a.up
a.__module__ a._set_up a.visible
a.__new__ a.axis a.width
a.__reduce__ a.blue a.x
a.__reduce_ex__ a.color a.y
a.__repr__ a.display a.z
這些是a這個物件可以使用的函數和性質 可以如此使用:
a.visible = 0
visible是 可視 之意,a.visible=0就看不到a了!
a.visible = 1
這樣a又跑出來了,簡單吧!
- a是什麼?
a視一個物件,其實只要輸入box()就可以造出一個盒狀物,但是a = box()可以令該盒子的名子為 a,方便之後操作
cylinder
按Ctrl+D離開,再打入 ipython進入。這麼做是為了清空剛剛的螢幕。注意,繪圖視窗也要關掉喔。
在ipython裡,打入
from visual import *
c = cylinder()
就跑出了一個圓柱體。
調整
c.pos = (2, 3, 4)
就可以把c這個圓柱體的起始點設定到(2, 3, 4)。
旋轉看看!剛剛旋轉的時候,是以一面的中心點旋轉,因為當時圓柱體的起始點是(0, 0, 0) 現在修改到(2, 3, 4)我們可以看到旋轉的時候(動動你的滑鼠右鍵)變成別的點轉。其實,是圓柱體的起始位置移動了!
c.<tab鍵>
看看cylinder有什麼東西可用
c.color = (0, 0, 1)
c.color儲存(red, green, blue)三色混合的值。注意:電腦是光的三原色,不是顏料三原色!所以
c.color = (0, 0, 0)
會變成白色
也有另外的辦法
c.color = color.<tab>
我們會看到
color.__builtins__ color.magenta color.__hash__
color.__doc__ color.orange color.__init__
color.__file__ color.red color.__new__
color.__name__ color.rgb_to_hsv color.__reduce__
color.black color.white color.__reduce_ex__
color.blue color.yellow color.__repr__
color.colorsys color.__class__ color.__setattr__
color.cyan color.__delattr__ color.__str__
color.green color.__dict__
color.hsv_to_rgb color.__getattribute__
其中red, blue, green之類的是已經調好的顏色,可以用
c.color = color.yellow
這種方法改變顏色
然後,讓我們玩玩
c.length = 10
看!cylinder變成一支長桿了!length是圓柱體的長度
c.radius = 10
阿,怎麼又變回原來的樣子了?原來,vpython的鏡頭會依據全部物體大小的比例伸縮,其實我們的確有改變radius,只是比例看起來跟第一個圓柱體一樣罷了(1:1 = 10:10)
- radius
半徑長
再試
c.axis = (0, 0, 1)
現在圓柱變成扁盤了!原來axis是指貫過兩個圓心的那個軸。是有方向,有長度的
也可以如此
c.axis = (0, 5, 5)
這樣會改變圓柱體的長度和方向(旋轉!)
- axis
axis就是軸。軸以pos所指定的點為初始點(以其為新原點) </pre> 試試
arrow & ellipsoid & box & ring & pyramid & helix
arrow
首先,按Ctrl+D離開ipython,再重新進入:
from visual import *
a = arrow(pos = (5, 0, 0))
跑出一支箭頭。看看他有什麼性質:
a.<tab鍵>
跑出:
a.__class__ a.__str__ a.green
a.__copy__ a.__weakref__ a.headlength
a.__delattr__ a._complete_init a.headwidth
a.__dict__ a._get_axis a.length
a.__doc__ a._get_pos a.pos
a.__getattribute__ a._get_up a.red
a.__hash__ a._set_axis a.rotate
a.__init__ a._set_pos a.shaftwidth
a.__instance_size__ a._set_up a.up
a.__module__ a.axis a.visible
a.__new__ a.blue a.x
a.__reduce__ a.color a.y
a.__reduce_ex__ a.display a.z
a.__repr__ a.fixedwidth
a.__setattr__ a.frame
- 小技巧: 沒打玩的東西,按<tab鍵,就會給你建議,或補完!>
a.length = 10
加長其長度
a.axis = (0, 0, 10)
設定其軸與長
ellipsoid
ep = ellip<tab補完>
ep = ellipsoid(pos = (0, 5, 0))
設定pos是為了不讓新產生出來的物體蓋到舊的。
- ellipsoid
橢球,橢圓繞軸旋轉而得
ep.<tab鍵>
跑出
ep.__class__ ep.__setattr__ ep.frame
ep.__copy__ ep.__str__ ep.green
ep.__delattr__ ep.__weakref__ ep.height
ep.__dict__ ep._complete_init ep.length
ep.__doc__ ep._get_axis ep.pos
ep.__getattribute__ ep._get_pos ep.red
ep.__hash__ ep._get_up ep.rotate
ep.__init__ ep._set_axis ep.size
ep.__instance_size__ ep._set_pos ep.up
ep.__module__ ep._set_up ep.visible
ep.__new__ ep.axis ep.width
ep.__reduce__ ep.blue ep.x
ep.__reduce_ex__ ep.color ep.y
ep.__repr__ ep.display ep.z
修改其外切盒大小(用一長方體外切橢球)
ep.size = (3, 4, 5)
變成扁球了。
- a, c, ep是啥
其實他們都只是名字。我們可以直接使用 box()創造出一個盒子,但是b=box()讓我們以後可以利用b來修改其性質
box
b = box()
產生一個長方體
b.size = (3, 3, 5)
修改其軸:
b.axis = (2, 3, 4)
現在變成斜的盒子了!
之前我們改變axis看不出來,其實因為場景在旋轉,現在有其他的物體,就可以看出其相對關係。
ring
ri = ring(pos = (10, 0, 0))
ring,就像一個戒指,圓環,hula hoop?
ri.<tab>補完
跑出
ri.__class__ ri.__setattr__ ri.frame
ri.__copy__ ri.__str__ ri.green
ri.__delattr__ ri.__weakref__ ri.pos
ri.__dict__ ri._complete_init ri.radius
ri.__doc__ ri._get_axis ri.red
ri.__getattribute__ ri._get_pos ri.rotate
ri.__hash__ ri._get_up ri.thickness
ri.__init__ ri._set_axis ri.up
ri.__instance_size__ ri._set_pos ri.visible
ri.__module__ ri._set_up ri.x
ri.__new__ ri.axis ri.y
ri.__reduce__ ri.blue ri.z
ri.__reduce_ex__ ri.color
ri.__repr__ ri.display
其中,比較特別的:
ri.thickness = 0.2
可以調整圓環柱的半徑。
pyramid
py = pyramid(pos = (5, 5, 0))
就跑出一座金字塔 其參數有
py.__class__ py.__setattr__ py.frame
py.__copy__ py.__str__ py.green
py.__delattr__ py.__weakref__ py.height
py.__dict__ py._complete_init py.length
py.__doc__ py._get_axis py.pos
py.__getattribute__ py._get_pos py.red
py.__hash__ py._get_up py.rotate
py.__init__ py._set_axis py.size
py.__instance_size__ py._set_pos py.up
py.__module__ py._set_up py.visible
py.__new__ py.axis py.width
py.__reduce__ py.blue py.x
py.__reduce_ex__ py.color py.y
py.__repr__ py.display py.z
玩玩看~
helix
hi = helix(pos = (0, 5, 5))
這是螺旋,彈簧狀物,在力學問題好用
其參數有:
hi.__class__ hi._get_radius hi._set_visible
hi.__delattr__ hi._get_red hi._set_x
hi.__dict__ hi._get_thickness hi._set_y
hi.__doc__ hi._get_up hi._set_z
hi.__getattribute__ hi._get_visible hi.axis
hi.__hash__ hi._get_x hi.blue
hi.__init__ hi._get_y hi.cached_length
hi.__module__ hi._get_z hi.coils
hi.__new__ hi._helix__coils hi.color
hi.__reduce__ hi._helix__frame hi.display
hi.__reduce_ex__ hi._helix__radius hi.frame
hi.__repr__ hi._set_axis hi.green
hi.__setattr__ hi._set_blue hi.helix
hi.__str__ hi._set_coils hi.length
hi.__weakref__ hi._set_color hi.pos
hi._get_axis hi._set_display hi.radius
hi._get_blue hi._set_frame hi.red
hi._get_coils hi._set_green hi.thickness
hi._get_color hi._set_length hi.up
hi._get_display hi._set_pos hi.visible
hi._get_frame hi._set_radius hi.x
hi._get_green hi._set_red hi.y
hi._get_length hi._set_thickness hi.z
hi._get_pos hi._set_up
恩,很多
hi.length = 10
看,彈簧變鬆了! 看了那麼多,快去玩玩看!
curve
這邊學習如何在pyhton裡畫三維的弧線
首先,Ctrl+d離開(清空螢幕),在用ipython進入
from visual import *
介紹一下python的迴圈:
for i in range(10):
print "%d %d" % (i, i*i)
- 打完之後按兩個enter,才會執行
相當於C裡的
for( i=0; i<10; i++)
printf("%d %d\n", i, i*i);
注意冒號和縮排!python裡,縮排的公用就像C的括弧 然後
for i in arange(0, 10, 0.1):
print "%d", i
相當於
for(i=0; i<10; i=i+0.1)
printf("%d\n", i);
利用著個功能,我們作:
c = curve(pos=(1, 0, 0))
這是在設定初始點,之後
for i in arange(0, 10, 0.1):
c.append(pos=(cos(i), sin(i), i))
看看跑出什麼?
接下來,我們玩玩色彩的魔術:
for i <按上,上下左右的上,就可以叫初上一次打的東西>
修改一下
for i in arange(0, 1000, 0.1):
c.append(pos=(cos(i), sin(i), i), color = (i%1, i%2, i%3))
rate(24)
- python裡的%可以對浮點數取餘數!
- rate 指得是這個迴圈一秒會跑幾次。24是人眼是是覺暫留的頻率,當然你可以調更快
看看!動畫耶!
調整角度,螢幕會自動縮放
- 按ctrl+c可以強迫結束!
玩玩看!
gcurve
首先,按ctrl+d 離開ipyhton,再進入
from visual.graph import *
這裡和之前不同喔! 現在我們要用python在格子圖裡畫圖表!
c = gcurve()
跑出了一個圖表
再來,同樣使用python的迴圈:
for i in arange(0, 10, 0.1):
c.plot(pos = (i, cos(i)))
看!一張cos的圖(i當作x軸的參數)
- plot 描圖,描點
再來,畫另一條線:
d = curve(color = color.green)
for i in arange(0, 10, 0.1):
d.plot(pos=(i, sin(i)))
可以調顏色喔!
再一條:
e = curve(color = color.blue)
for i in arange(0, 10, 0.1):
c.plot(pos=(i, tan(i)))
這是tan的圖形...咦?
- 為什麼sin, cos變扁了?
因為y軸隨tan的值壓縮,相較起來sin, cos就變扁
- 那無限大呢?
因為我們只是每0.1格畫一次,所以沒畫到啦!
想一個想畫的函數,畫畫看!
恐怖的作業
1. 畫出 一個有手、腳、頭、身的機器人。 2. 用gcurve畫出阻尼震盪函數:y = 100^(-x*x)*cos(x)
作完才可以回家!!!
沒有留言:
張貼留言