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