• 検索結果がありません。

● 前回の講義のまとめ

N/A
N/A
Protected

Academic year: 2021

シェア "● 前回の講義のまとめ"

Copied!
11
0
0

読み込み中.... (全文を見る)

全文

(1)

2003年数理解析・計算機数学2・第111

● 前回の講義のまとめ

● 講義資料

★2Dグラッフィックスの例

WEBページ

http://www.math.nagoya-u.ac.jp/~naito/lecture/2003_AW/

にあ,“ex11_example.tar.gz”をダウンロードして,以下のコマンドを実行する.

tarxvfzex11_example.tar.gz

する,ディレクトリ“ex11_example”内に以下のファイルが展開される.

Makefile,graphics.hgraphics.c2d_objects.hgraphics.txt

prog_11_1.cprog_11_2.cprog_11_3.c

この,以下のコマンドを順に実行す.

“makeprog_11_1”

実行可能コード“prog_11_1”の生成.

“./prog_11_1>!prog_11_1.eps”PostScriptファイル“prog_11_1.eps”の生成.

“gvprog_11_1.eps”

生成されたグラッフィックスを見る.

同様に“prog_11_2”,“prog_11_3”も生成できる.

れらのファイルと同一のディレクトリに各自でプログラムを書き,2Dグラッフィックスを生成す

.各自で書いたプログラムでは,“graphics.c”に含まれる関数を利用することができる.

● 実習内容

易〜中)正四面体・正六面体・正八面正十二面体・正二十面体の展開図を書きなさい.

子メールで「今日の講義の感想や意見」を送ってください.

ex11.tex,v1.62004-01-0817:10:49+09naitoExp

(2)

Jan 8 2004 17:12

2d_objects.h

Page 1

2d_objects.h

/* $Id: 2d_objects.h,v 1.5 2004-01-08 12:16:47+09 naito Exp $ */

/* 2 D グ ラ フ ィ ッ ク ス の 構 造 体 定 義 と 関 数 プ ロ ト タ イ プ 宣 言 */

#include <stdio.h>

#include <math.h>

#ifndef _2D_OBJECTS_H_

#define _2D_OBJECTS_H_

#define DIM_2 2 /* 次 元 */

#define PN 64 /* 頂 点 の 最 大 数 */

/* 色 を あ ら わ す 構 造 体 */

struct color { double r ; double g ; double b ; } ;

typedef struct color color ;

/* 2 次 元 多 面 体 を あ ら わ す 構 造 体 */

struct polygon_2 {

double p[PN][DIM_2] ; /* 頂 点 の 座 標 */

int pn ; /* 頂 点 数 */

color face_color ; /* 多 面 体 の 色 */

color segment_color ; /* 多 面 体 の 境 界 色 */

} ;

typedef struct polygon_2 polygon_2 ;

#endif /* _2D_OBJECTS_H_ */

1

(3)

Jan 8 2004 17:12

Makefile

Page 1

Makefile

CC = gcc

CFLAGS = -Wall -pedantic LDFLAGS =

LIBS = -lm SRCS = graphics.c OBJS = $(SRCS:.c=.o) all:

clean:

/bin/rm -f *.o *~

.SUFFIXES: .c .c:

@$(MAKE) $(OBJS)

$(CC) $(OBJS) $< -o $@ $(LIBS)

graphics.c: graphics.h 2d_objects.h graphics.h: 2d_objects.h

graphics.o: graphics.c

1

(4)

Jan 8 2004 17:12

graphics.c

Page 1

graphics.c

/* PostScript Graphics Library */

/* $Id: graphics.c,v 1.11 2004-01-08 14:27:27+09 naito Exp $ */

#include <stdio.h>

#include <math.h>

#define _GRAPHICS_C_

#include "graphics.h"

#include "2d_objects.h"

/* A4 paper size (594, 794), A4 paper center (297, 397) */

static int a4_center_x = 297 ; static int a4_center_y = 397 ; static char *print_color(color) ;

void ps_opengraphics(double x1, double y1, double x2, double y2) {

double cx, cy ;

cx = a4_center_x - (x1+x2)/2.0 ; cy = a4_center_y - (y1+y2)/2.0 ; fprintf(stdout, "%%!PS-Adobe-2.0\n") ;

fprintf(stdout, "%%%%BoundingBox: %f %f %f %f\n", cx + x1, cy + y1, cx + x2, cy + y 2) ;

fprintf(stdout, "%%%%EndComments\n") ; fprintf(stdout, "%f %f translate\n", cx, cy) ; return ;

}

void ps_closegraphics(void) {

fprintf(stdout, "showpage\n") ; fprintf(stdout, "%%%%Trailer\n") ; fprintf(stdout, "%%%%EOF\n") ; return ;

}

