2001年4月21日 分割して作成
関谷トップページへ
CG2001 トップページへ
ka_cae57.c 河西、例題57 2次元座標変換(対称移動) [viewにより3つの枠に表示]
/* ka_cae57.c 例題57 2次元座標変換(対称移動) [viewにより3つの枠に表示]
河西、C言語によるはじめてのアルゴリズム入門、 p.361-3 1998.3.27, 2001.4.22 Date sekiya */
#include <stdlib.h> /* EXIT_SUCCESS */
#include "gint.f" /* グラフィックス初期化関数 gint,gend */
#include "basescrn.f" /* 基本画面設定関数 base_screen */
#include "line.f" /* 直線関数 */
#include "gcls.f" /* 消去関数 */
#include "symbol.f" /* 文字関数 */
#include "Glibwv.h" /* タートル関数Glibwv.h(河西) */
#include "rectfxor.f" /* 長方形塗りつぶし関数 */
#include <time.h>
void draw(double *dat, int c); // draw lines
void mirror(int flag, double m, double *dat); // 対称移動
main(int argc,char *argv[])
{
static double anxy[]={ 11., 0.,80., 5.,75., 17.,80.
,20.,60., 15.,55.,0.,55., 0.,20., 10.,40., 20.,40.,
10.,20., 1.,20. };
double a[40], xm=0.0, ym=15.0;
int i, j, imax=3, vxl=0, vxr=200, vxd=200, ndata;
char *pa; /* *pa:日付用文字列(ポインタ変数)*/
long nowtime;
time(&nowtime);
pa = ctime(&nowtime);
*(pa+24)='\0';
printf("<%s>\n", pa); /* 実行年月日などをコマンドプロンプトに表示する。 */
ndata = 22; // 2*(int)anxy[0];
printf("Ctrl+Cで終ります。\n");
if(argc==1)
{ /* 引数なし(標準) */
gint(640,400); /* グラフィックス初期化(640x400dot) */
}
else
{ /* 引数あり(拡大) */
gint(1000,625); /* グラフィックス初期化(1000x625dot) */
base_screen(640,400); /* 基本画面設定 */
}
gcls();
window(-50, -100, 50, 100);
symbol(20,20,"<河西、対称移動(c言語によるはじめてのアルゴリズム入門、",7,1,1);
symbol(20,40,"例題57、pp.361-363> by 関谷",7,1,1);
symbol(350, 40, pa, 7,1.,1.0);
for(i=0; i<3; i++){
view(vxl,370+33*i, vxr,40); // ビューポートの設定
printf("xm:%5.1f, ym:%5.1f\n", xm, ym);
for(j=0; j<=ndata; j++)
a[j] = anxy[j];
draw(a, 6); // まず、1象限に、黄色で描く
mirror(1, xm, a); draw(a, 5); // y axiss対称で、水色で描く
mirror(0, ym, a); draw(a, 4); // x axiss対称で、緑色で描く
mirror(1, xm, a); draw(a, 3); // y axiss対称で、紫色で描く
// 対称軸 y axiss plot
setpoint(xm, ym);
moveto(xm, 85.0, 6);
symbol(Cpx(), Cpy(), "対称Y'軸",6,1,1);
// 対称軸 x axiss plot
setpoint(xm, ym);
moveto(xm+30.0, ym, 6);
symbol(Cpx(), Cpy(), "対称X'軸",6,1,1);
// view を描く
wvline(-49,-99,-49,99,1); // blue left line
wvline(-49, 99, 49,99,2); // red uper line
wvline( 49, 99, 49,-99,3); // purple right line
wvline( 49,-99,-49,-99,4); // green lower line
vxl += vxd; vxr += vxd;
xm -= 5.0;
ym -= 5.0;
}
rectfillXOR(0,0,639,399,7);
gend(); /* グラフィックス終了 */
return EXIT_SUCCESS;
} /* main */
void mirror(int flag, double m, double *dat) // 対称移動
{
int i;
for (i=1; i<=2*dat[0]; i +=2) { // dat[0]: data 数
if (flag == 1) // y axiss center
dat[i]= 2*m - dat[i];
if (flag == 0) // x axis center
dat[i+1]= 2*m - dat[i+1];
}
}
void draw(double *dat, int c) // draw lines
{
int i, np = 2*dat[0] ;
setpoint(dat[1], dat[2]); // start point
for (i=3; i<=np; i +=2)
moveto(dat[i], dat[i+1], c);
}