So-net無料ブログ作成
検索選択

円を移動してみよう [PostScript]

円弧を描く PART2


円の移動.png
円を横に往復運動させながら小さくしていくというプログラムです。
移動方向の反転にはmodを使い、余りが0の時に反転するようにしています。
サンプルでは8で割っていますが、他の数値で試してみてください。
参考:X1ターボ/X1シリーズ・プログラム200線
特選グラフィックスデザイン 畠中兼司・北尾和信共著

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:円の移動 /x 0 def /y 0 def % 初期座標 /r 110 def % 円の半径 /e { 0 360 } def % 円の開始角度と終了角度 /dx 2 def % 円の移動量 /sw 1 def % 色変更スイッチ /c1 { .958 .522 .976 sethsbcolor } def % c1色 /c2 { .617 .415 .831 sethsbcolor } def % c2色 120 120 translate % 座標の原点を中央に移動 newpath % パスの初期化 0 1 55 { % 0から始めて55まで1づつ増やす /dir exch def % 制御変数をdir(方向)に入れる % 制御変数dirを8で割った時の余りが0の時に移動方向を反転する dir 8 mod 0 eq { /dx dx neg def } if x y r e arc % 円を引く /r r 2 sub def % 円の半径を次第に小さくする /x x dx add def % 円を移動する % swが1の時c1色で塗る。それ以外はc2色で塗る。 sw 1 eq { c1 } { c2 } ifelse fill /sw sw neg def % swの符号を反転する } for

タグ:PostScript

アルキメデスの渦巻きを描いてみよう [PostScript]

曲線を描く


アルキメデスの渦巻き.png
渦巻きにも色々な種類がありますが、巻幅が一定なアルキメデスの渦巻きを描いてみましょう。数式は以下です。
x=sin(r*th)*th/2
y=cos(r*th)*th/2
前置記法にするために少し順番や( )を付けて整形しないとうまくいきません。
x=(r*th)sin*(th/2)
y=(r*th)cos*(th/2)
この数式をPostScriptで書くとこうなります。
/x r th mul sin th 2 div mul def
/y r th mul cos th 2 div mul def

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:Archimedes' spiral(アルキメデスの渦巻き)を描く /r 15 def % 図を納めるための数値 /sw 0 def % 始点を置くためのスイッチ 0 0 240 240 rectfill % 背景を黒四角形にする 120 120 translate % 座標の原点を中央に移動 newpath % パスの初期化 0 .5 220 { % 0から初めて0.5増分し、220まで { }内を繰り返す /th exch def % 制御変数をth(角度)に入れる /x r th mul sin th 2 div mul def % 渦巻きの数式 /y r th mul cos th 2 div mul def % swが0なら始点をさもなくば線を引く sw 0 eq { x y moveto /sw 1 def }{ x y lineto } ifelse } for .7 .4 .8 sethsbcolor % 色設定 3 setlinewidth % 線幅3ポイント stroke % 描画

アルキメデスの渦巻き2.png
scaleで水平と垂直方向の値を別々にすると立体的な効果が表現できます。

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:Archimedes' spiral(アルキメデスの渦巻き)を描く /r 15 def % 図を納めるための数値 /sw 0 def % 始点を置くためのスイッチ 0 0 240 240 rectfill % 背景を黒四角形にする 120 120 translate % 座標の原点を中央に移動 newpath % パスの初期化 0 .5 220 { % 0から初めて0.5増分し、220まで { }内を繰り返す /th exch def % 制御変数をth(角度)に入れる /x r th mul sin th 2 div mul def % 渦巻きの数式 /y r th mul cos th 2 div mul def % swが0なら始点をさもなくば線を引く sw 0 eq { x y moveto /sw 1 def }{ x y lineto } ifelse } for .7 .4 .8 sethsbcolor % 色設定 30 rotate 7 1 scale % 30度座標を回転させ、x軸方向を伸ばす stroke % 描画

タグ:PostScript

正方形を回転させながら小さくしてみよう [PostScript]