void ps_opengraphics_multipage(double x1, double y1, double x2, double y2, int pages) {

double cx, cy ;

cx = a4_center_x - (x1+x2)/2.0 ; cy = a4_center_y - (y1+y2)/2.0 ; fprintf(stdout, "%%!PS-Adobe-2.0\n") ;

fprintf(stdout, "%%%%BoundingBox: %f %f %f %f\n", cx + x1, cy + y1, cx + x2, cy + y 2) ;

fprintf(stdout, "%%%%Pages: %d\n", pages) ; fprintf(stdout, "%%%%EndComments\n") ; x_origin = cx ; y_origin = cy ; return ;

}

void ps_closegraphics_multipage(void) {

fprintf(stdout, "%%%%Trailer\n") ; fprintf(stdout, "%%%%EOF\n") ; return ;

}

void ps_start_page(int page) {

fprintf(stdout, "%%%%Page: %d %d\n", page, page) ; fprintf(stdout, "%f %f translate\n", x_origin, y_origin) ; return ;

}

void ps_close_page(void) {

Jan 8 2004 17:12

graphics.c

Page 2

graphics.c

fprintf(stdout, "showpage\n") ; fprintf(stdout, "%%%%PageTrailer\n") ; return ;

}

void ps_draw_polygon(polygon_2 *p, int opt) {

int i ;

if (!((opt&FACE)||(opt&WIRE))) return ;

fprintf(stdout, "%%%%%%%% Draw Polygon (opt=%d)\n", opt) ; fprintf(stdout, " newpath\n") ;

fprintf(stdout, " %f setlinewidth %s\n", linewidth, print_color(p->segment_color)) ;

fprintf(stdout, " %f %f moveto\n", p->p[0][0], p->p[0][1]) ; for(i=1;i<p->pn;i++)

fprintf(stdout, " %f %f lineto\n", p->p[i][0], p->p[i][1]) ; fprintf(stdout, " closepath\n") ;

if ((opt&FACE)&&(opt&WIRE)) { /* 面 と 線 を 描 画 す る */

fprintf(stdout, " gsave\n") ;

fprintf(stdout, " %s fill stroke\n", print_color(p->face_color)) ; fprintf(stdout, " grestore\n") ;

}

else if (opt&FACE) { /* 面 の み を 描 画 す る */

fprintf(stdout, " %s fill stroke\n", print_color(p->face_color)) ; }

fprintf(stdout, " stroke\n") ;

fprintf(stdout, "%%%%%%%% END of Draw Polygon\n") ; return ;

}

void ps_write_string(double x, double y, double size, char *s) {

fprintf(stdout, "newpath 0 setgray\n") ; fprintf(stdout, "%f %f moveto\n",x, y) ;

fprintf(stdout, "/Courier findfont %f scalefont setfont\n", size) ; fprintf(stdout, "(%s) show\n", s) ;

return ; }

void ps_write_point_number(double *p, double size, char c, color fore_color, color ba ck_color, color boundary_color)

{

fprintf(stdout, "%%%%%%%% WRITE POINT: %c\n", c) ; fprintf(stdout, " newpath\n") ;

fprintf(stdout, " %f setlinewidth %s\n", linewidth, print_color(boundary_color)) ;

fprintf(stdout, " %f %f moveto\n", p[0]+size, p[1]) ; fprintf(stdout, " %f %f %f 0 360 arc\n", p[0], p[1], size) ;

fprintf(stdout, " gsave %s fill stroke grestore\n", print_color(back_color)) ; fprintf(stdout, " stroke\n") ;

fprintf(stdout, " newpath\n") ;

fprintf(stdout, " %s\n", print_color(fore_color)) ;

fprintf(stdout, " /Courier findfont %f scalefont setfont\n", size) ; fprintf(stdout, " %f %f moveto\n", p[0], p[1]) ;

fprintf(stdout, " (%c) dup stringwidth pop 2 div -1 mul dup exch rmoveto show\n"

, c) ;

fprintf(stdout, " stroke\n") ;

fprintf(stdout, "%%%%%%%% END of WRITE POINT: %c\n", c) ; return ;

}

void ps_draw_circle(double *p, double radius, color rgb) {

fprintf(stdout, "%%%%%%%% DRAW CIRCLE center: (%f %f) radius: %f\n", p[0], p[1], ra

1

(5)

Jan 8 2004 17:12

graphics.c

Page 3

graphics.c

dius) ;

fprintf(stdout, " newpath\n") ;

fprintf(stdout, " %f setlinewidth %s\n", linewidth, print_color(rgb)) ; fprintf(stdout, " %f %f moveto\n", p[0]+radius, p[1]) ;

fprintf(stdout, " %f %f %f 0 360 arc\n", p[0], p[1], radius) ; fprintf(stdout, " stroke\n") ;

fprintf(stdout, "%%%%%%%% END of DRAW CIRCLE center: (%f %f) radius: %f\n", p[0], p [1], radius) ;

return ; }

