Guest User

draw.c -- doesn't work

a guest
Jan 6th, 2016
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.84 KB | None | 0 0
  1.  
  2. /**
  3.     [2016-01-04] Challenge #248 [Easy] Draw Me Like One Of Your Bitmaps
  4.     https://redd.it/3zfajl
  5.  
  6.     drawing canvas limited to within 1024x1024, basic challenge accepted.
  7.     try to read line of text (also limited to ~1Kb) and use sscanf().
  8. **/
  9.  
  10. #include <stdio.h>
  11.  
  12. typedef int pix_t;
  13. pix_t rgb(int r, int g, int b) { return 256*256*r + 256*g + b; }
  14.  
  15. int W, H;
  16. pix_t pixels[1024*1024], *canvas[1024];
  17.  
  18. void draw_canvas() {
  19.     int i, j, p, r, g, b, sep;
  20.     printf("P3\n%d %d\n255\n", H, W);
  21.     for(j = 0; j < H; j++) {
  22.         for(i = 0; i < W; i++) {
  23.             sep = (i < W-1) ? '\t' : '\n';
  24.             p = canvas[i][j];
  25.             b = p % 256; p /= 256;
  26.             g = p % 256; p /= 256;
  27.             r = p % 256;
  28.             printf("%d %d %d%c", r, g, b, sep);
  29.         }
  30.     }
  31.     return;
  32. }
  33.  
  34. int resize(int h, int w) {
  35.     int i;
  36.     if(h <= 0 || w <= 0) return 0;
  37.     if(h >= 1024 || w >= 1024) return 0;
  38.     W = w; H = h;
  39.     i = 1024; while(i--) canvas[i] = NULL;
  40.     for(i = 0; i < w; i++) canvas[i] = (pixels + i*H);
  41.     for(i = 0; i < 1024*1024; i++) pixels[i] = 0x000000;
  42.     return;
  43. }
  44.  
  45. int oncanvas(int x, int y) { return (0 <= x && 0 <= y && x < W && y < H); }
  46.  
  47. void draw_point(int x, int y, int r, int g, int b) {
  48.     pix_t p = rgb(r, g, b);
  49.     if(oncanvas(x, y)) canvas[x][y] = p;
  50.     return;
  51. }
  52.  
  53. void draw_line(int x, int y, int xx, int yy, int r, int g, int b) {
  54.     double mx, my;
  55.     int dx, dy, max, t;
  56.     pix_t p = rgb(r, g, b);
  57.     dx = (xx-x >= 0) ? xx-x : x-xx;
  58.     dy = (yy-y >= 0) ? yy-y : y-yy;
  59.     max = dx + dy + 1;
  60.     for(t = 0; t <= max; t++) {
  61.         mx = (double)t*x + (double)(max-t)*xx; mx /= max;
  62.         my = (double)t*y + (double)(max-t)*yy; my /= max;
  63.         if(oncanvas((int)mx, (int)my)) canvas[(int)mx][(int)my] = p;
  64.     }
  65.     return;
  66. }
  67.  
  68. void draw_rect(int x, int y, int xx, int yy, int r, int g, int b) {
  69.     int i, j, swp;
  70.     pix_t p = rgb(r, g, b);
  71.     if(xx < x) { swp = xx; xx = x; x = swp; }
  72.     if(yy < y) { swp = yy; yy = y; y = swp; }
  73.     for(i = x; i <= xx; i++) for(j = y; j <= yy; j++) {
  74.         if(oncanvas(i, j)) canvas[i][j] = p;
  75.     }
  76.     return;
  77. }
  78.  
  79. int main(int argc, char *argv[]) {
  80.     char buffer[1024];
  81.     int sf, x, xx, y, yy, r, g, b;
  82.  
  83.     fgets(buffer, 1024-1, stdin);
  84.     sf = sscanf(buffer, "%d %d", &y, &x); if(sf != 2) return 1;
  85.     resize(x, y);
  86.  
  87.     while(!feof(stdin)) {
  88.         fgets(buffer, 1024-1, stdin);
  89.         sf = sscanf(buffer, "point %d %d %d %d %d", &r, &g, &b, &x, &y); if(sf == 5) draw_point(x, y, r, g, b);
  90.         sf = sscanf(buffer, "line %d %d %d %d %d %d %d", &r, &g, &b, &x, &y, &xx, &yy); if(sf == 7) draw_line(y,x,yy,xx,r,g,b);
  91.         sf = sscanf(buffer, "rect %d %d %d %d %d %d %d", &r, &g, &b, &x, &y, &xx, &yy); if(sf == 7) draw_rect(y,x,yy,xx,r,g,b);
  92.     }
  93.  
  94.     draw_canvas();
  95.     return 0;
  96. }
Add Comment
Please, Sign In to add comment