直線を描く PART2


正方形の回転.png
正方形の角度を変えながら少しづつ小さくしていく図形を描いてみましょう。
新しい座標の求め方の図です。

正方形の回転座標.png
参考:X1ターボ/X1シリーズ・プログラム200選
特選グラフィックスデザイン 畠中兼司・北尾和信共著

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:正方形の回転図形 % 正方形の初期設定座標 /x1 -120 def /y1 120 def /x2 120 def /y2 120 def /x3 120 def /y3 -120 def /x4 -120 def /y4 -120 def /dv 20 def % 分割数(ずれの度合い) /c0 { .878 .179 .611 sethsbcolor } def % c0色 /c1 { .507 .439 .811 sethsbcolor } def % c1色 /sw 1 def % 色を交互にするためのスイッチ 120 120 translate % 座標の原点を中央に移動 newpath % パスの初期化 50 { % { }内を50回繰り返す pop % 制御変数を捨てる % 正方形を描く x1 y1 moveto x2 y2 lineto x3 y3 lineto x4 y4 lineto closepath % 新しい座標を求める x1=x1+(x4-x1)/dv /x1 x1 x4 x1 sub dv div add def /y1 y1 y4 y1 sub dv div add def /x2 x2 x1 x2 sub dv div add def /y2 y2 y1 y2 sub dv div add def /x3 x3 x2 x3 sub dv div add def /y3 y3 y2 y3 sub dv div add def /x4 x4 x3 x4 sub dv div add def /y4 y4 y3 y4 sub dv div add def % swが1ならc0色をさもなくばc1色で塗りつぶす sw 1 eq { c0 } { c1 } if else fill /sw sw neg def % swの符号を反転させる } repeat

タグ:PostScript

放射状の線を描く2 [PostScript]

直線を描く PART2


40-03放射状.png
放射状の線を描いてみようでは、直線を回転させて図形を描きました。
今回は三角関数を使って放射状の線を描きます。
小円と大円の半径や角度を変えると様々な図形ができます。

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:放射状の線を描く /r1 20 def % 小円の半径 /r2 100 def % 大円の半径 /k 10 def % 角度 120 120 translate % 座標の原点を中央に移動 newpath % パスの初期化 0 k 360 k sub { % 0からkづつ増やし360-kになるまで{ }内を繰り返す /x1 r1 th cos mul def % 小円の座標 /y1 r1 th sin mul def /x2 r2 th cos mul def % 大円の座標 /y2 r2 th sin mul def x1 y1 moveto x2 y2 lineto % 小円の座標と大円の座標間に線を引く } for 3 setlinewidth % 線幅3ポイント 1 0 0 setrgbcolor % 赤色 stroke % 描画する

フェルマー螺旋を描いてみよう [PostScript]

曲線を描く


フェルマー螺旋.png
フェルマー螺旋の数式は下記ですが、
x=a*sqr(th)*cos(th)
y=a*sqr(th)*sin(th)
パラメータがあまりないので、いじりようがないかもしれません。

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:Felmat spiral(フェルマー螺旋)を描く /a 1 def % 大きさ /sw 0 def % 始点を置くためのスイッチ 0 0 240 240 rectfill % 黒塗りつぶし背景 120 120 translate % 座標の原点を中央に移動 newpath % パスの初期化 0 1 12000 { % 0から始めて1づつ増分し12000まで{ }内を繰り返す /th exch def % 制御変数をth(角度)に入れる % フェルマー螺旋の数式 /x a th sqrt mul th cos mul def /y a th sqrt mul th sin mul def % swが0なら始点を置き、さもなくば線を引く sw 0 eq { x y moveto /sw 1 def }{ x y lineto } ifelse } for .5 .7 .8 sethsbcolor % 色設定 stroke % 線を描画する

タグ:PostScript

四角形を小さくしていくパターン1 [PostScript]

パターン