void ps_draw_line(double *s, double *e, color rgb) {

fprintf(stdout, "%%%%%%%% DRAW LINE from (%f, %f) to (%f, %f)\n", s[0], s[1], e[0], e[1]) ;

fprintf(stdout, " newpath\n") ;

fprintf(stdout, " %f setlinewidth %s\n", linewidth, print_color(rgb)) ; fprintf(stdout, " %f %f moveto\n", s[0], s[1]) ;

fprintf(stdout, " %f %f lineto\n", e[0], e[1]) ; fprintf(stdout, " stroke\n") ;

fprintf(stdout, "%%%%%%%% END of DRAW LINE from (%f, %f) to (%f, %f)\n", s[0], s[1]

, e[0], e[1]) ; return ; }

char *print_color(color rgb) {

static char s[100] ;

sprintf(s,"%f %f %f setrgbcolor", rgb.r, rgb.g, rgb.b) ; return s ;

}

2

(6)

Jan 8 2004 17:12

graphics.h

Page 1

graphics.h

/* PostScript Graphics Header File */

/* $Id: graphics.h,v 1.11 2004-01-08 14:27:37+09 naito Exp $ */

#ifndef _GRAPHICS_H_

#define _GRAPHICS_H_

#include "2d_objects.h"

/* 多 角 形 描 画 の オ プ シ ョ ン 値 */

#define WIRE (1<<0) /* 境 界 線 の 描 画 */

#define FACE (1<<1) /* 面 の 塗 り 潰 し */

void ps_opengraphics(double, double, double, double) ; void ps_closegraphics(void) ;

void ps_opengraphics_multipage(double, double, double, double, int) ; void ps_closegraphics_multipage(void) ;

void ps_start_page(int) ; void ps_close_page(void) ;

void ps_draw_polygon(polygon_2 *, int) ;

void ps_write_string(double, double, double, char *) ;

void ps_write_point_number(double *, double, char, color, color, color) ; void ps_draw_circle(double *, double, color) ;

void ps_draw_line(double *, double *, color) ;

#ifdef _GRAPHICS_C_

/* color 構 造 体 の プ リ セ ッ ト 値 */

color COLOR_BLACK={0.0, 0.0, 0.0} ; color COLOR_WHITE={1.0, 1.0, 1.0} ; color COLOR_RED={1.0, 0.0, 0.0} ; color COLOR_GREEN={0.0, 1.0, 0.0} ; color COLOR_BLUE={0.0, 0.0, 1.0} ; color COLOR_MAGENTA={1.0, 0.0, 1.0} ; color COLOR_YELLOW={1.0, 1.0, 0.0} ; color COLOR_CYAN={0.0, 1.0, 1.0} ; /* 線 の 太 さ */

double linewidth=0.1 ; #else

color COLOR_BLACK ; color COLOR_WHITE ; color COLOR_RED ; color COLOR_GREEN ; color COLOR_BLUE ; color COLOR_MAGENTA ; color COLOR_YELLOW ; color COLOR_CYAN ; double linewidth ; #endif /* _GRAPHICS_C */

/* 座 標 変 換 */

double x_origin, y_origin ; #endif /* _GRAPHICS_H_ */

1

(7)

Jan 8 2004 17:12

prog_11_1.c

Page 1

prog_11_1.c

/* $Id: prog_11_1.c,v 1.13 2004-01-08 17:09:26+09 naito Exp $ */

/* 2 D グ ラ ッ フ ィ ッ ク ス */

#include <stdio.h>

#include <math.h>

#include "2d_objects.h"

#include "graphics.h"

void init_rotate_matrix(double [][DIM_2], double) ; void rotate(double [DIM_2], double [][DIM_2]) ; void scale_2d(polygon_2 *, double) ;

void move_2d(polygon_2 *, double, double) ;

#define ANGLE (2.0*(M_PI)/5.0) /* 回 転 角 */

