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

アストロイドを描いてみよう [PostScript]

曲線を描く


アステロイド.png
アステロイドと言うのだと思っていましたが英語版Wikiには「小惑星(asteroid)と混同しないでください。」と書かれていて、ググってみるとastroidが正しいようです。どちらも星ですけど。
なのでこの講座でもアストロイド(astroid)と表記します。
アストロイドにバリエーションをつけるには指数(現在3)になっているところを変えるぐらいです。
これは奇数でないと部分的にしか表示されなくなります。
今回はバリエーションのつけ方を試してみます。
x=a*cos(th)^3
y=a*sin(th)^3

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:astroid(アストロイド/星芒形)を描く /a 110 def % 図形の大きさ 0 0 240 240 rectfill % 黒背景 120 120 translate % 図形を中央に移動 newpath % パスの初期化 0 1 360 { % 0から始めて360まで1づつ増分し{ }内を繰り返す /th exch def % 制御変数をth(角度)に入れる % アストロイドの数式 /x a th cos 3 exp mul def /y a th sin 3 exp mul def % thが0なら始点を置き、さもなくば線を引く th 0 eq { x y moveto } { x y lineto } ifelse } for closepath % 線を繋ぐ 1 1 1 setrgbcolor % 白色 stroke % 線を描画

線の結び方を色々と変えています。th 0 eq { x y moveto } { x y lineto } ifelseの部分を書き換えます。
アステロイドvals.png

タグ:PostScript
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:アート

ハイポサイクロイドを描いてみよう [PostScript]

曲線を描く


ハイポサイクロイド.png
ハイポサイクロイド(内サイクロイド)と呼ばれる曲線です。
x=(a-b)*cos(th)+b*cos((a-b)*th/b)
y=(a-b)*sin(th)-b*sin((a-b)*th/b)

※ 数式について
通常は(a-b)cosθ+b cos...のように数式には乗算の記号はつけませんが、ポストスクリプトプログラムに変換するのに必要なためそれをつけています。

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:Hypocycloid(ハイポサイクロイド)を描く /a 100 def % 導円の半径 /b a 8 div def % 転円の半径 0 0 240 240 rectfill % 黒背景 120 120 translate % 座標の原点を中央に移動 newpath % パスの初期化 0 1 360 { % 0から始めて360まで1づつ増分 /th exch def % 制御変数をth(角度)に入れる % ハイポサイクロイドの数式 /x a b sub th cos mul b a b sub th b div mul cos mul add def /y a b sub th sin mul b a b sub th b div mul sin mul sub def % thが0なら始点をさもなくば線を引く th 0 eq { x y moveto } { x y lineto } ifelse } for closepath % 線を繋ぐ 1 1 1 setrgbcolor % 白色 2 setlinewidth % 線幅2ポイント stroke % 線を描画

ハイポサイクロイド2.png
図形を回転させてプロシージャにし、徐々に拡大させていきます。

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:Hypocycloid(ハイポサイクロイド)を描く /a 30 def % 導円の半径 /b a 4 div def % 転円の半径 0 0 240 240 rectfill % 黒背景 120 120 translate % 座標の原点を中央に移動 /hypo { % プロシージャ定義 18 { % 18回{ }内を繰り返す 0 1 360 { % 0から始めて360まで1づつ増分 /th exch def % 制御変数をth(角度)に入れる % ハイポサイクロイドの数式 /x a b sub th cos mul b a b sub th b div mul cos mul add def /y a b sub th sin mul b a b sub th b div mul sin mul sub def % thが0なら始点をさもなくば線を引く th 0 eq { x y moveto } { x y lineto } ifelse } for 5 rotate % 5度座標を回転 } repeat } def newpath % パスの初期化 8 { % 8回{ }内を繰り返す   /b a 4 div def % 転円の半径   hypo % hypoプロシージャ呼び出し   /a a 40 add def % 導円の半径に40を足す   rc 0 bc setrgbcolor stroke % カラー設定 線を描画   /rc rc .2 sub def % R色から0.2を引く   /bc bc .04 add def % B色に0.04を足す   } repeat

タグ:PostScript
nice!(1)  コメント(0)  トラックバック(0) 
共通テーマ:アート

ハイポトコロイドを描いてみよう [PostScript]

曲線を描く


