So-net無料ブログ作成

球面変換 [PostScript]

変換


球面変換03.jpg
図形を球面に投影したような変換をします。
参考書籍をもとに変換式をPostScriptコードにしました。

変換式は
L:円の半径
z=sqr(x^2+y^2)

z1=L*sin(2*atan(z/L))
x1=x*z1/z
y1=y*z1/z
円の方程式 x^2+y^2を使い、円の内側か外側かを判断し、円外ならそのまま描画し、円内なら球面変換します。

参考書籍:続パソコン・グラフィック・アート 竹村 伸一 著
参考書籍:数式によるパソコン・グラフィックスのテクニック 依田 谹 著

球面変換.png
球面変換01.png

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:球面変換 /L 80 def % 変換する円の大きさ 2 setlinecap % 線の先端スクエア /sw 0 def % 始点スイッチ /kyumen { % 球面変換プロシージャ x 2 exp y 2 exp add L 2 exp gt { % 円の外側は変換しない /x1 x def /y1 y def } { /z x 2 exp y 2 exp add sqrt def % 領域内を変換する。円の中心との距離 z 0 eq { /x1 x def /y1 y def } { % 分母は0にできないので変換しない /z1 L 2 z L atan mul sin mul def % 以下球面変換式 /x1 x z1 mul z div def /y1 y z1 mul z div def } ifelse } ifelse sw 0 eq { x1 y1 moveto /sw 1 def } % swが0なら始点へ移動 { x1 y1 lineto } ifelse % 始点と終点の間にパスを引く } def 0 setgray 0 0 240 240 rectstroke % 黒枠 120 120 translate % 座標の原点を中央に移動 newpath % 水平線 -100 5 100 { /y exch def -100 1 100 { /x exch def kyumen % 球面変換プロシージャ呼び出し } for /sw 0 def % 始点スイッチのリセット } for % 垂直線 -100 5 100 { /x exch def -100 1 100 { /y exch def kyumen } for /sw 0 def } for stroke % 線を描画

ヴィクトル・バザルリの絵画のような図形。

球面変換02.png
【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:球面変換 /L 100 def % 変換する円の大きさ /sw 0 def % 始点スイッチ /kyumen { % 球面変換プロシージャ x 2 exp y 2 exp add L L mul gt { % 円の外は変換しない /x1 x def /y1 y def } { /z x 2 exp y 2 exp add sqrt def % 領域内を変換する 円の中心との距離 z 0 eq { /x1 x def /y1 y def } { % 0では割れないので変換しない /z1 L 2 z L atan mul sin mul def /x1 x z1 mul z div def /y1 y z1 mul z div def } ifelse } ifelse sw 0 eq { x1 y1 moveto /sw 1 def } % 始点へ移動 { x1 y1 lineto } ifelse % 始点と終点の間にパスを引く } def % ===== 円 ===== /r 5 def % 円の半径 % dx dy 円の移動量 /en { 0 1 360 { /th exch def /x r th cos mul dx add def /y r th sin mul dy add def kyumen % 球面変換呼び出し } for } def 0 .5 1 setrgbcolor 0 0 240 240 rectfill % 黒枠 120 120 translate % 座標の原点を中央に移動 -120 12 120 { /dy exch def -120 12 120 { /dx exch def en % 円呼び出し /sw 0 def % 始点リセット } for /sw 0 def } for 1 .5 0 setrgbcolor fill

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

佐倉花火フェスタ2017 [Photo]

2017年8月6日


佐倉ふるさと広場で開かれる花火大会に行って来ました。
京成佐倉駅から歩いて40分、汗だくになりました。
場所を構えて、撮影の準備をして待ちます。
花火の撮影は初めてなのですが、リモートレリーズでうまくシャッターが切れずに、仕方なく通常のシャッターボタンを押して対処しました。

野村花火工業のものは、色使いや変化などが綺麗で見応えがありました。

公式サイト:佐倉花火フェスタ2017 野村花火工業

hanabi20170806-02.jpg


hanabi20170806-00.jpg

hanabi20170806-01.jpg

hanabi20170806-03.jpg

hanabi20170806-04.jpg

hanabi20170806-05.jpg

hanabi20170806-07.jpg

nice!(1)  コメント(0) 
共通テーマ:アート

透視投影変換 [PostScript]

変換