int main(int argc, char **argv) {

polygon_2 poly_5 ;

double r[DIM_2][DIM_2] ; int i, j ;

char c ;

double center[DIM_2]={0.0, 0.0} ;

double x1=-150.0, y1 = -150.0, x2 = 150.0, y2 = 400.0 ; /* 正 5 角 形 の 設 定 */

init_rotate_matrix(r, ANGLE) ; /* 回 転 行 列 の 初 期 化 */

poly_5.pn = 5 ; /* 多 面 体 の 頂 点 数 を 設 定 */

poly_5.face_color = COLOR_CYAN ; /* 面 の 色 を 設 定 */

poly_5.segment_color = COLOR_BLUE ; /* 線 の 色 を 設 定 */

/* 各 点 の 座 標 の 設 定 */

for(i=0;i<poly_5.pn;i++) { poly_5.p[i][0] = 1.0 ; poly_5.p[i][1] = 0.0 ; } for(i=1;i<poly_5.pn;i++) for(j=0;j<i;j++) rotate(poly_5.p[i], r) ;

scale_2d(&poly_5, 100.0) ; /* オ ブ ジ ェ ク ト の ス ケ ー ル を 変 更 */

ps_opengraphics(x1,y1,x2,y2) ; /* ス ク リ ー ン と ス ケ ー ル の 設 定 */

ps_draw_circle(center, 100.0, COLOR_RED) ; /* 円 の 描 画 */

ps_draw_polygon(&poly_5, WIRE) ; /* 描 画 */

linewidth = 1.0 ; /* 線 の 太 さ の 変 更 */

move_2d(&poly_5, 0.0, 250.0) ; /* 移 動 */

ps_draw_polygon(&poly_5, WIRE|FACE) ; /* 描 画 */

for(i=0;i<poly_5.pn;i++) { /* 点 の 番 号 の 描 画 */

c = i + ’0’ ;

ps_write_point_number(poly_5.p[i], 10, c, COLOR_WHITE, COLOR_BLUE, COLOR_RED) ; }

ps_closegraphics() ; /* Graphics の 終 了 */

return 0 ; }

/*********************************************/

/* 多 角 形 p を scale 倍 す る */

void scale_2d(polygon_2 *p, double scale) {

int i, j ;

for(i=0;i<p->pn;i++)

for(j=0;j<DIM_2;j++) p->p[i][j] *= scale ; return ;

}

/* 多 角 形 p (x,y) だ け 平 行 移 動 す る */

void move_2d(polygon_2 *p, double x, double y) {

int i ;

for(i=0;i<p->pn;i++) {

Jan 8 2004 17:12

prog_11_1.c

Page 2

prog_11_1.c

p->p[i][0] += x ; p->p[i][1] += y ; }

return ; }

/* 点 p に 一 次 変 換 r を 作 用 さ せ る */

void rotate(double p[DIM_2], double r[][DIM_2]) {

int i, j ; double t[DIM_2] ;

for(i=0;i<DIM_2;i++) { t[i] = 0.0 ;

for(j=0;j<DIM_2;j++) t[i] += r[i][j]*p[j] ; }

for(i=0;i<DIM_2;i++) p[i] = t[i] ; return ;

}

/* 2 D 回 転 行 列 の 設 定, 回 転 角 theta */

void init_rotate_matrix(double r[][DIM_2], double theta) {

int i, j ;

for(i=0;i<DIM_2;i++) for(j=0;j<DIM_2;j++) r[i][j] = 0.0 ;

for(i=0;i<DIM_2;i++) r[i][i] = 1.0 ; r[0][0] = cos(theta) ;

r[1][1] = cos(theta) ; r[1][0] = sin(theta) ; r[0][1] = -sin(theta) ; return ;

}

1

(8)

Jan 8 2004 17:12

prog_11_2.c

Page 1

prog_11_2.c

/* $Id: prog_11_2.c,v 1.6 2004-01-08 17:09:12+09 naito Exp $ */

/* 2 D グ ラ ッ フ ィ ッ ク ス (multipage) */

#include <stdio.h>

#include <math.h>

#include "2d_objects.h"

#include "graphics.h"

void init_rotate_matrix(double [][DIM_2], double) ; void rotate(double [DIM_2], double [][DIM_2]) ; void scale_2d(polygon_2 *, double) ;

void move_2d(polygon_2 *, double, double) ;

#define ANGLE (2.0*(M_PI)/5.0) /* 回 転 角 */

