第4回 (2009/10/23) 航空宇宙機設計製図Ⅱ 2009年度 九州大学 工学部 機械航空工学科 航空宇宙工学コース 3年後期 金曜3限 谷 泰寛 ver. 2009/10/30 2 図形処理のための幾何学 拡大・縮小、回転、平行移動 3 拡大/縮小 ・原点に対して、x軸方向にa、y軸方向にbだけ拡大/縮小 y (x’, y’) by x' ax y' by (x, y) y x x ax x' a 0x y' 0 by 4 回転 ・原点まわりに半時計方向にθだけ回転 x r cosa , y r sin a , r x2 y 2 y x' r cosa q r cosa cosq r sin a sin q x cosq y sin q (x’, y’) r y = r sina (x, y) q a x x = r cosa y' r sina q r cosa sin q r sin a cosq x sin q y cosq x' cosq sin q x y' sin q cosq y 5 平行移動 ・x軸方向に p、y軸方向に q だけ平行移動 y (x’, y’) y+q (x, y) x' x p y' y q x' 1 0 x p y' 0 1 y q これでも計算可能だが、行列の 和の形となってしまう y x x x+p 6 平行移動 ・x軸方向に p、y軸方向に q だけ平行移動 y (x’, y’) y+q (x, y) x' x p y' y q x' 1 0 x p y' 0 1 y q これでも計算可能だが、行列の 和の形となってしまう y x x x+p x' 1 0 p x 同次座標表現 y' 0 1 q y 1 0 0 1 1 7 同次座標表現 座標点を、以下の形式で表現する形式(2次元の場合) x u y m 同次座標表現のメリット ・実際の座標値は、 ( x / m, y / m) x y ・3次元の場合は、 u z m ・平行移動が、マトリックスの積で表現できる(前頁)。 ・m=0とすると、特定方向の無限遠点を表現可能。 8 2次元変換マトリックス 操作 平行移動 拡大・縮小 回転 変換マトリックス 1 0 0 a 0 0 cosq sin q 0 0 p 1 q 0 1 0 0 b 0 0 1 sin q 0 cosq 0 0 1 備考 x軸方向にp、y軸方向 にqだけ移動 原点に対してx軸方向 にa倍、y軸方向にb倍 原点を中心に反時計 方向にqだけ回転 9 例題 : 左右対称図形を描く 10 ① 移動→対称→移動:合成変換 ④ (a, b) ② 1 0 a 平行移動 0 1 b 1 0 0 0 0 1 0 0 1 0 0 1 ③ 1 0 a 平行移動 0 1 b 0 0 1 対称移動 x' 1 0 a 1 0 0 1 0 a x 1 0 2a x y' 0 1 b 0 1 0 0 1 b y 0 1 0 y 1 0 0 1 0 0 1 0 0 1 1 0 0 1 1 11 コンピュータによる図形描画 コンピュータ アプリケーション プログラム OS データ グ ラ フ ィ ッ ク ス ラ イ ブ ラ リ ディスプレイ プロッタ プリンタ 12 ウインドウシステム コンピュータの画面出力 複数のタスクにウインドウを割 り当て、画面出力を多重化 主なウインドウシステム ・Quartz compositor (Mac OS X ) ・X Window System (Microsoft Windows : OSにウインドウシステムが組込) 13 グラフィックスライブラリ アプリケーションとディスプレイとのインターフェイスを行 う関数群 主なグラフィックスライブラリ ・OpenGL ・Direct2D, Direct3D ・Quartz (古くは、 CORE, GKS, PHIGS など) 14 本講義での画像表示 ・画面表示 ・・・ X Window System 座標変換等の計算処理部分は自作し、線を引 く等の基本的な描画のみを使用するため) ・保存/出力 ・・・ Postscript (EPS) 画像は文書ファイルへ貼り付けて残すものとす る。(要すれば、その文書ファイルをプリンタで 印刷) 15 X Window System クライアント・サーバモデル と ネットワーク指向 クライアントとサーバの2つのプログラム間で分担して処理 ・サーバ: ウインドウの生成・スクリーン表示、図形の出力、 キーボードやマウスの入力処理 ・クライアント: ウインドウの生成を要求、図形の出力を要求 Request Reply クライアント Event Error サーバ 16 X Window System デバイス独立、OS独立 ・デバイスに依存する部分はサーバが担当するので、アプリケーションはデ バイスに依存しない形で書くことが可能 ・サーバ側システムのOSやハードウエアに依存した操作は、サーバが処 理を担当 ・アプリケーションは、XlibというC言語で書かれたライブラリの関数をコー ルし、コールされたXlibの関数がXプロトコルを発生 サーバ クライアント デバイス独立 アプリケーション OS依存 Xlib デバイス依存 X protocol OS OS 17 X Window System ソフトウエアの階層とツールキット、グラフィックスライブラリ アプリケーション Widget Xt intrinsics OSF Motif OpenGL / GLX Xlib ※本講義では、直接Xlibをコールするアプリケーションを作成する。 18 X Window System ビットマップ・ディスプレイを想定 ビットマップディスプレイ: ピクセルと呼ばれる小さな点(画素) の集合で画像を表示する装置 19 X Window System ディスプレイ上に画像を描くには、ディスプレイ上のピク セルに個別の色を与える。 ピクセルの識別のために、ピクセル座標系を利用。 左上を原点(0,0) 20 X Window System ウインドウを表示するプログラム #include <X11/Xlib.h> #include <X11/Xutil.h> #include <stdio.h> main() { Display *d; Window w; d = XOpenDisplay (NULL); w = XCreateSimpleWindow (d, DefaultRootWindow (d), 50, 50, 400, 300, 2, BlackPixel(d,0), WhitePixel(d,0)); XMapWindow (d,w); XFlush (d); getchar (); XCloseDisplay (d); } 21 X Window System 線を描くプログラム #include <X11/Xlib.h> #include <X11/Xutil.h> #include <stdio.h> eventMask = StructureNotifyMask; XSelectInput( dsp, win, eventMask ); XEvent evt; do{ XNextEvent( dsp, &evt ); // calls XFlush }while( evt.type != MapNotify ); int main(){ Display *dsp; Window win; int screenNumber; GC gc; unsigned long white; unsigned long black; long eventMask; gc = XCreateGC( dsp, win, 0, NULL); XSetForeground( dsp, gc, black ); XDrawLine(dsp, win, gc, 10, 10,190,190); XDrawLine(dsp, win, gc, 10,190,190, 10); dsp = XOpenDisplay( NULL ); screenNumber = DefaultScreen(dsp); white = WhitePixel(dsp,screenNumber); black = BlackPixel(dsp,screenNumber); eventMask = ButtonPressMask|ButtonReleaseMask; XSelectInput(dsp,win,eventMask); do{ XNextEvent( dsp, &evt ); // calls XFlush() }while( evt.type != ButtonRelease ); win = XCreateSimpleWindow (dsp, DefaultRootWindow(dsp), 50, 50, 600, 300, 0, black, white ); XMapWindow( dsp, win ); XCloseDisplay( dsp ); } 22 X Window System C言語で作成したX Window Systemを使用したプログラム のコンパイル・リンク方法(前頁のサンプル等) (1) ホスト計算機の場合 ・sample.cをコンパイルし、a.outを作成する場合、 X11のライブラリ(Xlib.h, Xutil.h)をライブラリとして指定する必要がある。 gcc sample.c -lX11 (2) その他のX環境の場合 (自宅のPCなど) ・ライブラリが置いてある場所がシステムによって異なる場合には、 ライブラリの場所を指定する必要がある。 (例) gcc sample.c -L/usr/X11R6/lib -lX11 23 Tips X Window Systemで描画するプログラムを実行する場合は、 ● 「X11(xterm)」上で実行する。 ● ホスト計算機にログインする際に、 ssh -X ah.s.kyushu-u.ac.jp これをきちんとやらないと、 Segmentationなんとかというエ ラーメッセージが表示される。 とする。「-X」を忘れないように。 ● ホスト計算機にログインした時に、「.Xauthorityでエラーが発生」とかい うエラーメッセージが表示される場合は、個人の使用容量制限 (100MB?)をオーバーしている可能性がある。 (次頁参照) → 不要なファ イルを削除。 だめなら、パソコンから一旦ログアウトしてみる。 ●コンパイルする場合は、「ターミナル」でも良いし、「X11」でも「-X」 をつけなくてもよい。 24 Tips 自分がどれくらい容量を使っているかを確認する方法 ● Finderで、自分のIDをクリックした後、 「ファイル」メニュー → 「情報を見る」を選択 「サイズ」の欄を見る(少し時間がかかる) 25 Tips プログラムは正しそうなのに、コンパイルでエラーが出る場合 エラーメッセージに、「UTF-16がどうしたこうした」と出る場合、Emacsでプログラムを編 集した際に、ファイルの先頭に妙な文字が入ってしまっていることがある。(Emacs上で は見えないため、原因がわかりづらい。) 確認方法 $ cat ファイル名 として、画面上にファイルの中身が表示されるので、先頭に「??」があるかどうかを 確認する。 対処方法 (「??」があった場合。根本的な解決ではないが。) ・ 上で、画面に表示されたものの「??」を除く部分をマウスで選択してコピーする。 ・ Emacs等のエディタで、新しいファイルの編集を行い、コピーしたものを貼付けて、 別名のファイルとして保存する。 26 Tips 「ターミナル」で文字を大きくするには、 ● 「ターミナル」メニュー → 「環境設定」 27 Tips 「xterm」で文字を大きくするには、 (方法その1) ● 次の内容のファイルを作り、「.Xdefaults」という名前で保存する。 XTerm*VT100*font: 10x20 ● xterm上で次のコマンドを実行する。 $ xrdb .Xdefaults ● 「アプリケーション」メニューから、新たに「xterm」を実行する。 (方法その2) ● xtermを実行する際のオプションで、フォントサイズを指定する。 $ xterm -fn 10x20 (このように打ち込むと、新しいウインドウが開く) ◯ 使えるフォントサイズは、5x7 5x8 6x9 6x10 6x12 6x13 7x13 8x13 7x14 9x15 8x16 10x20 12x24 など。 対応していないサイズを指定すると、デフォルトのサ イズになってしまう模様。 28 Postscript と EPS Adobe社が開発したページ記述言語の1つ。 「ページ記述言語」とは、ページ上に印刷される文字、図形、画像 などを記述するための言語。プログラミング言語でもあり、計算や 繰り返しなどを記述する能力がある。 EPS (Encapsulated Postscript)とは、Postscriptを利用して作ら れた画像ファイルデータ形式の1種であり、文書への貼り付け等を 考慮されている。(文法は同じ) 29 Postscriptによる作画例 バッテンを描くEPSファイル %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 400 %%Orientation: Portrait %%Pages: 1 %%EndComments /mydict 120 dict def mydict begin gsave 0.0 0.0 1.0 setrgbcolor newpath 10 10 moveto 300 300 lineto 300 10 moveto 10 300 lineto stroke showpage %%Trailer %%EOF 300 Postscriptでは 左下が原点 上の図は、 ・左の内容のテキストファイルを作成 ・「○○.eps」という名前で保存 ・Powerpointでそのファイルを読み込んで挿入 ・外枠の線は、別。(領域明示のために追加) ・Postscriptでは、左下が原点となる。 30 本講義での使用について X Window System や Postscript をそのまま使うのは若干面倒 ↓ Fortranから簡単な呼び出しで描画できるようなサブルーチン群を用意し た。 ただし、機能は限定している。 ・XCgraphics.c ・PSgraphics.f90 : Xlibを使って画面描画 : 作画内容のEPSファイルを作成 ▷両者で、同じ呼び出しとしているため、callする側は修正不要。 ・自作のプログラム + XCgraphics.c → 画面表示 ・自作のプログラム + PSgraphics.f90 → EPSファイル出力 のように、コンパイル・リンク時に取り替えればよい。 ▷座標系は、X Window Systemのもので共通 (左上が原点、Y軸正は下向き)。 ▷使用マニュアルをWeb ページ上に置いてあるので、参照のこと。 31 本講義での使用について プログラムのコンパイル・リンク方法 (ホスト計算機上) (1) XCgraphics.cの場合 ① XCgraphics.c をコンパイルし、XCgraphics.o を作成 gcc XCgraphics.c -c ② main.f90 をコンパイルし、XCgraphics.o とともにmain.x を作成 f95 main.f90 XCgraphics.o -o main.x -lX11 (2) PSgraphics.f90の場合 main.f90 と PSgraphics.f90 をコンパイル・リンクし、main.x を作成 f95 main.f90 PSgraphics.f90 -o main.x 32 XCgraphics.c, PSgraphics.f90 のサブルーチン(1/2) 機 能 Fortranからの呼び出し,引数 Create Window call xcinit ( screen_width, screen_height ) 幅screen_width高さscreen_heightのウインドウ を生成する. integer screen_width, screen_height Set Color call xccolor ( cn ) 描画する色を設定する. 0: black, 1: white, 2: blue, 3: red, 4: magenta, 5: green, 6: cyan, 7: yellow, 8: orange integer cn Set line width call xclinewidth ( line_width ) 線の太さをline_widthピクセルに設定する. integer line_width Draw point call xcpoint ( x, y ) 座標(x,y)に点を描く.(PSでは非表示.下も同様) integer x, y Draw points call xcpoints ( xpoint, ypoint, np ) np個の座標(xpoint(i),ypoint(i))に点を描く. integer np, xpoint(np), ypoint(np) Draw line call xcline ( x1, y1, x2, y2 ) 座標(x1,y1),(x2-y2)点間に直線を描く. integer x1, y1, x2, y2 Draw lines call xclines ( xpoint, ypoint, np ) 座標(xpoint(i),ypoint(i)),i=1,npに与えられた点 を結んだ折れ線を描く. integer np, xpoint(np), ypoint(np) 33 XCgraphics.c, PSgraphics.f90 のサブルーチン(2/2) 機 能 Fortranからの呼び出し,引数 Draw rectangle call xcrect ( x, y, width, height ) 座標(x,y)に幅width高さheightの長方形を描く. integer x, y, width, height Fill rectangle call xcfillrect ( x, y, width, height ) 座標(x,y)に幅width高さheightの長方形を塗りつ ぶす. integer x, y, width, height Fill polygon call xcpolygon ( xpoint, ypoint, np ) 座標(xpoint(i),ypoint(i)),(i=1,np)を頂点とする多 角形の内部を塗りつぶす. integer np, xpoint(np), ypoint(np) Draw arc call xcarc ( x, y, width, height, angle1, angle2 ) 座標(x,y)を中心として、幅width高さheightの円 弧を描く Fill arc 座標(x,y)を中心として、幅width高さheightの円 弧の内部を塗りつぶす. integer x, y, angle1, angle2, width, height call xcfillarc ( x, y, width, height, angle1, angle2 ) integer x, y, angle1, angle2, width, height Draw string call xcstring ( x, y, str, n ) 座標(x,y)にn文字の文字列strを出力する. integer x, y, n character str Close Window call xcclose ( pi1 ) ウインドウを閉じる. integer pi1 34 XCgraphics.c, PSgraphics.f90 の使用例 program sample4 implicit none integer i, j, n, xpoint(10), ypoint(10), np real pi character a*1 call xcinit ( 400, 300 ) call xccolor ( 2 ) call xcline ( 10, 10, 300, 300 ) call xccolor ( 5 ) call xclinewidth ( 5 ) call xcline ( 10, 300, 300, 10 ) call xccolor ( 9 ) call xcfillrect ( 30, 100, 50, 30 ) pi = 4.0 * atan( 1.0 ) np = 6 do i = 1, 6 xpoint (i) = 200 + 40 * cos ((i-1)*72*pi/180.0 ) ypoint (i) = 100 + 40 * sin ((i-1)*72*pi/180.0 ) end do call xccolor ( 6 ) call xcpolygon ( xpoint, ypoint, np ) call xclinewidth ( 3 ) call xccolor ( 3 ) call xclines ( xpoint, ypoint, np ) call xccolor ( 9 ) call xcpoints( xpoint, ypoint, np ) call xcarc ( 90, 200, 60, 100, 0, 360 ) write (6,*) "press enter" read (5,'(a)') a call xccolor ( 7 ) call xcfillarc ( 210, 230, 150, 150, 5, 335 ) call xcclose call xccolor ( 0 ) call xcstring ( 60, 55, "Sample4.f", 9 ) end program sample4 sample4.f90 35 XCgraphics.c, PSgraphics.f90 の使用例 sample4.f90の出力結果 XCgraphics.cによる画面表示 (画面のキャプチャ)※ PSgraphics.f90によるepsファイルを貼付 ※本資料の最終頁を参照。 36 XCgraphics.c, PSgraphics.f90 の使用例 両者の比較 ・・・ Postscript形式は、拡大しても劣化しない。 前頁の図を拡大したもの XCgraphics.cによる画面表示 (画面のキャプチャ) PSgraphics.f90によるepsファイルを貼付 37 参考文献 ~ より詳しく知りたいならば X Window Systemについての解説 ・X Window System: The Complete Refecence to Xlib, X Protocol, ICCCM, XLFD https://www.msu.edu/~huntharo/xwin/docs/xwindows/XWINSYS.pdf ・X-Window Ver.11プログラミング-第2版、木村凌一ほか著、日刊工業新聞社 Postscript言語についての解説 ・Adobe社によるPostscript言語のリファレンスマニュアル http://www.adobe.com/products/postscript/pdfs/PLRM.pdf ・Adobe社によるEPSファイル形式の仕様 http://partners.adobe.com/public/developer/en/ps/5002.EPSF_Spec.pdf 38 課題 2 (1) 辺の数が3(三角形)以上の多角形を描け。また、それを時 計回りに90°回転させた図を描け(座標軸を描くこと) 。 (2) 不等辺三角形を描け。また、それを基に各辺の長さを2倍に 拡大した不等辺三角形を描け(座標軸を描くこと) 。 (3) 適当な多角形を描き、その頂点の一つ(原点を除く)を中心 として元の図形を時計回りにn(i)°回転させたときの図を描 け。ただし、n(i)= 2,3,5,7,11,13,17,19,23,29,37,41(i=1~ 12)とする (座標軸を描くこと)。 ・提出日: 2009年12月4日(金)講義開始前まで ・提出物: プログラム説明書とプログラムリスト、および作図結果をMicrosoft Word文書形式で提出(※次頁参照) ・提出先: [email protected] 宛てに電子メールにより提出のこと. ファイル名は「自分の氏名2.doc」等とすること.例えば、「谷泰寛2.doc」 39 出力方法 ディスプレイ上に表示して、作図結果を見る. eps形式でファイル出力. それを「プレビュー」で開いて確認.(PDFに変換される) Wordに貼付ける場合は、「挿入」→「図」→「ファイルか ら..」→「epsファイルを選択」. (古いバージョンのWordでは、貼付後に枠だけしか表示されない 場合があるが、PDF形式で出力(またはプリンタで印刷)すると、き ちんと表示される.) 40 (参考) Mac OS Xで画面のキャプチャ 「アプリケーション」→「ユーティリティ」→「グラブ」 command+shift+3 : 画面全体 command+shift+4を押した後、マウスで領域を選択 : 画面の一部(マウスで選択した領域) command+shift+4を押した後、 マウスカーソルをウインドウに載せて、 スペースバーを押して、マウスでクリック : 一つのウインドウ(マウスで選択したウインドウ)
© Copyright 2024 ExpyDoc