透視投影02.png
遠近感のある透視投影で立方体の投影図を描きます。
プログラムは平行投影変換とほぼ同じで、透視変換式が追加されています。
透視変換をプロシージャ化しようと思ったのですが、ちょっと面倒です。
ベタなやり方ですが各軸の回転変換の下にそれぞれ置いています。
spの値で遠近感が変わって来ます。

変換式は
sp:投影面と視点との距離
x1=sp*x/sp+z
y1=sp*y/sp+z

参考書籍:PC-9801/PC-8801 3次元グラフィックス入門 永山嘉昭 著


透視投影01.png

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:立方体の投影 /yr -30 def % Y軸周りの回転角度 /xr -30 def % X軸周りの回転角度 /zr -30 def % Z軸周りの回転角度 /sp -800 def % 投影面と視点との距離 % 回転と描画プロシージャ /rotation { /sw exch def % 始点を置くかどうかを取得 % Y軸周りの回転 /x2 x1 yr cos mul z1 yr sin mul sub def /y2 y1 def /z2 x1 yr sin mul z1 yr cos mul add def /x2 sp x2 mul sp z1 add div def % 透視投影変換 /y2 sp y2 mul sp z1 add div def % 透視投影変換 % X軸周りの回転 /x3 x2 def /y3 z2 xr sin mul y2 xr cos mul add def /z3 z2 zr cos mul y2 xr sin mul sub def /x3 sp x3 mul sp z2 add div def % 透視投影変換 /y3 sp y3 mul sp z2 add div def % Z軸周りの回転 /x4 y3 zr sin mul x3 zr cos mul add def /y4 y3 zr cos mul x3 zr sin mul sub def /x4 sp x4 mul sp z3 add div def % 透視投影変換 /y4 sp y4 mul sp z3 add div def % 0なら始点、1なら線を引く、それ以外は線を引いた後、始点と線を繋ぐ sw 0 eq { x4 y4 moveto } { sw 1 eq { x4 y4 lineto } { x4 y4 lineto closepath } ifelse } ifelse } def % 立方体の座標 /a [-50 50 50 ] def /b [ 50 50 50 ] def /c [ 50 -50 50 ] def /d [-50 -50 50 ] def /e [-50 50 -50 ] def /f [-50 -50 -50 ] def /g [ 50 50 -50 ] def /h [ 50 -50 -50 ] def % 座標データを取得 /readdata { % ポイントの配列からデータを取り出し、それぞれの座標に入れる /po exch def % 座標の配列名を取得 /x1 po 0 get def /y1 po 1 get def /z1 po 2 get def } def 0 0 240 240 rectstroke % 黒背景 120 120 translate % 座標の原点を中央に移動 newpath % 底面(オレンジ) d readdata % 座標のポイント名を渡す 0 rotation % 始点か線を引くか(0 or 1)を渡し、回転して描画する c readdata 1 rotation h readdata 1 rotation f readdata 2 rotation 1 .5 0 setrgbcolor fill % 色設定 % 奥面(赤) e readdata 0 rotation g readdata 1 rotation h readdata 1 rotation f readdata 2 rotation 1 0 0 setrgbcolor fill % 左側面(青) a readdata 0 rotation e readdata 1 rotation f readdata 1 rotation d readdata 2 rotation 0 .6 1 setrgbcolor fill % 右側面 g readdata 0 rotation b readdata 1 rotation c readdata 1 rotation h readdata 2 rotation 1 0 1 setrgbcolor fill % 上面(黄) a readdata 0 rotation b readdata 1 rotation g readdata 1 rotation e readdata 2 rotation 1 1 0 setrgbcolor fill % 正面(紫) %a readdata 0 rotation %b readdata 1 rotation %c readdata 1 rotation %d readdata 2 rotation %.8 0 .8 setrgbcolor fill

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

伝統の朝顔2017 くらしの植物苑 [Photo]

2017年7月29日


佐倉城址公園の一画にある国立歴史民俗博物館の施設の一つ、くらしの植物苑へ朝顔を見に行きました。
10時半に着いたのですが、もう大半はしおれていました。
様々な形、色とその特異な名称に驚きます。
資料によると名称は葉の色、模様、質+花の色、模様、花弁の形、咲き方、花弁の重ねを順番に記述し、必要に応じて付加してゆくということです。

暮らしの植物園.jpg

公式サイト:くらしの植物苑

朝顔大輪.jpg

黄弱渦.jpg