int main(int argc, char **argv) {

polygon_2 poly_5 ;

double r[DIM_2][DIM_2] ; int i, j ;

int page=1, total_pages=2 ; char c ;

double center[DIM_2]={0.0, 0.0} ;

double x1=-150.0, y1 = -150.0, x2 = 150.0, y2 = 150.0 ; /* 正 5 角 形 の 設 定 */

init_rotate_matrix(r, ANGLE) ; /* 回 転 行 列 の 初 期 化 */

poly_5.pn = 5 ; /* 多 面 体 の 頂 点 数 を 設 定 */

poly_5.face_color = COLOR_CYAN ; /* 面 の 色 を 設 定 */

poly_5.segment_color = COLOR_BLUE ; /* 線 の 色 を 設 定 */

/* 各 点 の 座 標 の 設 定 */

for(i=0;i<poly_5.pn;i++) { poly_5.p[i][0] = 1.0 ; poly_5.p[i][1] = 0.0 ; } for(i=1;i<poly_5.pn;i++) for(j=0;j<i;j++) rotate(poly_5.p[i], r) ; scale_2d(&poly_5, 100.0) ; /* オ ブ ジ ェ ク ト の ス ケ ー ル を 変 更 */

ps_opengraphics_multipage(x1, y1, x2, y2, total_pages) ;/* ス ク リ ー ン と ス ケ ー ル の 設 定 */

ps_start_page(page++) ;

ps_draw_circle(center, 100.0, COLOR_RED) ; /* 円 の 描 画 */

ps_draw_polygon(&poly_5, WIRE) ; /* 描 画 */

ps_close_page() ;

ps_start_page(page++) ;

linewidth = 1.0 ; /* 線 の 太 さ の 変 更 */

ps_draw_polygon(&poly_5, WIRE|FACE) ; /* 描 画 */

for(i=0;i<poly_5.pn;i++) { /* 点 の 番 号 の 描 画 */

c = i + ’0’ ;

ps_write_point_number(poly_5.p[i], 10, c, COLOR_WHITE, COLOR_BLUE, COLOR_RED) ; }

ps_close_page() ;

ps_closegraphics_multipage() ; /* Graphics の 終 了 */

return 0 ; }

/*********************************************/

/* 多 角 形 p を scale 倍 す る */

void scale_2d(polygon_2 *p, double scale) {

int i, j ;

for(i=0;i<p->pn;i++)

for(j=0;j<DIM_2;j++) p->p[i][j] *= scale ; return ;

}

/* 多 角 形 p を (x,y) だ け 平 行 移 動 す る */

Jan 8 2004 17:12

prog_11_2.c

Page 2

prog_11_2.c

void move_2d(polygon_2 *p, double x, double y) {

int i ;

for(i=0;i<p->pn;i++) {

p->p[i][0] += x ; p->p[i][1] += y ; }

return ; }

/* 点 p に 一 次 変 換 r を 作 用 さ せ る */

void rotate(double p[DIM_2], double r[][DIM_2]) {

int i, j ; double t[DIM_2] ;

for(i=0;i<DIM_2;i++) { t[i] = 0.0 ;

for(j=0;j<DIM_2;j++) t[i] += r[i][j]*p[j] ; }

for(i=0;i<DIM_2;i++) p[i] = t[i] ; return ;

}

/* 2 D 回 転 行 列 の 設 定, 回 転 角 theta */

void init_rotate_matrix(double r[][DIM_2], double theta) {

int i, j ;

for(i=0;i<DIM_2;i++) for(j=0;j<DIM_2;j++) r[i][j] = 0.0 ;

for(i=0;i<DIM_2;i++) r[i][i] = 1.0 ; r[0][0] = cos(theta) ;

r[1][1] = cos(theta) ; r[1][0] = sin(theta) ; r[0][1] = -sin(theta) ; return ;

}

1

(9)

Jan 8 2004 17:12

prog_11_3.c

Page 1

prog_11_3.c

/* $Id: prog_11_3.c,v 1.3 2004-01-08 14:43:53+09 naito Exp naito $ */

/* 2 D グ ラ ッ フ ィ ッ ク ス ( 正 5 角 形 の 回 転 ) */

#include <stdio.h>

#include <math.h>

#include "2d_objects.h"

#include "graphics.h"

void init_rotate_matrix(double [][DIM_2], double) ; void rotate(double [DIM_2], double [][DIM_2]) ; void scale_2d(polygon_2 *, double) ;

void move_2d(polygon_2 *, double, double) ; #define PAGES (72)

#define ANGLE (2.0*(M_PI)/5.0) /* 回 転 角 */

#define ANGLE_2 (2.0*(M_PI)/(PAGES)) /* 1 ペ ー ジ の 回 転 角 */

