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