box.png
四角形を少しづつ小さくしていくパターンです。
基本的な図形で面白みがないような気がしますが、色をつけたり線に変化をつけたりすると美しいパターンができます。

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:ボックスパターン /w 120 def % 四角形のサイズ 120 120 translate % 座標の原点を中央に移動 newpath % パスの初期化 25 { % 25回{ }内を繰り返す w neg w moveto % 四角形 w neg w neg lineto w w neg lineto w w lineto closepath stroke % 描画する /w w 5 sub def % 四角形のサイズから5を引く } repeat

box2.png
この図形に色をつけます。
初期設定の色値から少しづつ数値を足したり引いたりして、色を変化させます。

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:ボックスパターン /w 120 def % 四角形のサイズ /rc 1 def % R色 /gc 0 def % G色 /bc .7 def % B色 120 120 translate % 座標の原点を中央に移動 newpath % パスの初期化 25 { % 25回{ }内を繰り返す w neg w moveto % 四角形 w neg w neg lineto w w neg lineto w w lineto closepath rc gc bc setrgbcolor % 色設定 fill % 塗りつぶす /w w 5 sub def % 四角形のサイズから5を引き小さくしていく /rc rc .05 sub def % R色から.05引く /gc gc .05 add def % G色に.05足す /bc bc .015 add def % B色に.015足す } repeat

box3.png
次に上記のパターンをプロシージャにして、画面内に4個配置します。
scaleで図形を1/2にし、translateで四隅に配置します。
この時グラフィックス状態を保存しておかないと次に描く図形に影響を与えます。例えば図形の1/2が次は1/4、1/8になってしまいます。
また図形を描く前に四角形のサイズや色などを初期設定に戻さないと、前の図形の数値が使われて思わぬ結果になります。

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:ボックスパターン /init { % 初期設定 /w 120 def % 四角形のサイズ /rc 1 def % R色 /gc 0 def % G色 /bc .7 def % B色 } def /box { 25 { % 25回{ }内を繰り返す w neg w moveto % 四角形を引く w neg w neg lineto w w neg lineto w w lineto closepath rc gc bc setrgbcolor % 色設定 fill % 塗りつぶす /w w 5 sub def % 四角形のサイズから5を引き小さくしていく /rc rc .05 sub def % R色から.05引く /gc gc .05 add def % G色に.05足す /bc bc .015 add def % B色に.015足す } repeat } def 120 120 translate % 座標の原点を中央に移動 gsave % グラフィックス状態を保存 % 初期化/座標を1/2に/座標を四隅に移動/boxプロシージャを実行 init .5 dup scale w neg w translate box grestore % グラフィックス状態を復元 gsave init .5 dup scale w w translate box grestore gsave init .5 dup scale w neg w neg translate box grestore init .5 dup scale w w neg translate box

box4.png
同じ色では面白くないので色を2パターンにします。

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:ボックスパターン /init { % 初期設定 /w 120 def % 四角形のサイズ } def /c1 { /rc 1 def % R色 /gc 0 def % G色 /bc .7 def % B色 /sw 1 def % 色の変え方スイッチ } def /c2 { /rc .8 def % R色 /gc 0 def % G色 /bc .5 def % B色 /sw -1 def % 色の変え方スイッチ } def /box { 25 { % 25回{ }内を繰り返す w neg w moveto % 四角形を引く w neg w neg lineto w w neg lineto w w lineto closepath rc gc bc setrgbcolor % 色設定 fill % 塗りつぶす /w w 5 sub def % 四角形のサイズから5を引き小さくしていく sw 1 eq { % 色の変え方 /rc rc .05 sub def % R色から.05引く /gc gc .05 add def % G色に.05足す /bc bc .015 add def % B色に.015足す } { /rc rc .02 add def % R色から.02足す /gc gc .05 add def % G色に.05足す /bc bc .015 add def % B色に.015足す } ifelse } repeat } def 120 120 translate % 座標の原点を中央に移動 gsave % グラフィックス状態を保存 % 初期化/c1色/座標を1/2に/座標を四隅に移動/boxプロシージャを実行 init c1 .5 dup scale w neg w translate box grestore % グラフィックス状態を復元 save init c2 .5 dup scale w w translate box grestore gsave init c2 .5 dup scale w neg w neg translate box grestore init c1 .5 dup scale w w neg translate box