int main(int argc, char **argv) {

polygon_2 poly_5 ;

double r[DIM_2][DIM_2] ; int i, j ;

int total_pages=PAGES+1 ;

double x1=-150.0, y1 = -150.0, x2 = 150.0, y2 = 150.0 ; char s[100] ;

/* 正 5 角 形 の 設 定 */

init_rotate_matrix(r, ANGLE) ; /* 回 転 行 列 の 初 期 化 */

poly_5.pn = 5 ; /* 多 面 体 の 頂 点 数 を 設 定 */

poly_5.face_color = COLOR_CYAN ; /* 面 の 色 を 設 定 */

poly_5.segment_color = COLOR_BLUE ; /* 線 の 色 を 設 定 */

/* 各 点 の 座 標 の 設 定 */

for(i=0;i<poly_5.pn;i++) { poly_5.p[i][0] = 1.0 ; poly_5.p[i][1] = 0.0 ; } for(i=1;i<poly_5.pn;i++) for(j=0;j<i;j++) rotate(poly_5.p[i], r) ; scale_2d(&poly_5, 100.0) ; /* オ ブ ジ ェ ク ト の ス ケ ー ル を 変 更 */

ps_opengraphics_multipage(x1, y1, x2, y2, total_pages) ;/* ス ク リ ー ン と ス ケ ー ル の 設 定 */

init_rotate_matrix(r, ANGLE_2) ; /* 回 転 行 列 の 初 期 化 */

for(i=0;i<=PAGES;i++) { ps_start_page(i+1) ;

sprintf(s,"angle=%03d", i*(int)(360.0/PAGES)) ; ps_write_string(-100, 130, 10, s) ;

poly_5.face_color.g = (double)i/PAGES ;

poly_5.face_color.r = 1.0 - poly_5.face_color.g ; ps_draw_polygon(&poly_5, FACE) ; /* 描 画 */

for(j=0;j<poly_5.pn;j++) rotate(poly_5.p[j], r) ; ps_close_page() ;

}

ps_closegraphics_multipage() ; /* Graphics の 終 了 */

return 0 ; }

/*********************************************/

/* 多 角 形 p を scale 倍 す る */

void scale_2d(polygon_2 *p, double scale) {

int i, j ;

for(i=0;i<p->pn;i++)

for(j=0;j<DIM_2;j++) p->p[i][j] *= scale ; return ;

}

/* 多 角 形 p を (x,y) だ け 平 行 移 動 す る */

Jan 8 2004 17:12

prog_11_3.c

Page 2

prog_11_3.c

void move_2d(polygon_2 *p, double x, double y) {

int i ;

for(i=0;i<p->pn;i++) {

p->p[i][0] += x ; p->p[i][1] += y ; }

return ; }

/* 点 p に 一 次 変 換 r を 作 用 さ せ る */

void rotate(double p[DIM_2], double r[][DIM_2]) {

int i, j ; double t[DIM_2] ;

for(i=0;i<DIM_2;i++) { t[i] = 0.0 ;

for(j=0;j<DIM_2;j++) t[i] += r[i][j]*p[j] ; }

for(i=0;i<DIM_2;i++) p[i] = t[i] ; return ;

}

/* 2 D 回 転 行 列 の 設 定, 回 転 角 theta */

void init_rotate_matrix(double r[][DIM_2], double theta) {

int i, j ;

for(i=0;i<DIM_2;i++) for(j=0;j<DIM_2;j++) r[i][j] = 0.0 ;

for(i=0;i<DIM_2;i++) r[i][i] = 1.0 ; r[0][0] = cos(theta) ;

r[1][1] = cos(theta) ; r[1][0] = sin(theta) ; r[0][1] = -sin(theta) ; return ;

}

1

(10)

Jan 14 2004 11:44

graphics.txt

Page 1

graphics.txt

○ Graphics Library の 仕 様.

$Id: graphics.txt,v 1.6 2004-01-08 14:29:26+09 naito Exp $ ● 定 義 済 み マ ク ロ

#define DIM_2 2 /* 次 元 */

#define PN 64 /* 頂 点 の 最 大 数 */

● 構 造 体 の 仕 様

/* 面 の 色 を あ ら わ す 構 造 体 */

struct color {

double r ; /* Red の 濃 度 0.0 -- 1.0 */

double g ; /* Green の 濃 度 0.0 -- 1.0 */

double b ; /* Blue の 濃 度 0.0 -- 1.0 */

} ;

typedef struct color color ;

/* 2 次 元 多 面 体 を あ ら わ す 構 造 体 */

struct polygon_2 {

double p[PN][DIM_2] ; /* 頂 点 の 座 標 */

int pn ; /* 頂 点 数 */

color face_color ; /* 多 面 体 の 色 */

color segment_color ; /* 多 面 体 の 境 界 色 */

} ;

typedef struct polygon_2 polygon_2 ; ● 定 義 済 み 大 域 変 数

color COLOR_BLACK ={0.0, 0.0, 0.0} ; /* 黒 */

color COLOR_WHITE ={1.0, 1.0, 1.0} ; /* 白 */

color COLOR_RED ={1.0, 0.0, 0.0} ; /* 赤 */

color COLOR_GREEN ={0.0, 1.0, 0.0} ; /* 緑 */

color COLOR_BLUE ={0.0, 0.0, 1.0} ; /* 青 */

color COLOR_MAGENTA={1.0, 0.0, 1.0} ; /* マ ゼ ン タ */

color COLOR_YELLOW ={1.0, 1.0, 0.0} ; /* 黄 */

color COLOR_CYAN ={0.0, 1.0, 1.0} ; /* シ ア ン */

double linewidth 線 の 太 さ. default 値 0.1 ● 関 数 の 仕 様