黄/弱渦/鶏足柳葉 淡水色地/青紫/吹雪
(き/じゃっか/けいそくやなぎは あわみずいろじ/あおむらさき/ふぶき)

黄縮緬葉.jpg

黄/縮緬葉 瑠璃/筒白/総/鳥甲 吹上/台咲/牡丹
(き/ちりめんは るり/つつしろ/そう/とりかぶと ふきあげ/だいざき/ぼたん)

黄蝉葉.jpg

黄/蝉葉 栗川茶/丸咲/大輪(団十郎)
(き/せみは くりかわちゃ/まるざき/たいりん)

黄斑入り.jpg

黄/斑入/州浜葉 紅/吹掛絞/丸咲/牡丹
(き/ふいり/すはまば べに/ふっかけしぼり/まるざき/ぼたん)

青弱渦蝙蝠.jpg

青/弱渦/蝙蝠南天葉 淡青地/藤紫/筒咲/八重
(あお/じゃっか/こうもりなんてんば あわあおじ/ふじむらさき/つつざき/やえ)

青渦柳葉.jpg

青/渦/柳葉 江戸紫/采咲
(あお/うず/やなぎは えどむらさき/さいざき)

この他、暮らしにまつわる様々な植物を見ることができます。

センノウ.jpg

センノウ

千成瓢箪.jpg

千成ヒョウタン
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:アート

平行投影変換 [PostScript]

変換


投影05.png
遠近感がない平行投影で立方体の投影図を描きます。
立方体の各頂点の座標を配列で用意します。頂点4つを組にして面を作り、配列からその座標を取り出します。
回転変形をして描画します。
背面のみを赤にして、前後関係を分かりやすくしています。

参考書籍:PC-9801/PC-8801 3次元グラフィックス入門 永山嘉昭 著

投影.png
投影00.png

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:立方体の投影 /yr 30 def % Y軸周りの回転角度 /xr 10 def % X軸周りの回転角度 /zr 20 def % Z軸周りの回転角度 % 回転と描画プロシージャ /rotation { /sw exch def % 始点を置くかどうかを取得 % Y軸周りの回転 /x2 x1 yr cos mul z1 yr sin mul sub def /y2 y1 def /z2 x1 yr sin mul z1 yr cos mul add def % X軸周りの回転 /x3 x2 def /y3 z2 xr sin mul y2 xr cos mul add def /z3 z2 zr cos mul y2 xr sin mul sub def % Z軸周りの回転 /x4 y3 zr sin mul x3 zr cos mul add def /y4 y3 zr cos mul x3 zr sin mul sub def % 0なら始点、1なら線を引く、それ以外は線を引いた後、始点と線を繋ぐ sw 0 eq { x4 y4 moveto } { sw 1 eq { x4 y4 lineto } { x4 y4 lineto closepath } ifelse } ifelse } def % 立方体の頂点の座標 /a [-50 50 50 ] def /b [ 50 50 50 ] def /c [ 50 -50 50 ] def /d [-50 -50 50 ] def /e [-50 50 -50 ] def /f [-50 -50 -50 ] def /g [ 50 50 -50 ] def /h [ 50 -50 -50 ] def % 座標データを取得 /readdata { % 立方体の配列からデータを取り出し、それぞれの座標に入れる /po exch def % 座標の配列名を取得 /x1 po 0 get def /y1 po 1 get def /z1 po 2 get def } def 2 setlinewidth % 線幅2ポイント 1 setlinejoin 0 0 240 240 rectstroke % 黒枠 120 120 translate % 座標の原点を中央に移動 newpath % 底面 d readdata % 座標のポイント名を渡す 0 rotation % 始点か線を引くか(0 or 1 or 2)を渡し、回転して描画する c readdata 1 rotation h readdata 1 rotation f readdata 2 rotation 0 0 0 setrgbcolor stroke % 色設定 % 奥面(赤) e readdata 0 rotation g readdata 1 rotation h readdata 1 rotation f readdata 2 rotation 1 0 0 setrgbcolor fill % 左側面 a readdata 0 rotation e readdata 1 rotation f readdata 1 rotation d readdata 2 rotation 0 0 0 setrgbcolor stroke % 右側面 g readdata 0 rotation b readdata 1 rotation c readdata 1 rotation h readdata 2 rotation stroke % 上面 a readdata 0 rotation b readdata 1 rotation g readdata 1 rotation e readdata 2 rotation stroke % 正面 a readdata 0 rotation b readdata 1 rotation c readdata 1 rotation d readdata 2 rotation stroke