box5.png
線をつけてみます。
コードが長くなるので、変更部分前後を掲載します。

【サンプルコード】
/box { 25 { % 25回{ }内を繰り返す 略 closepath gsave % グラフィックス状態を保存 rc gc bc setrgbcolor % 色設定 fill % 塗りつぶす grestore % グラフィックス状態を復元 0 0 0 setrgbcolor % 黒 stroke % 線を描画 /w w 5 sub def % 四角形のサイズから5を引き小さくしていく 略 } def


タグ:PostScript

等角螺旋を描いてみよう [PostScript]

曲線を描く


等角螺旋.png
これは等角螺旋または対数螺旋またはベルヌーイの螺旋と言って自然界の中に見られるそうです。
b=1/6
r=a*exp(b*th)
x=r*cos(th)
y=r*sin(th)

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:equiangular spiral(等角螺旋)を描く /a 1.009 def % 図形の大きさに影響 /b .17 def % 図形の大きさに影響 /sw 0 def % 始点を置くスイッチ 0 0 240 240 rectfill % 黒の背景 120 120 translate % 座標の原点を中央に移動 newpath % パスの初期化 0 1 3400 { % 0から1づつ増分し3400になるまで{ }内を繰り返す /th exch def % 制御変数をth(角度)に入れる % 等角螺旋の数式 /r a b th mul exp def /x r th cos mul def /y r th sin mul def % swが0なら始点を置き、さもなくば線を引く sw 0 eq {x y moveto /sw 1 def}{x y lineto}ifelse } for .936 .517 1 sethsbcolor % 色設定 2 setlinewidth % 線幅2ポイント stroke % 線を描画する

タグ:PostScropt

スピログラフを描いてみよう [PostScript]

曲線を描く


スピログラフ.png
SPIROGRAPHは登録商標だそうで、内トコロイド曲線等を描く定規です。
ググって見るとスピログラフデラックスとか言って何千円もするのがあって驚きです。
子供の頃、面白くて遊んだことがありますが、1度やったらもう飽きてしまって。
昔は多色ボールペンぐらいしかカラーの筆記具がなくて、書いている内にインクのダマができて汚くなったりした記憶があります。
内トコロイド(rd=rmの時内サイクロイド)
x=(rc-rm)*cos(th)+rd*cos((rc-rm)/rm*th )
y=(rc-rm)*sin(th)-rd*sin((rc-rm)/rm*th )

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:Spirograph(スピログラフ) /rc 50 def % 外側の円の半径(定円) /rm .5 def % 歯車の半径(動円) /rd 60 def % 描画点の半径(動円内描画点の半径) /sw 0 def % 始点の開始 0 0 240 240 rectfill 背景を黒で描く 120 120 translate % 座標の原点を中央に移動 newpath % パスの初期化 0 .5 360 { % 0から360まで0.5づつ増分し{ }内を繰り返す /a exch def % 制御変数をa(回転角)に入れる % スピログラフの数式 /x rc rm sub a cos mul rd rc rm sub rm div a mul cos mul add def /y rc rm sub a sin mul rd rc rm sub rm div a mul sin mul sub def % swが0なら始点をさもなくば線を引く sw 0 eq { x y moveto /sw 1 def } { x y lineto } ifelse } for closepath % 線を繋ぐ gsave % グラフィックス状態を保存 1 0 1 setrgbcolor fill % マゼンタ色で塗りつぶす grestore % グラフィックス状態を復元 1 setlinewidth % 線幅1ポイント 1 .7 0 setrgbcolor stroke % オレンジ色の線描く

スピログラフvariation.png

リサジュー曲線を描いてみよう [PostScript]

曲線を描く


リサジュー.png
リサジュー曲線は下記の数式で描きます。
a bの値を色々変えてみてください。
x=a*sin(th)
y=b*sin(th)
リサジュー曲線は意外な図形は出てこないので、ここでは内部を赤に、線を白にしてみました。
チェッカー模様になっているのは内部領域と判断されたためのようです。
a bの値によってはチェッカー模様にならない場合(線が繋がってない時)があります。

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:Lissajous curve(リサジュー曲線)を描く /a 10 def /b 12 def /r 100 def % 図形を拡大 0 0 240 240 rectfill % 黒背景 120 120 translate % 座標の原点を中央に移動 newpath % パスの初期化 0 .5 180 { % 0から0.5づつ増分し、180まで{ }内を繰り返す /th exch def % 制御変数をth(角度)に入れる % リサジュー曲線の数式 /x r a th mul sin mul def /y r b th mul sin mul def % thが0なら始点を置き、さもなくば線を引く th 0 eq {x y moveto } { x y lineto } ifelse } for closepath % 線を繋ぐ gsave % グラフィックス状態を保存 1 0 0 setrgbcolor fill % 赤色で塗る grestore % グラフィックス状態を復元 1 1 1 setrgbcolor % 白色 2 setlinewidth % 線幅2ポイント stroke % 線を描画

リサジュー曲線のバリエーションです。
リサジューvariation.png

タグ:PostScript

バラ曲線を描いてみよう [PostScript]

曲線を描く


バラ曲線.png
バラ曲線(または正葉線)を描きます。
花弁の数はnの値が奇数ならその数と同じに、偶数なら2倍になります。
花弁の数は0.1から設定できますが、値が小さいとその分pを20くらいにする必要があります。
aは図形の大きさを調整します。数式はこちらです。
r=a*sin(th*n)
x=r*cos(th)
y=r*sin(th)
または
x=a*sin(n*th)*cos(th)
y=a*sin(n*th)*sin(th)

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:Rose curve(バラ曲線/正葉線)を描く /a 110 def % 図形の大きさ /n 4 def % 花弁の数 /p 4 def % 最大角度を変えるための値 /max 90 p mul def % 最大角度(90度を一単位) 0 0 240 240 rectfill % 黒背景 120 120 translate % 座標の原点を中央に移動 newpath % パスの初期化 0 1 max { % 0から1づつ増分しmaxまで{ } 内を繰り返す /th exch def % 制御変数をth(角度)に入れる % バラ曲線の数式 /r a th n mul sin mul def /x r th cos mul def /y r th sin mul def % thが0なら始点を置き、さもなくば線を引く th 0 eq { x y moveto /sw 1 def } { x y lineto } ifelse } for closepath % 線を繋ぐ 1 .5 0 setrgbcolor % 色設定 2 setlinewidth % 線幅2ポイント stroke % 線を描画

バラ曲線02.png
for文を加えて色に変化をつけました。

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:Rose curve(バラ曲線/正葉線)を描く /rc 1 def % R色 /bc 1 def % B色 /a 60 def % 図形の大きさ /n 4 def % 花弁の数 /p 4 def % 最大角度を変えるための値 /max 90 p mul def % 最大角度(90度を一単位) 0 0 240 240 rectfill % 黒背景 120 120 translate % 座標の原点を中央に移動 newpath % パスの初期化 110 -20 0 { % 110から20づつ減分し0まで{ } 内を繰り返す /a exch def % 制御変数をaに入れる 0 1 max { % 0から1づつ増分しmaxまで{ } 内を繰り返す /th exch def % 制御変数をth(角度)に入れる % バラ曲線の数式 /r a th n mul sin mul def /x r th cos mul def /y r th sin mul def % thが0なら始点を置き、さもなくば線を引く th 0 eq { x y moveto /sw 1 def } { x y lineto } ifelse } for closepath % 線を繋ぐ rc .5 bc setrgbcolor % 色設定 /rc rc .2 sub def % R色から0.2を引く /bc bc .05 sub def % B色から0.1を引く fill % 塗りつぶす } for

nの値を変えると様々な図形ができます。
バラ曲線variation.png

タグ:PostScript