예제 #1
0
void display(int pnum){
	int i, j, k;
	G_rgb(0,0,0);
  G_clear();
  G_clear(1,1,1);
// printf("enter disp\n");
for(i=0;i<numpolys[pnum];i++){
	double xtemp[poly_sizes[pnum][i]], ytemp[poly_sizes[pnum][i]];
	// printf("New display\n");
	for(j=0; j<poly_sizes[pnum][i];j++){
 		xtemp[j] = x[pnum][polygons[pnum][i][j]];
 		ytemp[j] = y[pnum][polygons[pnum][i][j]];
 		// printf("X = %lf Y = %lf \n",xtemp[j],ytemp[j] );
	}
	
 	G_rgb(colors[pnum][i][0],colors[pnum][i][1],colors[pnum][i][2]);
 	G_fill_polygon(xtemp, ytemp ,poly_sizes[pnum][i]);
 	}
 	double a[3][3], b[3][3];
 	D2d_make_identity(a);
 	D2d_make_identity(b);
 	D2d_translate(a, b, -WINDOW_WIDTH/2, -WINDOW_WIDTH/2);
 	D2d_rotate(a,b, ROTATE_SPEED);
 	D2d_translate(a, b, WINDOW_WIDTH/2, WINDOW_WIDTH/2);
 	D2d_mat_mult_points(x[pnum], y[pnum], a, x[pnum], y[pnum],numpoints[pnum]);

}
예제 #2
0
void display(int pnum){
	int i, j, k;
	G_rgb(0,0,0);
  G_clear();
  G_clear(1,1,1);
// printf("enter disp\n");
for(i=0;i<numpolys[pnum];i++){
	double xtemp[1000], ytemp[1000];
	// printf("New display\n");
	for(j=0; j<poly_sizes[pnum][i];j++){
 		xtemp[j] = x[pnum][polygons[pnum][i][j]];
 		ytemp[j] = y[pnum][polygons[pnum][i][j]];
 		// printf("X = %lf Y = %lf \n",xtemp[j],ytemp[j] );
	}
	int tsize = clip(xtemp,ytemp,poly_sizes[pnum][i]);
 	G_rgb(colors[pnum][i][0],colors[pnum][i][1],colors[pnum][i][2]);
 	G_fill_polygon(xtemp, ytemp ,tsize);
 	}
 	double a[3][3], b[3][3];
 	D2d_make_identity(a);
 	D2d_make_identity(b);
 	D2d_translate(a, b, -WINDOW_WIDTH/2, -WINDOW_WIDTH/2);
 	D2d_rotate(a,b, ROTATE_SPEED);
 	D2d_translate(a, b, WINDOW_WIDTH/2, WINDOW_WIDTH/2);
 	
 	D2d_mat_mult_points(x[pnum], y[pnum], a, x[pnum], y[pnum],numpoints[pnum]);

for(i=0; i<cSize;i++){//show clipping box
	G_rgb(255,255,255);
	G_line(cx[i], cy[i], cx[(i+1)%cSize], cy[(i+1)%cSize]);
}

}
예제 #3
0
int D2d_rotate (double a[3][3], double b[3][3], double radians){
  double rotate[3][3], r2[3][3] ;
  D2d_make_identity(rotate);
  D2d_make_identity(r2);
  rotate[0][0] = cos(radians);
  rotate[0][1] = -sin(radians);
  rotate[1][0] = sin(radians);
  rotate[1][1] = cos(radians);
  D2d_mat_mult(a, rotate, a);
  r2[0][0] = cos(-radians);
  r2[0][1] = -sin(-radians);
  r2[1][0] = sin(-radians);
  r2[1][1] = cos(-radians);
    D2d_mat_mult(b,b,r2 );
  return 1;
}
예제 #4
0
int D2d_negate_y (double a[3][3], double b[3][3]){
   double neg[3][3] ;
  D2d_make_identity(neg);
  neg[1][1]=-1;
  D2d_mat_mult(a,neg,a);
  D2d_mat_mult(b,b, neg);
return 1;
}
예제 #5
0
void scaleNfit(int argc){
int i,j;
double scale[3][3] ,iscale[3][3];
for(i=0; i<argc-1;i++){
	double xmax, xmin, ymax, ymin, xrad, yrad, xcenter, ycenter;
			xmin = x[i][0];
			xmax = x[i][0];
			ymin = y[i][0];
			ymax = y[i][0];
	for(j = 0; j<numpoints[i];j++){
		if(x[i][j] < xmin){
			xmin = x[i][j];
		}
		if(x[i][j] > xmax){
			xmax = x[i][j];
		}
		if(y[i][j] < ymin){
			ymin = y[i][j];
		}
		if(y[i][j] > ymax){
			ymax = y[i][j];
		}
	}
	xrad = (xmax - xmin)/2;
	 // printf("xmax = %lf xmin = %lf \n",xmax, xmin );
	yrad = (ymax - ymin)/2;
	 // printf("ymax = %lf ymin = %lf \n",ymax, ymin );
	xcenter = xmax - xrad;
	ycenter = ymax - yrad;
	// printf("Xcenter = %lf Ycenter = %lf \n", xcenter, ycenter);
	double s;
	if(xrad > yrad){
		s = xrad;
	}else{
		s=yrad;
	}
	s = (WINDOW_WIDTH/2)/s;
	D2d_make_identity(scale);
	D2d_make_identity(iscale);
	D2d_translate(scale, iscale, -xcenter, -ycenter);
	D2d_scale(scale, iscale,s,s);
	D2d_translate(scale, iscale, WINDOW_WIDTH/2, WINDOW_WIDTH/2);
	D2d_mat_mult_points(x[i],y[i],scale,x[i],y[i], numpoints[i]);
}
}
예제 #6
0
int D2d_scale (double a[3][3], double b[3][3], double sx, double sy){
  double scale[3][3] ;
  D2d_make_identity(scale);
  scale[0][0] = sx;
  scale[1][1] = sy;
  D2d_mat_mult(a, scale, a);
  scale[0][0] = 1/sx;
  scale[1][1] = 1/sy;
  D2d_mat_mult(b, b, scale);
return 1;
}
예제 #7
0
int D2d_negate_y(double a[3][3], double b[3][3]){

  double t[3][3];
  D2d_make_identity(t);
  t[1][1] = -1;

  D2d_mat_mult(a, t,a);
  D2d_mat_mult(b, b,t);

  return 1;
  
}
예제 #8
0
int D2d_scale(double a[3][3], double b[3][3], double sx, double sy){

  double t[3][3];

  D2d_make_identity(t);

  t[0][0] = sx; t[1][1] = sy;
  D2d_mat_mult(a,  t,a);

  t[0][0] = 1/sx; t[1][1] = 1/sy;
  D2d_mat_mult(b,  b,t);
  
  return 1;
}
예제 #9
0
int main()
{

  G_init_graphics(600,600) ;

  G_rgb(0,0,0) ;
  G_clear() ;

  G_rgb(0,0,1) ;
  G_fill_polygon(jx,jy,5) ;
  G_wait_key();
  double rot45[3][3];
  double useless[3][3];
  D2d_make_identity(rot45);
  D2d_rotate(rot45, useless, M_PI/4.0);
  D2d_mat_mult_points(jx, jy, rot45, jx, jy, 5);
  G_fill_polygon(jx, jy, 5);
  double upandover[3][3];
  D2d_make_identity(upandover);
  D2d_translate(upandover, useless, 1, 1);
  int count = 0;
  while (G_wait_key()) {
    count = (count+1)%200;

    D2d_mat_mult_points(jx, jy, upandover, jx, jy, 5);
    G_rgb(0, 0, 0);
    G_clear();
    G_rgb(0, 0, 1);
    if (count < 100) {
        G_fill_polygon(jx, jy, 5);
    } else {
        G_fill_polygon(jy, jx, 5);
    }
    G_rgb(1, 0, 0);
    G_line(0, 0, 600, 600);
  }
}
예제 #10
0
int D2d_translate (double a[3][3], double b[3][3], double dx, double dy)
// a = translation*a  
// b = b*translation_inverse  
{
  double t[3][3] ;

  D2d_make_identity(t) ;

  t[0][2] =  dx ;  t[1][2] = dy ;  
  D2d_mat_mult(a,  t,a) ;

  t[0][2] = -dx ;  t[1][2] = -dy ;
  D2d_mat_mult(b,  b,t) ;

  return 1 ;
}
예제 #11
0
int main(int argc, char **argv){
  char t;
  int i;
  int j, k;
  double minx[10], miny[10], maxx[10], maxy[10];
  
  
  FILE *f;
  
  int numObjects = argc-1;
  
  for(thisObj=0; thisObj < numObjects; thisObj++){
    
    f=fopen(argv[thisObj+1], "r");
    if(f==NULL){
      printf("Can't open file"); exit(1);
    }
    
 
    fscanf(f, "%d", &numPoints[thisObj]);
    
    
    
    for(i=0;i<numPoints[thisObj];i++){
      
      fscanf(f, "%lf %lf", &xp[thisObj][i], &yp[thisObj][i]);
      
    }
    
    
    
    fscanf(f, "%d", &numPolygons[thisObj]);
    
    
    
    
    for(i=0;i<numPolygons[thisObj];i++){
      
      fscanf(f, "%d", &shapes[thisObj][i][0]);
      
      for(j=1;j<=shapes[thisObj][i][0];j++){
	fscanf(f, "%d", &shapes[thisObj][i][j]);
	
      }
      
    }
    
    for(i=0;i<numPolygons[thisObj]; i++){
      
      fscanf(f, "%lf %lf %lf", &r[thisObj][i], &g[thisObj][i], &b[thisObj][i]);
      
    }
 

    //printf("heelo01\n") ;
   
    minx[thisObj] = xp[thisObj][0], miny[thisObj] = yp[thisObj][0],maxx[thisObj] = xp[thisObj][0], maxy[thisObj] = yp[thisObj][0];
    //find min x
    for(i=0;i<numPoints[thisObj]; i++){
      
      if(xp[thisObj][i]<minx[thisObj]){minx[thisObj] = xp[thisObj][i];}
      if(xp[thisObj][i]>maxx[thisObj]){maxx[thisObj] = xp[thisObj][i];}
      if(yp[thisObj][i]<miny[thisObj]){miny[thisObj] = yp[thisObj][i];}
      if(yp[thisObj][i]>maxy[thisObj]){maxy[thisObj] = yp[thisObj][i];}
    }
    
    
    
    vertc[thisObj] = (maxy[thisObj] + miny[thisObj])/2;
    horzc[thisObj] = (maxx[thisObj] + minx[thisObj])/2;
    

    double sf ; 
    if(maxy[thisObj]-miny[thisObj]>maxx[thisObj]-minx[thisObj]){
       sf = 550/(maxy[thisObj]-miny[thisObj]) ;
    }else {
       sf = 550/(maxx[thisObj]-minx[thisObj]) ;
    }


    D2d_make_identity(m);
    D2d_make_identity(minv);
    D2d_translate(m,minv, -horzc[thisObj],-vertc[thisObj]); 
    D2d_scale(m,minv, sf,sf) ;
    D2d_translate(m,minv, 300,300) ;
    D2d_mat_mult_points( xp[thisObj],yp[thisObj], 
                         m, 
                         xp[thisObj],yp[thisObj],numPoints[thisObj]) ;

    horzc[thisObj]=300; vertc[thisObj] = 300;

  } // end for thisObj



  thisObj = 0;
 

  G_init_graphics(600,600);
 
  redraw();
  
  buildClipWindow();
  
  redraw();

  D2d_make_identity(m);
  D2d_make_identity(minv);
  D2d_translate(m,minv, -300,-300) ;  
  D2d_rotate(m,minv, 3*M_PI/180) ;
  D2d_translate(m,minv,  300, 300) ;  

  while(1){

    t = G_wait_key();

    if(t>='0' && t<='9'){
      thisObj = t-'0';
    }


    D2d_mat_mult_points(xp[thisObj], yp[thisObj],
                        m, 
                        xp[thisObj], yp[thisObj], numPoints[thisObj]);

    redraw();

  }

}