2003年度・数理解析・計算機数学2・第11回1
● 前回の講義のまとめ
● 講義資料
★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
Jan 8 2004 17:12
2d_objects.h
Page 12d_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
Jan 8 2004 17:12
Makefile
Page 1Makefile
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
Jan 8 2004 17:12
graphics.c
Page 1graphics.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 2graphics.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
Jan 8 2004 17:12
graphics.c
Page 3graphics.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
Jan 8 2004 17:12
graphics.h
Page 1graphics.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
Jan 8 2004 17:12
prog_11_1.c
Page 1prog_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 2prog_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
Jan 8 2004 17:12
prog_11_2.c
Page 1prog_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 2prog_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
Jan 8 2004 17:12
prog_11_3.c
Page 1prog_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 2prog_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
Jan 14 2004 11:44
graphics.txt
Page 1graphics.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 2graphics.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
Jan 14 2004 11:44
graphics.txt
Page 3graphics.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 4graphics.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