Exemplo n.º 1
0
void Graph::halfTone(Color color){
 int megaPixel = 3;
 Vector v;
 Color tmp;
 int numberOfPixels; 
 //backup before doing half-toning
 backupPixelBuffer();
 for(int r = 0 ; r < window_height; r+=megaPixel){  //row
   for(int c = 0 ; c < window_width;  c+=megaPixel){//col
     v = {0,0,0}; 
     for(int i = r; i < r+megaPixel ; i++){ // 3 by 3 
       for(int j = c; j < c+megaPixel; j++ ){ 
         //DPRINT("r %d, c %d, i %d, j %d\n", r, c, i,j);
         tmp = readPixel(j,i);
         if( equal(tmp, background_color) )
          v = add( v, {1, 1, 1} ); 
         else 
          v = add( v,  ctov( tmp ) );
       }
     }
     //write each mega pixel
     numberOfPixels = round( 9- (v.x + v.y + v.z) / 3 );
     drawMegaPixel(numberOfPixels, megaPixel * 3, r, c, color);
   }
 }
}
Exemplo n.º 2
0
void calculate_intensity(struct vector *c,
			 struct constants *k,
			 color ambient,
			 struct light *light,
			 struct vector *p,
			 struct vector *n,
			 struct vector *v) {
  /* I = Ke + Ia Ka + Ip Kd (->L * ->N) + Ip Ks [(2->N(->L * ->N)- ->L) * ->V] */
  double dotd, dots;
  struct vector l, tmp;

  l = *p;
  subtract_vectors(&l, &light->l);
  normalize(&l);

  dotd = dot(&l, n);
  if (dotd < 0) {
    dotd = dots = 0;
    goto add_terms;
  }
    
  tmp = *n;
  scalar_mult(2 * dotd, &tmp);
  subtract_vectors(&tmp, &l);
  dots = dot(&tmp, v);
  if (dots < 0)
    dots = 0;

 add_terms:
  ctov(c, k->e);

  ctov(&tmp, ambient);
  tmp.x *= k->r[Ka];
  tmp.y *= k->g[Ka];
  tmp.z *= k->b[Ka];
  add_vectors(c, &tmp);

  ctov(&tmp, light->c);
  tmp.x *= k->r[Kd] * dotd + k->r[Ks] * dots;
  tmp.y *= k->g[Kd] * dotd + k->g[Kd] * dots;
  tmp.z *= k->b[Kd] * dotd + k->b[Ks] * dots;
  add_vectors(c, &tmp);
}