ハイポトコロイド.png
ハイポトコロイドと呼ばれる曲線です。
x=(a-b)*cos(th)+c*cos((a-b)*th/b)
y=(a-b)*sin(th)-c*sin((a-b)*th/b)

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:Hypotrochoid(ハイポトコロイド)を描く /a 100 def % 導円の半径 /b a 8 div def % 転円の半径 0 0 240 240 rectfill % 黒背景 120 120 translate % 座標の原点を中央に移動 newpath % パスの初期化 0 1 360 { % 0から始めて360まで1づつ増分し{ }内を繰り返す /th exch def % 制御変数をth(角度)に入れる % ハイポトコロイドの数式 /x a b sub th cos mul c a b sub th b div mul cos mul add def /y a b sub th sin mul c a b sub th b div mul sin mul sub def % thが0なら始点をさもなくば線を引く th 0 eq { x y moveto } { x y lineto } ifelse } for closepath % 線を繋ぐ 1 1 1 setrgbcolor % 白色 2 setlinewidth % 線幅2ポイント stroke % 線を描画

ハイポトコロイド2.png
図形を2度12回、回転させていきます。

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:Hypotrochoid(ハイポトコロイド)を描く /a 60 def % 導円の半径 /b a 8 div def % 転円の半径 /c 60 def パラメータ 0 0 240 240 rectfill % 黒背景 120 120 translate % 座標の原点を中央に移動 /rc 1 def R色 /bc .7 def B色 newpath % パスの初期化 12 { 12回{ }内を繰り返す 0 1 360 { % 0から始めて360まで1づつ増分し{ }内を繰り返す /th exch def % 制御変数をth(角度)に入れる % ハイポトコロイドの数式 /x a b sub th cos mul c a b sub th b div mul cos mul add def /y a b sub th sin mul c a b sub th b div mul sin mul sub def % thが0なら始点をさもなくば線を引く th 0 eq { x y moveto } { x y lineto } ifelse } for rc 0 bc setrgbcolor % カラー設定 stroke % 線を描画 /rc rc .08 sub def R色から0.08を引く /bc bc .04 add def B色に0.04を足す 2 rotate 2度座標を回転 } repeat

タグ:PostScript
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:アート

エピサイクロイドを描いてみよう [PostScript]

曲線を描く


エピサイクロイド.png
エピサイクロイドと呼ばれる曲線です。

x=(a+b)*cos(th)-b*cos((a+b)*th/b)
y=(a+b)*sin(th)-b*sin((a+b)*th/b)

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:Epicycroid(エピサイクロイド)を描く /a 60 def % 定円の半径 /b 20 def % 転円の半径 /c 1 def % パラメータ 0 0 240 240 rectfill % 黒背景 120 120 translate % 座標の原点を中央に移動 newpath % パスの初期化 0 1 360 { % 0から始めて360まで1づつ増分し{ }内を繰り返す /th exch def % 制御変数をth(角度)に入れる % エピサイクロイドの数式 /x a b add th cos mul c b mul a b add th b div mul cos mul sub def /y a b add th sin mul c b mul a b add th b div mul sin mul sub def % thが0なら始点を置き、さもなくば線を引く th 0 eq { x y moveto } { x y lineto } ifelse } for 2 setlinewidth % 線幅2ポイント 1 1 1 setrgbcolor % 白色 stroke % 線を描画

エピサイクロイド2.png
拡大させながら線幅を細くしていきます。

※カラー値について
RGB、HSB、CMYKとも個々のカラー値は0〜1ですが、それを超えてもエラーにはなりません。
-1になろうが-100になろうが、それは0として扱われます。
10でも1000でも最終的に1になります。
このプログラムでもbcは途中から1を超えていますが、1として設定されています。
他のプログラムでは「エラー!」と怒られるところですが、PostScriptは適宜直してくれます。
こういうところが好きなのですが、これはメリットでもありデメリットでもあるわけです。
エラーにならないので、自分が意図した値になっているか分からないということがあります。

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:Epicycroid(エピサイクロイド)を描く /a 60 def % 定円の半径 /b 10 def % 転円の半径 /c 3 def % パラメータ /sw 0 def % 始点を置くスイッチ /rc 1 def % R色 /gc 0 def % G色 /bc .8 def % B色 /lw 3 def % 線幅 0 0 240 240 rectfill % 黒背景 120 120 translate % 座標の原点を中央に移動 newpath % パスの初期化 .8 .4 5 { % 0.8から5まで0.4づつ増分し{ }内を繰り返す /c exch def % 制御変数をcに入れる 0 1 360 { % 0から360まで1づつ増分し{ }内を繰り返す /th exch def % 制御変数をth(角度)に入れる % エピサイクロイドの数式 /x a b add th cos mul c b mul a b add th b div mul cos mul sub def /y a b add th sin mul c b mul a b add th b div mul sin mul sub def % thが0なら始点を置き、さもなくば線を引く th 0 eq { x y moveto } { x y lineto } ifelse } for closepath % 線を繋ぐ /sw 0 def % 始点のリセット rc gc bc setrgbcolor % カラー設定 lw setlinewidth % 線幅設定 stroke % 線を描画 /rc rc .08 sub def % R色から0.08を引く /bc bc .09 add def % G色に0.09を足す /gc gc .07 add def % B色に0.07を足す /lw lw .2 sub def % 線幅から0.2を引く } for

