航空宇宙機設計製図Ⅱ 課題1

第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 0x
  
 
y' 0 by
4
回転
・原点まわりに半時計方向にθだけ回転
x  r cosa , y  r sin a , r  x2  y 2
y
x'  r cosa 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 sina 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を押した後、
マウスカーソルをウインドウに載せて、
スペースバーを押して、マウスでクリック
: 一つのウインドウ(マウスで選択したウインドウ)