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;
 }