2012年6月19日 星期二

Vpython tutorial 簡易上手


好用的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)
作完才可以回家!!!

See Also

沒有留言:

張貼留言