☆ グ ラ ッ フ ィ ッ ク ス 状 態 定 義 関 数 ( 単 一 ペ ー ジ 用 )

void ps_opengraphics(double x1, double y1, double x2, double y2) PostScript グ ラ ッ フ ィ ク ス の 初 期 化 を 行 い ま す.

描 画 領 域 は 左 下 隅 (x1, y1), 右 上 隅 (x2, y2) で 指 定 さ れ た 長 方 形 領 域 と な り ま す.

実 際 に は 以 下 の PS code を 出 力 し ま す.

--- %!PS-Adobe-2.0

%%BoundingBox: "cx+x1" "cy+y1" "cx+x2" "cy+y2"

%%EndComments "cx" "cy" translate

---

(cx, cy) は (x1, y1), (x2, y2) で 指 定 さ れ る 矩 形 領 域 を A 4 サ イ ズ の 中 心 点 に 平 行 移 動 し た 座 標 で す.

void ps_closegraphics(void)

PostScript グ ラ ッ フ ィ ク ス を 終 了 し ま す.

実 際 に は 以 下 の PS code を 出 力 し ま す.

---

Jan 14 2004 11:44

graphics.txt

Page 2

graphics.txt

showpage %%Trailer %%EOF

---

グ ラ ッ フ ィ ッ ク ス 状 態 定 義 関 数 ( 複 数 ペ ー ジ 用 )

void ps_opengraphics_multipage(double x1, double y1, double x2, double y2, int pages)

複 数 ペ ー ジ に わ た る PostScript グ ラ ッ フ ィ ク ス の 初 期 化 を 行 い ま す.

描 画 領 域 は 左 下 隅 (x1, y1), 右 上 隅 (x2, y2) で 指 定 さ れ た 長 方 形 領 域 と な り ま す.

pages に は 全 ペ ー ジ 数 を 指 定 し ま す.

実 際 に は 以 下 の PS code を 出 力 し ま す.

--- %!PS-Adobe-2.0

%%BoundingBox: "cx+x1" "cy+y1" "cx+x2" "cy+y2"

%%Pages: "pages"

%%EndComments

---

void ps_closegraphics_multipage(void) PostScript グ ラ ッ フ ィ ク ス を 終 了 し ま す.

実 際 に は 以 下 の PS code を 出 力 し ま す.

--- %%Trailer

%%EOF

---

void ps_start_page(int page)

PostScript グ ラ ッ フ ィ ッ ク ス の 新 し い ペ ー ジ を 生 成 し ま す.

描 画 領 域 の 左 下 隅 座 標 (x1, y1) と ペ ー ジ 番 号 page を 指 定 し ま す. 実 際 に は 以 下 の PS code を 出 力 し ま す.

--- %%Page: "page" "page"

"cx" "cy" translate

---

void ps_close_page(void)

PostScript グ ラ ッ フ ィ ッ ク ス の 一 つ の ペ ー ジ を 終 了 し ま す.

実 際 に は 以 下 の PS code を 出 力 し ま す.

--- showpage

%%PageTrailer

--- ☆ グ ラ ッ フ ィ ッ ク ス 描 画 関 数

void ps_draw_polygon(polygon_2 *p, int opt) ポ イ ン タ p で 示 さ れ る 平 面 多 角 形 を 描 画 し ま す.

opt は 内 部 の 塗 り 潰 し と 境 界 の 描 画 を 指 定 す る 値 で す.

境 界 線 の 太 さ は 大 域 変 数 linewidth で 指 定 さ れ て い る 値 を 用 い ま す. opt の 指 定 :

FACE: 内 部 の 塗 り 潰 し を 行 い ま す.

WIRE: 境 界 を 描 画 し ま す.

内 部 の 塗 り 潰 し を 行 い, 境 界 を 描 画 す る 場 合 に は, opt に FACE|WIRE を 指 定 し ま す. 実 際 に は 以 下 の PS code を 出 力 し ま す.

・ opt = FACE の 場 合

---

1

(11)

Jan 14 2004 11:44

graphics.txt

Page 3

graphics.txt

newpath

"linewidth setlinewidth "p->segment_color.r" "p->segment_color.g" "p->segment _color.r" setrgbcolor

"p->p[0][0]" "p->p[0][1]" moveto

"p->p[i][0]" "p->p[i][1]" lineto (i=1...pn-1 ま で の 繰 り 返 し ) closepath

"p.rgb.r" "p.rgb.g" "p.rgb.b" setrgbcolor fill stroke stroke

---

・ opt = WIRE の 場 合

--- newpath

"linewidth setlinewidth "p->segment_color.r" "p->segment_color.g" "p->segment _color.r" setrgbcolor

"p->p[0][0]" "p->p[0][1]" moveto

