Category:Home/tutorial (Total 12 items)
Categories - tutorial
Paths
- 2008-06-13 (金)
- tutorial/specifics
NodeBox内のパスはベジェカーブ http://en.wikipedia.org/wiki/B%E9zier_curveにより作られる。
ベジェはコンピュータグラフィックスで曲線を描画する際一般的に使われる。
ベジェカーブは始点、終点、それらの点のベクトルを説明する2つのコントロールハンドルで定義される。
最初のハンドルは前方の始点の湾曲を説明し、二番目のハンドルは後方の二番目の点の湾曲を説明する。
例:
nofill()
stroke(0)
autoclosepath(False)
beginpath(100,100)
curveto(150, 100, 200, 200, 50, 400)
p = endpath()
図(略)
パスのデフォルトの状態は、strokeの色が無く、fillがTrueでパスは閉じている。
プレーンなヴィジュアルにするにはnofill(), autoclosepath() and stroke() を使う。
Bezier math in NodeBox
NodeBoxでは、パス上のすべての点、全てのコントロールハンドルにアクセスする方法がある。
この方法は、パスをオンザフライで変形させ、(textpathI()を使って)タイプを操作出来る。
さらに、パス上で沢山のmathオペレーションをつかうことができ、(例えば、パスの中間点のx,y座標を見付ける)、異なるパスを結合したり、交差させたり出来る。
- Manipulating points on a pathhttp://nodebox.net/code/index.php/Manipulating_Paths
- Path mathematicshttp://nodebox.net/code/index.php/Path_Mathematics
- Compound paths: union, intersection, differencehttp://nodebox.net/code/index.php/Compound_paths
- Clamping pathshttp://nodebox.net/code/index.php/Clamping_paths
- Comments (Close): 0
- TrackBack (Close): 0
Psyco specialization
- 2008-06-13 (金)
- tutorial/advanced
fromhttp://nodebox.net/code/index.php/Psyco_specialization
Psycohttp://psyco.sourceforge.net/introduction.htmlはPythonの為に特化されたコンパイラである。
特定のmathもしくはリストに集約的なコマンドを(2倍から100倍)早く走らせることが出来る。
PsycoはNodeBoxに含まれ、インテルマック(i386アーキテクチャ)上で動作する。
コマンドを最適化するにはシンプルに、:
try:
import psyco
psyco.bind(command_name)
except:
pass
あなたが考えるC extensionで書かれたどのようなコードも代りにPsycoを使用できる。
Psycoがコマンドを調べ、最適化する為にbind()を使いなさい。
Psycoはオンザフライで早くマシンコードを吐き出すであろう。
Psycoの無いユーザーがスクリプトを走らせることが出来るように、Psycoバインディングをtry-exceptブロックで包むことを忘れないこと。
Specialized libraries
NodeBox 1.9.3上ではいくつかのライブラリがPsycoを用いている。
- Comments (Close): 0
- TrackBack (Close): 0
Commands
- 2008-05-31 (土)
- tutorial/strategy
fromhttp://nodebox.net/code/index.php/Commands
NodeBoxリファレンスhttp://nodebox.net/code/index.php/Referenceの定義済みのコマンドとは別に、あなた自身でカスタムコマンドを定義できる。
コマンドを作成することは、スクリプトのある動作や断片を再利用するデザイン戦略である。
画像省略
例えば上の例では、花を描くための全ての動作(線と接続した10個のレッドーピンクの円)は、手軽なflower()コマンドにグループ化されている。
このコマンドは一回でも100回でも1000回でも呼び出せる。
花を描く方法を変更したければ、コードの1つの箇所を変更するだけである。
コマンドを定義することは、何度も使うことが出来る道具のセットを使って、道具箱を構成するのと同じである。
Command definition
シンプルな例として、独自に定義した header()コマンドを下記に記す。
def header(txt, x, y):
fill(1, 0, 0)
font("Dolly-Bold", 18)
text(txt, x, y)
コマンドの定義はdefで始める。続いてコマンドの名前(関連性のある名前を付けよ)、次いでパラメータのリストが来る。
行の最後に:コロンを付けるのを忘れないように。これは、続くインデントされたステートメントがそのコマンドであるということをNodeboxに伝えるためである。
Naming conventions:
- コマンドが何をするのかの記述となるような、シンプルで関連性のある名前を使え。
- 小文字とアンダースコアを使えlower_case_with_underscores。(imagesizeのような不可欠なコマンドは除く)
- コマンドがTrueかFalseを返すものなら頭にisを付けろ。: is_white, is_alive, is_big, ...
- 値を変化させて返すコマンドには頭に動詞を付けろ。: adjust_contrast, strip_tags, ...
Parameters
コマンド定義はそれ自身では実行されない。:
あなたが代りにNodeBoxに何かを教えている。 (例えば、headerが何か?)
コマンド定義はスクリプトのどこかで呼び出される必要がある。
これが、パラメータを入れさせる所である。:
header()の定義がどうtxt,x,yを使用するかに注意せよ。
これらは変数の定義のように使用される。
一度コマンドが呼び出され、txt,x,yに実際の値を与える。
header("Templating", 20, 40)
これでNodeboxは、header()で定義された全てのコードに、textへ"Templating",xへ20、yへ40が実行される。
Return value
NodeBox内のコマンドが返す値を持っており、変数を保持できることに注意。
例えば、textheight(txt, w) は表示されたtxtのパラグラフの高さを、幅と共に返す。
def paragraph(txt, x, y, w):
fill(0.2)
font("Dolly-Roman", 14)
text(txt, x, y, w)
return textheight(txt, w)
定義でのreturnステートメントは値を返す。
これは数値、文字列、リストなんででもできる。
returnステートメントは定義の最後にいつもくる。
Example
下の例では、2つのスクリプトとも同じ動作をする。
片方は上から下へプレーンに使用していて、片方はテンプレートを使用している。
実際には最初のコードの方が短い、しかし、2つでなく20個のパラグラフを書くことを想像せよ。
…フォントを定義して、カラーもまた定義して…結局ロボットに何か説明する別のロボットが欲しくなるだろう。
そのうえ、ヘッダのカラーや、水平マージンを変更するには2番目のスクリプトがはるかに簡単である。
なぜなら、header()の定義を変えるか、変数xの値を変えるかのただ一回で済むから。
1st:plain top-to-bottom scripting.
fill(1, 0, 0.25)
font("Dolly-Bold", 14)
txt = "Without templating"
text(txt, 20, 30, 200)
fill(0.2)
font("Dolly-Roman", 14)
txt = "Without templating, ..."
text(txt, 20, 50, 200)
fill(1, 0, 0.25)
font("Dolly-Bold", 14)
txt = "Messy"
text(txt, 20, 120, 200)
fill(0.2)
font("Dolly-Roman", 14)
txt = "This makes your script...."
text(txt, 20, 140, 200)
2nd:The same script with templates.
def header(txt, x, y):
fill(1, 0, 0.25)
font("Dolly-Bold", 14)
text(txt, x, y, outline=True)
return textheight(txt)
def paragraph(txt, x, y, w):
fill(0.2)
font("Dolly-Roman", 14)
text(txt, x, y, w, outline=True)
return textheight(txt, w)
x = 20
y = 30
w = 200
y += header("With templating", x, y)
txt = "With templating, ..."
y += paragraph(txt, x, y, w) + 10
y += header("Clean", x, y)
txt = "This keeps your script..."
paragraph(txt, x, y, w)
- Comments (Close): 0
- TrackBack (Close): 0
Repetition
- 2008-05-31 (土)
- tutorial/strategy
fromhttp://nodebox.net/code/index.php/Repetition
繰り返し処理(Repetition)はコンピュータが本当に良いということです。
決して退屈させないし、何重にも同じ処理を頼むことが出来るし、貴方が繰り返し処理を嫌いになる事はないであろう。
そしてまた、計算が速いです。
The for-loop
プログラミング中に、複数回同じ事を繰り返す時、一般的にfor-loop(for文によるループ)を呼び出す。
for-loopは指折りで数える手をセットするのに似ている。
しかし、手の数は無限であり、数える指も無限である。
ステートメントは以下である。:
for variable in list: do stuff
最後に:コロンを付けるのを忘れないこと!
The variable part
変数は好きなようにどんな名前も付けられる(Variablesの項で記述済み)。
変数は現在どの指を数えているか保持する。
一般的な名前はiである。
これは、基本的な数学でカウンタがiと命名されることの名残である。
これは短い文字で、長い歴史を持つ良いしきたりである。
The list part
Listパートは数字、もしくは属性のリストである。
各エレメントが連続してVariableパートへ割り当てられる。
for-loopは唯、指を数えない。それはどのようにでも望むようにカウントできるし、numbers, strings, colorsと、どんなものでもListに入れることが出来る。
for i in ["apple", "pear", "banana"]:
print i
>>> apple
>>> pear
>>> banana
一般的にリストとしてrange(n)コマンドを入れる。
これは0からnまでの数字のリストを返す。
for i in range(3):
print i
>>> 0
>>> 1
>>> 2
The do stuff part
do stuffパートは繰り返し実行される必要がある、NodeBoxコマンドである。
それらはfor-ステートメント文から空白かタブでインデントする。
スクリプトはここでループを「捕獲」し、連続的に変数に割り当てられたリストを使って、それぞれのエレメントがあるまで、実行され続ける。
もちろんそれぞれのループに変数を使用できることは素晴しい所です。
上の例のように、小さなループを持った時、全てのフルーツを通過し、それぞれのフルーツをプリントする。
print i は抽象的なコマンドで、NodeBoxはiをそれぞれのリスト内のエレメントに置き換えてループする。
ステートメント文の最後に:を付けるのを忘れないように!
For-loops and random()
for-loopとrandom()はうまく一緒に動作する。
例えば100個の輪を作って、ランダムな位置に配置できる。
この方法は、スクリプトを実行させる度に、異なった構成の輪になる。
この方法での簡単なプログラミング「スタイル」である。
for i in range(100):
x = random(HEIGHT)
y = random(WIDTH)
r = random(50, 100)
oval(x, y, r, r)
- Comments (Close): 0
- TrackBack (Close): 0
Lists
- 2008-05-30 (金)
- tutorial/data
fromhttp://nodebox.net/code/index.php/Lists
変数はデータの全体のリストを保持できる。
リストはスクリプトが複雑さを増大させた時、不可欠になる。:
リストは所属を同じにする情報のbitsやpiecesをグループ化すつ方法である。
例えば、スクリーンに描画するための全てのword、スクリプトが選択できる全ての色やフォント等である。
NodeBoxでのリストは実生活においてのものとそう変わらない。:
することの概要や、買い物リスト、名前と住所表、を保持出来る。
実生活との主な違いは、たいていリストは1から始めるが、プログラミングのLISTはゼロか始まるということです。
Creating a list
このコードは何に見えますか?
以下のコードはNodeBoxで定義された、買い物リストである。
リストはsquare brackets[]で囲まれて定義されている。
リスト内のどのアイテムもテキスト(string)である。したがって、クォートで埋め込まれている。
リストはgroceriesという変数名で割り当てられている。しかし、変数名は好きなように変えられる。gとかstufftodoといったように。
groceries = ["apples", "pears", "carrots", "cucumber", "yoghurt", "milk"]
print len(groceries)
>>> 6
listは、strings、numbers listsどんな種類でも含めることが出来る。
len(list)コマンドはリスト内のアイテムの数を返す。
Retrieving and editing items in a list
変数名の後に、欲しいアイテムのインデックスを角括弧[]内に入れることで、直接リスト内のアイテムを参照出来る。
print groceries[0]
>>> apples
groceries[3] = "banana"
print groceries
>>> ["apples", "pears", "carrots", "banana", "yoghurt", "milk"]
リストのスタートは0からだということを忘れないで下さい。
上の例で、何故、4番目のエレメントが置き換えられたのか?
4番目のエレメントのインデックスは3だからです。
Adding items to the list
リスト内のデータは時間の流れる過程で変えることが出来る。
新しいアイテムを足すことも、古いアイテムを消すことも出来る。
これは丁度、買い物リストのメモ書きに書き加えたり、消したりするようなものです。
リストの終りにアイテムを追加する為に:
groceries.append("eggs")
print groceries
>>> ["apples", "pears",
>>> "carrots", "banana",
>>> "yoghurt", "milk",
>>> "eggs"]
リストから取り除くには:
del groceries[6]
アイテムは list.insert(i, item) コマンドを使えば、リストの途中に挿入出来る。
iパラメータはエレメントを入れたいポジションである。
Looping through the list
リストをルーピングすることは、モールへ行って、買い物リストを上から下へ解消していくのと似ている。:
最初のアイテムはリンゴで、それを持ったら、次は梨を取って…というように。
リストの中の全アイテムを回ることはデータを取り扱う時、最も不可欠な要素の一つである。
少量の時は、あなたは手動でアイテムを検索できた、しかし、例えば、スクリーンに文章をを描画したい時等、リストが数百、数千のアイテムを持つ場合は無理。
for文によるループ:
for item in groceries:
print "buy some " + item
>>> buy some apples
>>> buy some pears
>>> buy some carrots
>>> buy some banana
>>> buy some yoghurt
>>> buy some milk
>>> buy some eggs
上の例では、for文以下のインデントされたコマンドが、リストの各アイテムに対して実行される。
item変数は、リスト内の各アイテムに連続して含まれる。
その後、ループは終る。
Random items from the list
choice()コマンドを使って、コード自身に、リストからアイテム決めさせることが出来る。
Example
これは、コンポジションを作成するために小さいリストを使うことに関して、とてもbraindeadだという例です。
このスクリプトは、wordに使われるリストがあり、色に使われるリストがある。
その後スクリプトは自身で自由に動き出す。:
2つのリストからランダムに単語と色を選び、ランダムなサイズと角度でスクリーンに描画する。
異なる実行においても、単語と色が限定されているため、ある一貫性を持つ。
コード
words = ["Lists", "are", "fun"]
colors = [color(1,0,0), color(1,1,1), color(0,0,0)]
for i in range(40):
x = random(WIDTH)
y = random(HEIGHT)
rotate(random(360))
fontsize(random(10,100))
fill(choice(colors))
text(choice(words), x, y)
Dictionaries
Dictionaries(辞書) は、文字列のインデックスリスト、キーを持っている非常に役立つ種類のリストで、キーはあなた自身で定義する。
それぞれのキーは単一であり、リスト内のアイテムが参照する。
辞書は[]の代りにcurly braces{}を使って作成される。
heading = {}
heading["font"] = "ConduitITC-Medium"
heading["size"] = 18
heading["fill"] = color(1,0,0)
print heading.keys()
>>> ["font", "fill", "size"]
print heading["size"]
>>> 18
if heading.has_key("fill"): print "found!"
>>> found!
More on lists
リストに関して、あなたが出来ることはもっとたくさんある、ソートや反転、リストの為のフィルタ機能の記述。
フルドキュメントはここ
http://docs.python.org/tut/node7.html#SECTION007100000000000000000
Pythonのドキュメントの中にある。
- Comments (Close): 0
- TrackBack (Close): 0
- Entries in this Category
- Tutorial
- Library
- Syndicate this site