2001年4月21日 分割して作成
関谷トップページへ
CG2001 トップページへ
ka_cap57.c 練習問題57 2次元座標変換(拡大、回転)
/* ka_cap57.c 2次元座標変換 p.364-5 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 "rectfxor.f" /* 長方形塗りつぶし関数 */
#include "Glibwv.h" /* タートル関数Glibwv.h(河西) */
#include <time.h>
void multi(double fx, double fy, double *x, double *y); // change size
void rotate(double angle, double *x, double *y); // 回転移動
main(int argc,char *argv[])
{
static double xo[]={ 0., 100.,100., 0., 0.},
yo[]={ 0., 0.,200., 200., 0.};
double x[5], y[5], fx=0.6, fy =0.6, angle= 15.0;
int i, j, k, imax=3, vxl=0, vxr=200, vxd=200, n=5;
char *pa; /* *pa:日付用文字列(ポインタ変数)*/
long nowtime;
time(&nowtime);
pa = ctime(&nowtime);
*(pa+24)='\0';
printf("<%s>\n", pa); /* 実行年月日などをコマンドプロンプトに表示する。 */
printf("Ctrl+Cで終ります。\n");
if(argc==1)
{ /* 引数なし(標準) */
gint(640,400); /* グラフィックス初期化(640x400dot) */
}
else
{ /* 引数あり(拡大) */
gint(1000,625); /* グラフィックス初期化(1000x625dot) */
base_screen(640,400); /* 基本画面設定 */
}
gcls();
window(- 70, -280, 130, 120);
symbol(20,20,"<河西、回転移動(c言語によるはじめてのアルゴリズム入門、",7,1,1);
symbol(20,40,"練習問題57、pp.364-365> by 関谷",7,1,1);
symbol(350, 40, pa, 7,1.,1.0);
for(i=0; i<3; i++){
view(vxl,0, vxr,400); // ビューポートの設定
printf("angle:%5.0f, fx:%5.1f, fy:%5.1f\n", angle, fx, fy);
for(j=0; j<n; j++) {
x[j] = xo[j]; y[j] =yo[j];
if (j==0)
setpoint(x[j],-y[j]);
else
moveto(x[j],-y[j], 6);
}
for(j=0; j<12; j++) {
for(k=0; k<n; k++) {
}
for(k=0; k<n; k++) {
multi(fx, fy, &x[k], &y[k]); // x,y座標値の拡大・縮小
rotate(angle, &x[k], &y[k]); // x,y座標値の回転
if (k==0)
setpoint(x[k],-y[k]);
else
moveto(x[k],-y[k], 7);
}
}
// y axiss plot
setpoint(0., 0.);
moveto(0, -220.0, 6);
symbol(Cpx(), Cpy(), "Y'軸",6,1,1);
// x axiss plot
setpoint(0., 0.);
moveto(110.0, 0.0 , 6);
symbol(Cpx(), Cpy(), "X'軸",6,1,1);
vxl += vxd; vxr += vxd;
angle += 15.0;
fx += 0.10; fy += 0.10;
}
rectfillXOR(0,0,639,399,7);
gend(); /* グラフィックス終了 */
return EXIT_SUCCESS;
} /* main */
void multi(double fx, double fy, double *x, double *y) // change size
{
*x = fx *(*x);
*y = fy *(*y);
}
void rotate(double deg, double *x, double *y) // 回転移動
{
double dx, dy, rd=3.14159/180;
deg *= rd;
dx = (*x)*cos(deg) - (*y)*sin(deg);
dy = (*x)*sin(deg) + (*y)*cos(deg);
*x = dx; *y = dy;
}