"p->p[i][0]" "p->p[i][1]" lineto (i=1...pn-1 ま で の 繰 り 返 し ) closepath

stroke

---

・ opt = FACE|WIRE の 場 合

--- newpath

"linewidth setlinewidth "p->segment_color.r" "p->segment_color.g" "p->segment _color.r" setrgbcolor

"p->p[0][0]" "p->p[0][1]" moveto

"p->p[i][0]" "p->p[i][1]" lineto (i=1...pn-1 ま で の 繰 り 返 し ) closepath

gsave

"p.rgb.r" "p.rgb.g" "p.rgb.b" setrgbcolor fill stroke grestore

stroke

--- ・ そ れ 以 外 の 場 合 は 何 も 出 力 し ま せ ん.

void ps_write_string(double x, double y, double size, char *s) 始 点 (x,y) か ら 文 字 列 s を 描 画 し ま す.

s は ASCII 文 字 に 限 り ま す.

文 字 の サ イ ズ は size ポ イ ン ト, 字 体 は Courier,

色 は 黒 で す.

実 際 に は 以 下 の PS code を 出 力 し ま す.

--- newpath 0 setgray

"x" "y" moveto

/Courier findfont "size" scalefont setfont ("s") show

---

void ps_write_point_number(double *p, double size, char c, color fore_color, color back_color, color boundary_color)

文 字 c を 中 心 位 置 p に 描 画 し, 丸 で 囲 み ま す.

p は 要 素 数 2, double 型 の 配 列 で す.

c は ASCII 文 字 に 限 り ま す.

描 画 色 は 以 下 の 通 り で す.

fore_color : 文 字 を 描 画 す る 色.

back_color : 文 字 の 背 景 色. boundary_color: 囲 み 線 の 色.

境 界 の 線 の 太 さ は 大 域 変 数 linewidth で 指 定 さ れ た 値 を 用 い ま す.

実 際 に は 以 下 の PS code を 出 力 し ま す.

---

Jan 14 2004 11:44

graphics.txt

Page 4

graphics.txt

newpath

"linewidth" setlinewidth ;

"boundary_color.r" "boundary_color.g" "boundary_color.b" setrgbcolor "p[0]+size" "p[1]" moveto

"p[0]" "p[1]" "size" 0 360 arc

gsave "back_color.r" "back_color.g" "back_color.b" setrgbcolor fill stroke gr estore

stroke newpath

"fore_color.r" "fore_color.g" "fore_color.b" setrgbcolor /Courier findfont "size" scalefont setfont

"p[0]" "p[1]" moveto

("c") dup stringwidth pop 2 div -1 mul dup exch rmoveto show stroke

---

void ps_draw_circle(double *p, double radius, color rgb) 中 心 点 p, 半 径 radius の 円 周 を 描 画 し ま す.

p は 要 素 数 2, double 型 の 配 列 で す.

境 界 の 線 の 太 さ は 大 域 変 数 linewidth で 指 定 さ れ た 値 を 用 い, そ の 色 は rgb で 指 定 さ れ た 色 を 用 い ま す.

実 際 に は 以 下 の PS code を 出 力 し ま す.

--- newpath

"linewidth" setlinewidth "rgb.r" "rgb.g" "rgb.b" setrgbcolor "p[0]+radius" "p[1]" moveto

"p[0]" "p[1]" "radius" 0 360 arc stroke

---

void ps_draw_line(double *s, double *e, color rgb) 始 点 s, 終 点 e と す る 線 分 を 描 画 し ま す.

s, e は 要 素 数 2, double 型 の 配 列 で す.

線 の 太 さ は 大 域 変 数 linewidth で 指 定 さ れ た 値 を 用 い, そ の 色 は rgb で 指 定 さ れ た 色 を 用 い ま す.

実 際 に は 以 下 の PS code を 出 力 し ま す.

--- newpath

"linewidth" setlinewidth "rgb.r" "rgb.g" "rgb.b" setrgbcolor "s[0]" "s[1]" moveto

"e[0]" "e[1]" lineto stroke

---

2

参照

関連したドキュメント

講義の目標.

前回パンダ基地を訪れた時と変わらず、パンダの可愛らしい姿、ありのままの姿に癒されまし

2(1)健康リスクの定義 ●中間とりまとめまでの議論 ・第

使用テキスト: Communication progressive du français – Niveau débutant (CLE international).

、コメント1点、あとは、期末の小 論文で 70 点とします(「全て持ち込 み可」の小論文式で、①最も印象に 残った講義の要約 10 点、②最も印象 に残った Q&amp;R 要約

[r]

※発電者名義(名義)は現在の発電者 名義と一致しなければ先の画面へ進ま

区分 授業科目の名称 講義等の内容 備考.. 文 化