タグ:PostScript
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:アート

エピトコロイドを描いてみよう [PostScript]

曲線を描く


エピトコロイド.png
エピトコロイドを描きます。

x=(a+b)*cos(th)-c*cos((a+b)*th/b)
y=(a+b)*sin(th)-c*sin((a+b)*th/b)

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:Epitrocoid(エピトコロイド)を描く /a 50 def % 定円の半径 /b 10 def % 転円の半径 /c 50 def % パラメータ 0 0 240 240 rectfill % 黒背景 120 120 translate % 座標の原点を中央に移動 newpath % パスの初期化 0 1 360 { % 0から始めて360まで1づつ増分 /th exch def % 制御変数をth(角度)に入れる % エピトコロイドの数式 /x a b add th cos mul c a b add th b div mul cos mul sub def /y a b add th sin mul c a b add th b div mul sin mul sub def % thが0なら始点を置き、さもなくば線を引く th 0 eq { x y moveto } { x y lineto } ifelse } for closepath % 線を繋ぐ 1 1 1 setrgbcolor % 白色 2 setlinewidth 線幅2ポイント stroke % 線を描画

エピトコロイド2.png
座標を3度回転させています。

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:Epitrocoid(エピトコロイド)を描く /a 50 def % 定円の半径 /b 10 def % 転円の半径 /c 50 def % パラメータ /rc 1 def R色 /gc .5 def G色 /bc .7 def B色 1 setlinewidth 線幅1ポイント 0 0 240 240 rectfill % 黒背景 120 120 translate % 座標の原点を中央に移動 -5 rotate % バランス調整 newpath % パスの初期化 16 { % { }内を16回繰り返す 0 1 360 { % 0から始めて360まで1づつ増分し{ }内を繰り返す /th exch def % 制御変数をth(角度)に入れる % エピトコロイドの数式 /x a b add th cos mul c a b add th b div mul cos mul sub def /y a b add th sin mul c a b add th b div mul sin mul sub def % thが0なら始点をさもなくば線を引く th 0 eq { x y moveto } { x y lineto } ifelse } for closepath % 線を繋ぐ rc gc bc setrgbcolor stroke % カラー設定 /rc rc .03 sub def R色から0.03を引く /gc gc .04 sub def G色から0.04を引く 3 rotate 座標を3度回転 } repeat

タグ:PostScript
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:アート

デルトイドを描いてみよう [PostScript]

曲線を描く


デルトイド.png
デルトイドまたはトリカスポイドは三角形的な曲線です。

x=a*(2*cos(th)+cos(2*th))
y=a*(2*sin(th)-sin(2*th))
または
x=c*a*cos(th)+a*cos(2*th)
y=c*a*sin(th)-a*sin(2*th)

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:Deltoid(デルトイド)またはTricuspoid(トリカスポイド) /a 35 def 図形の大きさ 0 0 240 240 rectfill 黒背景 110 120 translate % 図形を中央に移動 newpath % パスの初期化 0 1 360 { % 0から始めて360まで1づつ増分し{ }内を繰り返す /th exch def % 制御変数をth(角度)に入れる デルトイドの数式 /x a 2 th cos mul 2 th mul cos add mul def /y a 2 th sin mul 2 th mul sin sub mul def % thが0なら始点を置き、さもなくば線を引く th 0 eq {x y moveto } { x y lineto } ifelse } for 1 1 1 setrgbcolor 白色 2 setlinewidth 線幅2ポイント stroke 線を描画する