面に色をつけました。奥面と底面を見せるため正面は抜いてあります。
PostScriptは色紙が重なっているようなものなので、面の描画に順番があります。角度によっては面の見え方に不具合が生じます。
どの角度から見ても良いようにするには、陰面処理をしなければなりませんが、このプログラムでは各頂点間を直線で結んでいるため不可能です。

投影01.png
【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:回転立方体 /yr -30 def % Y軸周りの回転角度 /xr -30 def % X軸周りの回転角度 /zr 0 def % Z軸周りの回転角度 % 回転と描画プロシージャ /rotation { /sw exch def % 始点を置くかどうかを取得 % Y軸周りの回転 /x2 x1 yr cos mul z1 yr sin mul sub def /y2 y1 def /z2 x1 yr sin mul z1 yr cos mul add def % X軸周りの回転 /x3 x2 def /y3 z2 xr sin mul y2 xr cos mul add def /z3 z2 zr cos mul y2 xr sin mul sub def % Z軸周りの回転 /x4 y3 zr sin mul x3 zr cos mul add def /y4 y3 zr cos mul x3 zr sin mul sub def % 0なら始点、1なら線を引く、それ以外は線を引いた後、始点と線を繋ぐ sw 0 eq { x4 y4 moveto } { sw 1 eq { x4 y4 lineto } { x4 y4 lineto closepath } ifelse } ifelse } def % 立方体の座標 /a [-50 50 50 ] def /b [ 50 50 50 ] def /c [ 50 -50 50 ] def /d [-50 -50 50 ] def /e [-50 50 -50 ] def /f [-50 -50 -50 ] def /g [ 50 50 -50 ] def /h [ 50 -50 -50 ] def % 座標データを取得 /readdata { % ポイントの配列からデータを取り出し、それぞれの座標に入れる /po exch def % 座標の配列名を取得 /x1 po 0 get def /y1 po 1 get def /z1 po 2 get def } def 0 0 240 240 rectstroke % 黒背景 120 120 translate % 座標の原点を中央に移動 newpath % 底面(オレンジ) d readdata % 座標のポイント名を渡す 0 rotation % 始点か線を引くか(0 or 1)を渡し、回転して描画する c readdata 1 rotation h readdata 1 rotation f readdata 2 rotation 1 .5 0 setrgbcolor fill % 色設定 % 奥面(赤) e readdata 0 rotation g readdata 1 rotation h readdata 1 rotation f readdata 2 rotation 1 0 0 setrgbcolor fill % 左側面(青) a readdata 0 rotation e readdata 1 rotation f readdata 1 rotation d readdata 2 rotation 0 .6 1 setrgbcolor fill % 右側面 g readdata 0 rotation b readdata 1 rotation c readdata 1 rotation h readdata 2 rotation 1 0 1 setrgbcolor fill % 上面(黄) a readdata 0 rotation b readdata 1 rotation g readdata 1 rotation e readdata 2 rotation 1 1 0 setrgbcolor fill % 正面(紫) %a readdata 0 rotation %b readdata 1 rotation %c readdata 1 rotation %d readdata 2 rotation %.8 0 .8 setrgbcolor fill 角度によって面が破綻しています。 投影03.png

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

風車のひまわりガーデン2017 [Photo]

2017年7月17日


昨日もふるさと広場へひまわりを撮影に来たのですが、いざ撮ろうとスイッチ入れたのですが、バッテリーを充電したままになってるのに気がつきました。幸い予備バッテリーがあったので良かったのですが、何枚か撮ってレンズを交換する時にモニターにno cardと表示されていました。
メモリーカードをパソコンに挿しっぱなしになっていることに気がつきました。
というわけで何も撮れずにすごすごと帰宅したのでした。
今日は用意万端で来ましたが、あいにくの曇り空。

himawari04.jpg

公式サイト:佐倉ふるさと広場・風車のひまわりガーデン

himawari01.jpg

himawari08.jpg

himawari03.jpg

himawari05.jpg

himawari02.jpg

himawari06.jpg

himawari07.jpg
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:アート

はす祭り2017 [Photo]

2017年7月15日

今年2度目のあやめパークです。はす祭りが開催されています。
佐原駅からバスに乗ったのですが、貸切でした。
この分では、園は閑散としているのではと思ったら、その通りでした。

