Apr 152012
 

2.RhinoPythonの基礎

2-0.RhinoPythonデモンストレーション

デモンストレーション1

# -*- coding: utf-8 -*-

import rhinoscriptsyntax as rs
import random as rnd
import math as m

n = 50

for i in range(0, n):
	for j in range(0, n):
		r = rnd.randint(20,50)
		x = r*m.sin(2*i/n*m.pi)*m.cos(2*j/n*m.pi)
		y = r*m.sin(2*i/n*m.pi)*m.sin(2*j/n*m.pi)
		z = r*m.cos(2*i/n*m.pi)
		
		rs.AddPoint([x,y,z])
		rs.AddLine([0,0,0],[x,y,z])

デモンストレーション2

# -*- coding: utf-8 -*-

import rhinoscriptsyntax as rs
import math as m 

n=2000

for t in rs.frange(-n,n,1.00):
        arrPoint = [t * m.sin(5*t), t * m.cos(5*t),t]
        rs.AddPoint(arrPoint)

2-1.hello world文の出力

Pythonの基礎


# -*- coding: utf-8 -*-

#2-1.hello world文の出力

#"hello world"の出力
print 'hello world'

#日本語を出力する
print '日本語'

Rhinoへの応用


# -*- coding: utf-8 -*-

import rhinoscriptsyntax as rs

#Rhinoに出力する
rs.AddText ("hello world", [0,0,0], 50)

2-2.エラー処理・デバッグ

2-2-1.エラー処理

# -*- coding: utf-8 -*-

#2-2.エラー処理・デバッグ

#注意:全てのコードでエラーが出るようになっています。

#デバッグしないで「Run script」した場合は、
#コンソール画面に問題の箇所が行数とともに指摘されます。

prin "エラー1"        #「prin」という関数はない。
                      #「print」と入力する

print "エラー2"      #「print」と「"エラー2"」の間に全角スペースが入っている。
                      #半角スペースに修正する

print "エラー3""  #quotation marksが1つ多い
                      #ひとつ消す

print a               #変数(後述(1-4.))が定義されていない。

2-2-2.デバッグ
Rhino5(Win)にはデバッガが実装されている。
(※デバッガ:プログラムの不具合(バグ)の発見や修正を支援するソフトウェア。)

・Breakpoint:プログラムの実行を特定の位置で中断する
 →アイコンをクリックして、任意の行でクリックすると設置される
・Step Into:
・Step Over:
・Step Out:

2-3.演算

Pythonの基礎

# -*- coding: utf-8 -*-

#2-3.演算
 
#簡単な演算
print 1+2       #足し算
print 1+1.55    #足し算
print 2*5       #かけ算
print 10/2      #割り算
print 10%3      #余り
 
#mathライブラリを参照する
import math as m     
print m.pi           #円周率
print m.sin(m.pi)    #正弦
print m.cos(m.pi)    #余弦
 
#mathライブラリを全部import
from math import *
print pi             #円周率
print radians(180)   #ラジアン
 
#参考:mathライブラリのリファレンス
#http://www.python.jp/doc/nightly/library/math.html

#randomライブラリを参照する
import random as rnd       
print rnd.random()         #0.0<=n<1.0の乱数
print rnd.randint(0,100)   #0<=n<=100、整数のみの乱数

#参考:randomライブラリのリファレンス
#http://www.python.jp/doc/nightly/library/random.html

Rhinoへの応用

# -*- coding: utf-8 -*-
import rhinoscriptsyntax as rs
import math as m

rs.AddLine([0,0,0],[100*m.cos(1*m.pi/4),100*m.sin(1*m.pi/4),0])
rs.AddLine([0,0,0],[100*m.cos(2*m.pi/4),100*m.sin(2*m.pi/4),0])
rs.AddLine([0,0,0],[100*m.cos(3*m.pi/4),100*m.sin(3*m.pi/4),0])
rs.AddLine([0,0,0],[100*m.cos(4*m.pi/4),100*m.sin(4*m.pi/4),0])
rs.AddLine([0,0,0],[100*m.cos(5*m.pi/4),100*m.sin(5*m.pi/4),0])
rs.AddLine([0,0,0],[100*m.cos(6*m.pi/4),100*m.sin(6*m.pi/4),0])
rs.AddLine([0,0,0],[100*m.cos(7*m.pi/4),100*m.sin(7*m.pi/4),0])
rs.AddLine([0,0,0],[100*m.cos(8*m.pi/4),100*m.sin(8*m.pi/4),0])