デルトイド2.png
PostScriptにはswitch文はありませんが、ifelse文を使ってswitch文もどきはできます。
0、1 、2の3個の値をランダムに生成し、switch文でそれぞれに対応したカラー値を割り振っています。

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:Deltoid(デルトイド)を描く /a 40 def % 図形の大きさ /c 1.5 def % パラメータ /rn 0 def % ランダムな値を入れるための変数 /c01 { 1 0 .5 setrgbcolor } def % カラー01 /c02 { .5 .2 1 setrgbcolor } def % カラー02 /c03 { 1 .6 0 setrgbcolor } def % カラー03 0 0 240 240 rectfill % 黒背景 110 120 translate % 図形を中央に移動 newpath % パスの初期化 0 .1 2 { % 0から始めて2まで0.1づつ増分し{ }内を繰り返す /c exch def % 制御変数をcに入れる 0 1 360 { 0% から始めて360まで1づつ増分し{ }内を繰り返す /th exch def % 制御変数をth(角度)に入れる % デルトイドの数式 /x c a mul th cos mul a 2 th mul cos mul add def /y c a mul th sin mul a 2 th mul sin mul sub def % thが0なら始点を置き、さもなくば線を引く th 0 eq { x y moveto } { x y lineto } ifelse } for closepath % 線を繋ぐ /rn rand 3 mod def % 0、1、2の値をランダムに生成しrnに入れる % rnが0ならカラー01、1ならカラー02、2ならカラー03にする rn 0 eq { c01 } { rn 1 eq { c02 } { c03 } ifelse } ifelse stroke 線を描画 } for

パラメータを色々変えてみると様々な形が現れてきます。
デルトイド3.png

タグ:PostScript
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:アート

ネフロイドを描いてみよう [PostScript]

曲線を描く


ネフロイド.png
ネフロイド(kidney curve/腎臓形)という曲線を描きます。
x=c*a*(3*cos(th)-cos(3*th))
y=c*a*(3*sin(th)-sin(3*th))

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:Nephroid(ネフロイド)を描く /a 5 def % 大きさに関するパラメータ /c 5 def % 大きさに関するパラメータ 0 0 240 240 rectfill % 黒背景 120 120 translate % 座標の原点を中央に移動 newpath % パスの初期化 0 1 360 { % 0から始めて360まで1づつ増分し{ }内を繰り返す /th exch def % 制御変数をth(角度)に入れる % ネフロイイドの数式 /x c a mul 3 th cos mul 3 th mul cos sub mul def /y c a mul 3 th sin mul 3 th mul sin sub mul def th 0 eq { x y moveto } { x y lineto } ifelse } for closepath % 線を繋ぐ 1 1 1 setrgbcolor % 白色 2 setlinewidth % 線幅2ポイント stroke % 線を描画

ネフロイド2.png
大きさを変えながら回転させて、塗りつぶしています。
数式も少し変えています。

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:Nephroid(ネフロイド)を描く /a 5 def % 大きさに関するパラメータ /c 5 def % 大きさに関するパラメータ /rc 1 def % R色 /gc .5 def % G色 /bc 0 def % B色 0 0 240 240 rectfill % 黒背景 120 120 translate % 座標の原点を中央に移動 newpath % パスの初期化 5.8 -.1 .1 { % 5.8から0.1まで-0.1づつ減分し{ }内を繰り返す /c exch def % 制御変数をc(大きさ)に入れる 0 1 360 { % 0から360まで1づつ増分し{ }内を繰り返す /th exch def % 制御変数をth(角度)に入れる % ネフロイイドの数式 /x a c mul 3 th cos mul 5 th mul cos sub mul def /y a c mul 3 th sin mul 5 th mul sin sub mul def % thが0なら始点を置き、さもなくば線を引く th 0 eq { x y moveto } { x y lineto } ifelse } for closepath % 線を繋げる rc gc bc setrgbcolor % カラー設定 fill % 塗りつぶす /rc rc .05 sub def % R色から0.05を引く /gc rc .5 sub def % G色から0.5を引く /bc bc .02 add def % B色に0.02足す 3 rotate % 座標を3度回転する } for

タグ:PostScript
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:アート

リマソンを描いてみよう [PostScript]

曲線を描く


リマソン.png
リマソン(蝸牛形)と言われる曲線です。
パラメータを調整し、-90度回転させてNTTロゴのダイナミックループに似せてみました。
微妙に違いますけど。