帰りの佐原駅でその訳が分かりました。
佐原の大祭夏祭りが開催されているから、みんなこっちにいるようです。

ハス20170715.jpg

公式サイト:水郷佐原あやめパーク

ハス祭り.jpg

紅映朱簾.jpg

紅映朱簾

重水華.jpg

重水華

精華.jpg

精華

西施微笑.jpg

西施微笑

ハスの種子.jpg

種がこぼれそう

西施微笑2.jpg

西施微笑

西福寺観世.jpg

西福寺観世

天上蓮.jpg

天上蓮

壺蓮.jpg

壺蓮

ハスにトンボ.jpg

赤とんぼ

水車.jpg
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:アート

射影変換 [PostScript]

変換


射影変換03.png
図形をx軸またはy軸で回転させて斜めにし、遠近感のある図形にします。
参考書籍をもとに変換式をPostScriptコードにしました。

変換式は
L:視点までの距離
a:平面の傾き角度
y1=k*L*y/(L*cos(a)-y*sin(a))
x1=k*x*(L+y1*sin(a))/L

参考書籍:続パソコン・グラフィック・アート 竹村 伸一 著
参考書籍:数式によるパソコン・グラフィックスのテクニック 依田 谹 著

射影変換.png

射影変換00.png
【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:射影変換 /L 300 def % 視点までの距離 /a -30 def % 平面の傾き角度 2 setlinecap % 線の先端スクエア /r 50 def % 円の半径 /sw 0 def % 始点スイッチ /shaei { % 射影変換プロシージャ /y1 L y mul L a cos mul y a sin mul sub div def /x1 x L y1 a sin mul add mul L div def sw 0 eq { x1 y1 moveto /sw 1 def } % swが0なら始点へ移動 { x1 y1 lineto } ifelse % 始点と終点の間にパスを引く } def 0 setgray 0 0 240 240 rectstroke % 黒枠 120 120 translate % 座標の原点を中央に移動 newpath % 水平線 -70 10 70 { /y exch def -80 10 80 { /x exch def shaei % 射影変換プロシージャ呼び出し } for /sw 0 def % 始点スイッチのリセット } for % 垂直線 -80 10 80 { /x exch def -70 10 70 { /y exch def shaei } for /sw 0 def } for % 円 0 1 360 { /th exch def /x r th cos mul def /y r th sin mul def shaei } for stroke % 線を描画
y軸で回転させる場合はx1とy1を入れ替えるだけです。
x1=k*L*y/(L*cos(a)-y*sin(a)) y1=k*x*(L+y1*sin(a))/L 射影変換01.png

射影変換02.png
エピサイクロイドで描いた図形を射影変換。

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 /L 100 def % 視点までの距離 /a -35 def % 平面の傾き角度 /r 50 def % 円の半径 2 setlinecap % 線の先端スクエア /sw 0 def % 始点スイッチ /shaei { % 射影変換プロシージャ /y1 L y mul L a cos mul y a sin mul sub div def /x1 x L y1 a sin mul add mul L div def sw 0 eq { x1 y1 moveto /sw 1 def } % swが1なら始点へ移動 { x1 y1 lineto } ifelse % 始点と終点の間にパスを引く } def % ======= エピサイクロイド ========= /ar 40 def % 定円の半径 /br 10 def % 転円の半径 /cr 3 def % パラメータ /rc 1 def % R色 /gc 0 def % G色 /bc .8 def % B色 /lw 3 def % 線幅 % ======= メイン ========= newpath 0 0 240 240 rectfill % 黒背景 120 120 translate % 座標の原点を中央に移動 .5 dup scale newpath % パスの初期化 .8 .4 5 { /cr exch def 0 1 360 { /th exch def % 制御変数をth(角度)に入れる % エピサイクロイドの数式 /x ar br add th cos mul cr br mul ar br add th br div mul cos mul sub def /y1 ar br add th sin mul cr br mul ar br add th br div mul sin mul sub def shaei % 射影変換プロシージャ呼び出し } for closepath /sw 0 def % リセット rc gc bc setrgbcolor % カラー設定 lw setlinewidth % 線幅設定 stroke % 線を描画 /rc rc .08 sub def % 色変化 /bc bc .09 add def /gc gc .07 add def /lw lw .2 sub def % 線を変化 } for

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

おうぎ形変換 [PostScript]

変換


