Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- [2016-01-04] Challenge #248 [Easy] Draw Me Like One Of Your Bitmaps
- https://redd.it/3zfajl
- drawing canvas limited to within 1024x1024, basic challenge accepted.
- try to read line of text (also limited to ~1Kb) and use sscanf().
- **/
- #include <stdio.h>
- typedef int pix_t;
- pix_t rgb(int r, int g, int b) { return 256*256*r + 256*g + b; }
- int W, H;
- pix_t pixels[1024*1024], *canvas[1024];
- void draw_canvas() {
- int i, j, p, r, g, b, sep;
- printf("P3\n%d %d\n255\n", H, W);
- for(j = 0; j < H; j++) {
- for(i = 0; i < W; i++) {
- sep = (i < W-1) ? '\t' : '\n';
- p = canvas[i][j];
- b = p % 256; p /= 256;
- g = p % 256; p /= 256;
- r = p % 256;
- printf("%d %d %d%c", r, g, b, sep);
- }
- }
- return;
- }
- int resize(int h, int w) {
- int i;
- if(h <= 0 || w <= 0) return 0;
- if(h >= 1024 || w >= 1024) return 0;
- W = w; H = h;
- i = 1024; while(i--) canvas[i] = NULL;
- for(i = 0; i < w; i++) canvas[i] = (pixels + i*H);
- for(i = 0; i < 1024*1024; i++) pixels[i] = 0x000000;
- return;
- }
- int oncanvas(int x, int y) { return (0 <= x && 0 <= y && x < W && y < H); }
- void draw_point(int x, int y, int r, int g, int b) {
- pix_t p = rgb(r, g, b);
- if(oncanvas(x, y)) canvas[x][y] = p;
- return;
- }
- void draw_line(int x, int y, int xx, int yy, int r, int g, int b) {
- double mx, my;
- int dx, dy, max, t;
- pix_t p = rgb(r, g, b);
- dx = (xx-x >= 0) ? xx-x : x-xx;
- dy = (yy-y >= 0) ? yy-y : y-yy;
- max = dx + dy + 1;
- for(t = 0; t <= max; t++) {
- mx = (double)t*x + (double)(max-t)*xx; mx /= max;
- my = (double)t*y + (double)(max-t)*yy; my /= max;
- if(oncanvas((int)mx, (int)my)) canvas[(int)mx][(int)my] = p;
- }
- return;
- }
- void draw_rect(int x, int y, int xx, int yy, int r, int g, int b) {
- int i, j, swp;
- pix_t p = rgb(r, g, b);
- if(xx < x) { swp = xx; xx = x; x = swp; }
- if(yy < y) { swp = yy; yy = y; y = swp; }
- for(i = x; i <= xx; i++) for(j = y; j <= yy; j++) {
- if(oncanvas(i, j)) canvas[i][j] = p;
- }
- return;
- }
- int main(int argc, char *argv[]) {
- char buffer[1024];
- int sf, x, xx, y, yy, r, g, b;
- fgets(buffer, 1024-1, stdin);
- sf = sscanf(buffer, "%d %d", &y, &x); if(sf != 2) return 1;
- resize(x, y);
- while(!feof(stdin)) {
- fgets(buffer, 1024-1, stdin);
- sf = sscanf(buffer, "point %d %d %d %d %d", &r, &g, &b, &x, &y); if(sf == 5) draw_point(x, y, r, g, b);
- 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);
- 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);
- }
- draw_canvas();
- return 0;
- }
Add Comment
Please, Sign In to add comment