x=c*k*cos(th)+a*cos(2*th)
y=c*k*sin(th)+a*sin(2*th)

NTTロゴの生まれる経緯についてはこちらのブログにあります。
中西元男 実験人生: NTT真藤総裁&社長(想い出の名経営者1)
おやおや、よく調べるとロゴの原案は飯守恪太郎氏とのこと
企業ロゴの第一人者、飯守恪太郎氏はNTTロゴの発案者

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:Limason(リマソン/蝸牛形)を描く /a 60 def % パラメータ /k 10 def % パラメータ /c 5 def % パラメータ 0 0 240 240 rectfill % 黒背景 120 120 translate % 座標の原点を中央に移動 newpath % パスの初期化 0 1 360 { % 0から1づつ増分し360まで{ }内を繰り返す /th exch def % 制御変数をth(角度)に入れる % リマソンの数式 /x c k mul th cos mul a 2 th mul cos mul add def /y c k mul th sin mul a 2 th mul sin mul add def % thが0なら始点を置き、さもなくば線を引く th 0 eq { x y moveto} { x y lineto } ifelse } for 1 1 1 setrgbcolor % 白色 2 setlinewidth % 線幅2ポイント stroke % 線を描画

リマソン2.png
cパラメータを増分させてリマソンを拡大します。

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title: Limason(リマソン/蝸牛形)を描く /a 60 def % パラメータ /k 10 def % パラメータ 0 0 240 240 rectfill % 黒背景 120 120 translate % 座標の原点を中央に移動 newpath % パスの初期化 0 1 5 { % 0から1づつ増分し5まで{ }内を繰り返す /c exch def % 制御変数をcに入れる 0 1 360 { % 0から1づつ増分し360まで{ }内を繰り返す /th exch def % 制御変数をth(角度)に入れる % リマソンの数式 /x c k mul th cos mul a 2 th mul cos mul add def /y c k mul th sin mul a 2 th mul sin mul add def % thが0なら始点を置き、さもなくば線を引く th 0 eq { x y moveto} { x y lineto } ifelse } for } for 1 1 1 setrgbcolor % 白色 2 setlinewidth % 線幅2ポイント stroke % 線を描画

aとkの値を変えています。
リマソン3.png

タグ:PostScript
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:アート

カルジオイドを描いてみよう [PostScript]

曲線を描く


カルジオイド.png
カルジオイドはリマソンに似た曲線です。
x=(a+b)*cos(th)-c*b*cos((a+b)*th/b)
y=(a+b)*sin(th)-c*b*sin((a+b)*th/b)

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:Caldioid(カルジオイド)を描く /a 30 def % パラメータ /b 30 def % パラメータ /c 2 def % パラメータ 0 0 240 240 rectfill % 黒背景 140 120 translate % 座標の移動 newpath % パスの初期化 0 1 360 { % 0から1づつ増分し360まで{ }内を繰り返す /th exch def % 制御変数をth(角度)に入れる % カルジオイドの数式 /x a b add th cos mul c b mul a b add th mul b div cos mul sub def /y a b add th sin mul c b mul a b add th mul b div sin mul sub def % thが0なら始点を置き、さもなくば線を引く th 0 eq { x y moveto }{ x y lineto } ifelse } for closepath % 線を繋ぐ 1 1 1 setrgbcolor % 白色 2 setlinewidth % 線幅2ポイント stroke % 線を描画

カルジオイド2.png
hsbカラーを使って色味を変化させます。

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:Caldioid(カルジオイド)を描く /a 60 def % パラメータ /b 6 def % パラメータ /hc .9 def % H(色味) /sc .6 def % S(彩度) /bc 1 def % B(明度) /k 1 def % 色味を変化させるパラメータ 0 0 240 240 rectfill % 黒背景 140 120 translate % 座標の移動 newpath % パスの初期化 1 .1 6 { % 1から0.1づつ増分し6まで{ }内を繰り返す /c exch def % 制御変数をcに入れる 0 1 360 { % 0から1づつ増分し360まで{ }内を繰り返す /th exch def % 制御変数をth(角度)に入れる % カルジオイドの数式 /x a b add th cos mul c b mul a b add th mul b div cos mul sub def /y a b add th sin mul c b mul a b add th mul b div sin mul sub def % thが0なら始点を置き、さもなくば線を引く th 0 eq { x y moveto }{ x y lineto } ifelse } for closepath % 線を繋ぐ % kを2で割った余りが0ならH(色味)から0.018を引いて線を描画する k 2 mod 0 eq { /hc hc 0.018 sub def stroke } if /k k 1 add def % kに1を足す stroke % 線を描画 } for