おうぎ形変換03.png
図形をおうぎ形に変換します。
参考書籍をもとに変換式をPostScriptコードにしました。

変換式のパラメータは図をご参照ください。
d=a*(x1-x)/x1+b
x2=(r+y1)*cos(d)+x0
y2=(r+y1)*sin(d)+y0

参考書籍:数式によるパソコン・グラフィックスのテクニック 依田 谹 著

おうぎ形.png


おうぎ形変換2.png

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:おうぎ形変換 /a 90 def % おうぎ形の傾き角度 /b 0 def % おうぎ形の湾曲の角度 /r 300 def % おうぎ形の中心からおうぎ形下端までの距離 /x1 400 def % 比率 /x0 0 def /y0 -250 def % おうぎ形の中心 /r2 50 def % 円の半径 2 setlinecap % 線の先端をスクエアにする /sw 0 def % 始点スイッチ /ougi { % おうぎ形変換プロシージャ /d a x1 x sub mul x1 div b add def /x2 r y1 add d cos mul x0 add def /y2 r y1 add d sin mul y0 add def sw 0 eq { x2 y2 moveto /sw 1 def } % swが0なら始点へ移動 { x2 y2 lineto} ifelse % さもなくば始点と終点の間にパスを引く } def 0 setgray 0 0 240 240 rectstroke % 背景 120 70 translate % 座標を中央に移動 % 水平線 -70 10 70 { /y1 exch def -80 10 80 { /x exch def ougi % おうぎ形変換プロシージャ呼び出し } for /sw 0 def % 始点スイッチのリセット } for % 垂直線 -80 10 80 { /x exch def -70 10 70 { /y1 exch def ougi } for /sw 0 def } for % 円 0 1 360 { /th exch def /x r2 th cos mul def % 円の公式 /y1 r2 th sin mul def ougi } for stroke

おうぎ形変換02.png
エピサイクロイドで描いた図形をおうぎ形に変換。

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:おうぎ形変換 /a 90 def % おうぎ形の傾き角度 /b 0 def % おうぎ形の湾曲の角度 /r 300 def % おうぎ形の中心からおうぎ形下端までの距離 /x1 200 def /x0 0 def /y0 -300 def % おうぎ形の中心 /sw 0 def % 始点スイッチ /ougi { % おうぎ形変換プロシージャ /d a x1 x sub mul x1 div b add def /x2 r y1 add d cos mul x0 add def /y2 r y1 add d sin mul y0 add def sw 0 eq { x2 y2 moveto /sw 1 def } % swが1なら始点へ移動 { x2 y2 lineto} ifelse % 始点と終点の間にパスを引く } def % ======= エピサイクロイド ========= /ar 40 def % 定円の半径 /br 10 def % 転円の半径 /cr 3 def % パラメータ /rc 1 def % R色 /gc 0 def % G色 /bc .8 def % B色 /lw 3 def % 線幅 % ======= メイン ========= newpath 0 0 240 240 rectfill % 黒背景 120 120 translate % 座標の原点を中央に移動 .5 dup scale newpath % パスの初期化 .8 .4 5 { /cr exch def 0 1 360 { /th exch def % 制御変数をth(角度)に入れる % エピサイクロイドの数式 /x ar br add th cos mul cr br mul ar br add th br div mul cos mul sub def /y1 ar br add th sin mul cr br mul ar br add th br div mul sin mul sub def ougi % おうぎ形変換プロシージャ呼び出し } for closepath /sw 0 def % リセット rc gc bc setrgbcolor % カラー設定 lw setlinewidth % 線幅設定 stroke % 線を描画 /rc rc .08 sub def % 色変化 /bc bc .09 add def /gc gc .07 add def /lw lw .2 sub def % 線を変化 } for

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

円筒(円柱)形変換 [PostScript]

変換


円筒形変換00.png
図形を円筒形に変換します。
参考書籍をもとに変換式をPostScriptコードにしました。
元の変換式は
x=r*sin(th)
z=r*cos(th)
yの位置は変わりません。

円筒形変換だけでは見た目の変換が分かりづらいので、回転を加えています。
回転の変換式は
x軸の回転
x1=x
y1=y*cos(xa)-z*sin(xa)
z1=y*sin(xa)+z*cos(xa)
y軸の回転
x2=x1*cos(ya)+z1*sin(ya)
y2=y1
z2=-x1*sin(ya)+z1*cos(ya)
z軸の回転
x3=x2*cos(za)-y2*sin(za)
ya=x2*sin(za)+y2*cos(za)
z3=z2