2-4.変数

Pythonの基礎

# -*- coding: utf-8 -*-

#2-4.変数

#「 = 」
#右辺の値と左辺の値が等しいことを示す記号ではない
#右辺の値を左辺の変数へ代入すること

#整数
a=1         
print a

#浮動小数点数
b=10.56     
print b
print a+b

#文字列
c='test'    
d="てすと"
print c
print d
print c+d
print str(a)+d

#ブール(TrueかFalseの値のみを持つ)
a=True
b=False
print a
print b

Rhinoへの応用

# -*- coding: utf-8 -*-
import rhinoscriptsyntax as rs

a = 10
b = 6

plane = rs.PlaneFromFrame( [0,0,0], [1,0,0], [0,1,0] )     #1m*1mの単位正方形plane
rs.AddRectangle( plane, a, b ) 
rs.AddRectangle( plane, 2*a, 2*b ) 
rs.AddRectangle( plane, 3*a, 3*b ) 
rs.AddRectangle( plane, 4*a, 4*b ) 
rs.AddRectangle( plane, 5*a, 5*b ) 
rs.AddRectangle( plane, 6*a, 6*b ) 

2-5.リスト(配列)型

Pythonの基礎

# -*- coding: utf-8 -*-
 
#2-5.リスト(配列)型

a = ['spam', 'eggs', 100, 1234]   #リストの生成

print a                  #リスト全体
print a[0]               #リストの0番目
print a[3]               #リストの3番目
print a[-4]              #リストの後ろから数えて4番目
print a[1:3]             #リストの1番目以降、3番目未満
print a[1:-1]            #リストの1番目以降、後ろから数えて1番目未満
print a[:1]              #リストの1番目未満
print a[3:]              #リストの3番目以降
print a[:]               #リスト全体
print 3*a[:3] + ['Boo!'] #リストの3番目未満を3回繰り替えし、末尾に"Boo!"を加える
 
a[0:2] = [1, 12]         #項目の置換
print a
a[0:2] = []              #項目の消去
print a
a[1:1] = ['bletch', 'xyzzy'] #項目の挿入
print a
 
a[:0] = a                #リストそのもの (のコピー) を先頭に挿入する
print a
a[:] = []                #リストをクリアする
print a

a=[1,2,3]     #リストの代入に関する注意
b=a
a.append(4)
print b
#[1,2,3,4] 

a=[1,2,3]     #リストの代入(代入したリストの保持)
b=a[:]
a.append(4)
print b
#[1,2,3] 
 
a=[0,1,'test']           #リスト内に指定した値があるか調べる
print 'test' in a
 
a = ['a', 'b', 'c', 'd'] #リストの項目数
print len(a)
 
#参考1:range
#整数の数値からなるリストを返す関数
a = range(10)
print a
a = range(5, 10)
print a
#[5, 6, 7, 8, 9]
a = range(0, 10, 3)
print a
#[0, 3, 6, 9]
a = range(-10, -100, -30)
print a
#[-10, -40, -70]
 
#参考2:リストの入れ子
q = [2, 3]
p = [1, q, 4]
print p
print len(p)
print p[1]
print p[1][0]
p[1][1]='test'
print p
p[1].append('extra')
print p
 
#参考3:リストに関するその他のコマンド
#http://www.python.jp/doc/nightly/tutorial/datastructures.html
a = [66.25, 333, 333, 1, 1234.5]
print a.count(333), a.count(66.25), a.count('x')
#2 1 0
a.insert(2, -1)
a.append(333)
print a
#[66.25, 333, -1, 333, 1, 1234.5, 333]
print a.index(333)
#1
a.remove(333)
print a
#[66.25, -1, 333, 1, 1234.5, 333]
a.reverse()
print a
#[333, 1234.5, 1, 333, -1, 66.25]
a.sort()
print a
#[-1, 1, 66.25, 333, 333, 1234.5]

Rhinoへの応用

# -*- coding: utf-8 -*-
import rhinoscriptsyntax as rs
 