タグ:PostScript
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:アート

ボール継目曲線を描いてみよう [PostScript]

曲線を描く


ボール継ぎ目f.png
参考図書に掲載されていたボールの継ぎ目のような曲線をPostScriptプログラム化しました。
他ではあまり見られない曲線です。
z軸上のデータを座標変換して2Dで表現しています。Z軸上で正の方向(手前)は赤、負の方向は青の線にしました。
xthとythの角度を変えると変化します。
ここで1本の繋がった直線は途中で色を変えることができません。
ちょっと泥縄的なやり方ですが短い線を繋げないで引いていくことにしました。それがcutlineプロシージャです。

x=a*cos((th+pai/4)-b*cos(3*th+pai/4))
y=a*sin((th+pai/4)+b*sin(3*th+pai/4))
z=c*sin(2*th)
x=yw*cos(yth)+z*sin(yth)
z=-yw*sin(yth)+z*cos(yth)
y=yw*cos(xth)-z*sin(xth)
z=yw*sin(xth)+z*cos(xth)

参考: BASICによる図形処理テキスト/1986年2月1日 初版発行/著者:竹村伸一・国兼勇三

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:ボール継目曲線による球体を描く a 120 def % 球の半径の一方 /b 60 def % 球の半径の一方 /c 4 a mul b mul sqrt def /xth 20 def % z軸でのxの角度 /yth 10 def % z軸でのyの角度 /sw 0 def % 始点を置くスイッチ % 途中で色を変えるためのプロシージャ /cutline { sw 0 eq {/gx x def /gy y def /sw 1 def } { gx gy moveto x y lineto /gx x def /gy y def stroke } ifelse } def 0 0 240 240 rectfill % 黒背景 120 120 translate % 座標の移動 .6 dup scale % 座標を0.6倍に 2 setlinewidth % 線幅を2ポイント newpath % パスの初期化 1 setgray % 白色 0 0 a b add 0 360 arc % 円 stroke % 線を描画 newpath 0 1 360 { % 0から始めて360まで1づつ増分し{ }内を繰り返す /t exch def % 制御変数をt(角度)に入れる /t2 t 2 mul def /th t2 45 add def % ボール継目曲線 /x a th cos mul b 3 th mul cos mul sub def /y a th sin mul b 3 th mul sin mul add def /z c 2 t2 mul sin mul def % z軸方向のx座標変換 /xw x def /x xw yth cos mul z yth sin mul add def /z xw neg yth sin mul z yth cos mul add def % z軸方向のy座標変換 /yw y def /y yw xth cos mul z xth sin mul sub def /z yw xth sin mul z xth cos mul add def % zが0より大きいなら赤、さもなくば青にする z 0 ge { 1 0 0 setrgbcolor } { 0 0 1 setrgbcolor } ifelse cutline % プロシージャ呼び出し } for

ボール継ぎ目2.png
球の半径を変化させ、グレースケールも変化させています。
こちらはz方向の計算は省いています。

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title: /a 120 def % 球の半径の一方 /b 60 def % 球の半径の一方 /r a b add def % 球の半径 /c 0.3 def % グレイスケールの値 0 0 240 240 rectfill % 黒背景 120 120 translate % 座標の移動 .6 dup scale % 座標を0.6倍に 2 setlinewidth % 線幅2ポイント newpath % パスの初期化 0 0 a b add 0 360 arc 95 -5 35 { % 95から始めて35まで-5づつ減分し{ }内を繰り返す /a exch def % 球の半径の一方 /b r a sub def % 球の半径の一方 0 1 360 { % 0から始めて360まで1づつ増分し{ }内を繰り返す /th exch def % 制御変数をth(角度)に入れる % ボール継目曲線 /x a th cos mul b 3 th mul cos mul sub def /y a th sin mul b 3 th mul sin mul add def % thが0なら始点を置き、さもなくば線を引く th 0 eq { x y moveto } { x y lineto } ifelse } for c setgray % グレイスケール設定 stroke % 線を描画 /c c .1 add def % cに0.1を足す } for

タグ:PostScript
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:アート