参考書籍:続パソコン・グラフィック・アート 竹村 伸一 著



円筒形変換01.png
変換前の図形

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:円筒(円柱)形変換 /xa 20 def % x軸角度 /ya 20 def % y軸角度 /za 30 def % Z軸角度 /r 60 def % 円柱の半径 /sw 0 def % 始点スイッチ /r2 50 def % 円の半径 2 setlinecap % 線の先端スクエア % 各軸の回転プロシージャ /rotation { % x軸角度 /x1 x def /y1 y xa cos mul z xa sin mul sub def /z1 y xa sin mul z xa cos mul add def % y軸角度 /x2 x1 ya cos mul z1 ya sin mul add def /y2 y1 def /z2 x1 neg ya sin mul z1 ya cos mul add def % Z軸角度 /x3 x2 za cos mul y2 za sin mul sub def /y3 x2 za sin mul y2 za cos mul add def /z3 z2 def % 描画 sw 0 eq { x3 y3 moveto /sw 1 def }{ x3 y3 lineto } ifelse } def 0 setgray 0 0 240 240 rectstroke % 黒背景 120 120 translate % 座標の原点を中央に移動 newpath % 水平線 -70 10 70 { % 水平線の縦の間隔 /y exch def % 制御変数をyに入れる -80 1 80 { % 水平線の開始角度 弧の滑らかさ 終了角度 /th exch def % 制御変数をth(角度)に入れる /x r th sin mul def % 円柱変換 /z r th cos mul def % 円柱変換 rotation % 回転プロシージャ呼び出し } for /sw 0 def % 始点スイッチのリセット } for % 垂直線 -80 10 80 { % 垂直線の横の間隔 /th exch def % 制御変数をth(角度)に入れる -70 1 70 { % 垂直線の長さ /y exch def % 制御変数をyに入れる /x r th sin mul def /z r th cos mul def rotation } for /sw 0 def } for % 円 0 1 360 { /th exch def /x r2 th cos mul def % 円の公式 /y r2 th sin mul def % 円の公式 /x r x sin mul def /z r x cos mul def rotation } for stroke

円筒形変換02-2.png
エピサイクロイドで描いた図形を円筒形に変換します。


エピサイクロイド2.png
変換前

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:円柱変換 /xa 30 def % x軸角度 /ya 30 def % y軸角度 /za -30 def % Z軸角度 /re 80 def % 円柱の半径 2 setlinecap /sw 0 def % 始点スイッチ % 各軸の回転プロシージャ /rotation { % x軸角度 /x1 x def /y1 y xa cos mul z xa sin mul sub def /z1 y xa sin mul z xa cos mul add def % y軸角度 /x2 x1 ya cos mul z1 ya sin mul add def /y2 y1 def /z2 x1 neg ya sin mul z1 ya cos mul add def % Z軸角度 /x3 x2 za cos mul y2 za sin mul sub def /y3 x2 za sin mul y2 za cos mul add def /z3 z2 def % 描画 sw 0 eq { x3 y3 moveto /sw 1 def }{ x3 y3 lineto } ifelse } def 0 setgray 0 0 240 240 rectfill % 黒背景 120 120 translate % 座標の原点を中央に移動 % ======= エピサイクロイド ========= /ar 40 def % 定円の半径 /br 10 def % 転円の半径 /cr 3 def % パラメータ /rc 1 def % R色 /gc 0 def % G色 /bc .8 def % B色 /lw 3 def % 線幅 % ======= メイン ========= newpath 1 dup scale newpath % パスの初期化 .8 .4 5 { /cr exch def % 制御変数crに入れる 0 1 360 { /th exch def % 制御変数をth(角度)に入れる % エピサイクロイドの数式 /x ar br add th cos mul cr br mul ar br add th br div mul cos mul sub def /y ar br add th sin mul cr br mul ar br add th br div mul sin mul sub def /x re x sin mul def % 円柱変換 /z re x cos mul def % 円柱変換 rotation % 回転プロシージャ呼び出し } for closepath /sw 0 def % リセット rc gc bc setrgbcolor % カラー設定 lw setlinewidth % 線幅設定 stroke % 線を描画 /rc rc .08 sub def % 色の変化 /bc bc .09 add def /gc gc .07 add def /lw lw .2 sub def % 線幅の変化 } for

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