a=[[10,10,0],
   [10,-10,0],
   [-10,-10,0],
   [-10,10,0],
   [10,10,20],
   [10,-10,20],
   [-10,-10,20],
   [-10,10,20],
   ]
 
rs.AddBox(a)

2-6.ディクショナリ(辞書)型

Pythonの基礎

# -*- coding: utf-8 -*-

#2-6.ディクショナリ(辞書)型

#キー(key): 値(value) のペアの集合であり、キーが (辞書の中で)一意でければならない

tel = {'jack': 4098, 'sape': 4139}  #ディクショナリの生成
print tel
#{'sape': 4139, 'guido': 4127, 'jack': 4098}

print tel['jack']       #キーに対応する値
#4098
del tel['sape']         #項目の削除
print tel
#{'jack': 4098}
tel['guido'] = 4127     #項目の追加
print tel
#{'jack': 4098, 'guido': 4127}

print tel.keys()        #すべてのキー
#['jack', 'guido']
print tel.values()      #すべての値
#[4098, 4127]
print 'guido' in tel    #キーが辞書にあるかどうか調べる
#True

#参考:ディクショナリに関するその他のコマンド
#http://www.python.jp/doc/nightly/tutorial/datastructures.html#tut-dictionaries

2-7.制御構造

Pythonの基礎

# -*- coding: utf-8 -*-
 
#2-7.制御構造
 
#流れに注目
 
#流れ1:プログラムは上から下に流れる
 
print "上流"
print "下流"
 
#流れ2:プログラムはループするfor、while文
 
#for
for i in range(0,100):
    print i
 
#while
i=0
while i<100:
    print i
    i+=1
 
#break
#最も内側の for または while ループを中断する
for n in range(0, 10):
    if n < 5:
        print n
    else:
        break
 
#流れ3:プログラムは分岐するif文

#1.if
#if 条件式:
#  条件式が真の時に実行する処理

a=1
if a:
	print a

#2.if~else
#if 条件式:
#  条件式が真の時に実行する処理
#else:
#  条件式が偽の時に実行する処理

# 比較演算子
# 演算子 意味
# ==     等しい
# !=     等しくない
# <      より小さい
# >      より大きい
# <=     より小さいか等しい
# >=     より大きいか等しい
 
a=1
b=2
if(a == b):
    print "a と b は同じ値"
else:
    print "a と b は異なる値"
#"a と b は異なる値"
 
# 論理演算子
# not x     x の否定(真偽の反転)
# x and y   x が真かつ y が真ならば真
# x or y    x が真まはた y が真ならば真
 
a=True
b=False
if(a or b):
    print "a が真または b が真"
else:
    print "a も b も偽"
#"a が真または b が真"
 
#3.if~elif~else
#if 条件式1:
#  条件式1が真の時に実行する処理
#elif 条件式2:
#  条件式1が偽で条件式2が真の時に実行する処理
#elif 条件式3:
#  条件式1及び条件式2が偽で条件式3が真の時に実行する処理
#else:
#  全ての条件式が偽の時に実行する処理
 
a=1
b=2
if(a < b):
    print "a より b のほうが大きい値"
elif(a > b):
    print "a より b のほうが小さい値"
else:
    print "a と b は同じ値"
#"a より b のほうが大きい値"

Rhinoへの応用1

# -*- coding: utf-8 -*-
import rhinoscriptsyntax as rs
import math as m

r = 100
i = 0

while i<1000:
    rs.AddPoint(i,r*m.sin(i*m.radians(5)),0)
    i+=1

Rhinoへの応用2

# -*- coding: utf-8 -*-
import rhinoscriptsyntax as rs

for i in range(0,10):
	for j in range(0,10):
		for k in range(0,10):
			
			rs.AddPoint([i,j,k])

演習(1)

ユークリッド互除法を実装しなさい
(2 つの自然数(または整式) a と b との最大公約数を求めるアルゴリズムを実装しなさい)

1.入力を m, n (m ≧ n) とする。
2.n = 0 なら、 m を出力してアルゴリズムを終了する。
3.m を n で割った余りを新たに n とし、更に 元のnを新たにm とし 2. に戻る。

参考:ユークリッド互除法(Wikipedia)

 Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>