コード例 #1
0
ファイル: raytracer.c プロジェクト: barug/Epitech
 int		raytracer(t_imgdata *imgdata, t_pov *pov,
			  t_object *objects, t_coordinate *lightsource)
{
  t_pixel	pixel;
  int		color;

  pixel.x = 0;
  pixel.y = 0;
  while (pixel.y < WIN_HEIGHT)
    {
      while (pixel.x < WIN_WIDTH)
	{
	  color = calculate_pixel(pov, &pixel, objects, lightsource);
	  my_pixel_put_to_image(imgdata, pixel.x, pixel.y, color);
	  pixel.x++;
	}
      pixel.x = 0;
      pixel.y++;
    }
  return (0);
}
コード例 #2
0
ファイル: cluster_server.c プロジェクト: catuss-a/raytracer
void			*server_work(void *arg)
{
  t_rt			*rt;
  int			pixel[WIDTH];
  int			y;
  int			x;

  rt = (t_rt *)arg;
  while (42)
    {
      if ((y = ++line - 1) >= HEIGHT)
	pthread_exit(NULL);
      my_printf(" %d% \r", ((y + 1) * 100) / HEIGHT);
      x = -1;
      while (++x < WIDTH)
	{
	  calculate_pixel(rt, x, y, pixel);
	  put_pixel_in_img(rt->mlx, x, y, pixel[x]);
	}
    }
}
コード例 #3
0
ファイル: mandel_dd_aa.c プロジェクト: josch/mandelbrot
int main(int argc, char **argv) {
    if (argc != 6) {
        fprintf(stderr, "usage: %s width height centerx centery magnification", argv[0]);
        return 1;
    }
    DoubleDouble temp1;
    unsigned int width = atoi(argv[1]);
    unsigned int height = atoi(argv[2]);
    unsigned char* tmpimage = malloc(width*height*3);
    unsigned char* finalimage = malloc(width*height*3);
    unsigned int x, y;
    DoubleDouble centerx, centery;
    centerx = dd_new(-0.7436438870371587, -3.628952515063387E-17);
    centery = dd_new(0.13182590420531198, -1.2892807754956678E-17);
    logLogBailout = log(log(bailout));
    DoubleDouble magn = dd_new(strtod(argv[5], NULL), 0);
    /*// maxiter = width * sqrt(magn);
    temp1 = dd_sqrt(magn);
    unsigned long maxiter = width * dd_get_ui(temp1);*/
    // x0d = 4 / magn / width;
    x0d = dd_ui_div(4, magn);
    x0d = dd_div_ui(x0d, width);
    // x2 = -2 / magn + centerx;
    x2 = dd_si_div(-2, magn);
    x2 = dd_add(x2, centerx);
    // y1d = -4 / magn / width;
    y1d = dd_si_div(-4, magn);
    y1d = dd_div_ui(y1d, width);
    // y2 = 2 / magn * height / width + centery;
    y2 = dd_ui_div(2, magn);
    temp1 = dd_new(height, 0);
    temp1 = dd_div_ui(temp1, width);
    y2 = dd_mul(y2, temp1);
    y2 = dd_add(y2, centery);
    unsigned int idx;
    unsigned int imgidx = 0;
    unsigned long lastit;
    double zxd, zyd;
    bool inside;
    for (y = 0; y < height; y++) {
        for (x = 0; x < width; x++) {
            fprintf(stderr, "\rR: %f %%", (float)imgidx/(width*height*3)*100);
            calculate_pixel(x, y, &lastit, &zxd, &zyd, &inside);

            if (inside) {
                tmpimage[imgidx++] = 0;
                tmpimage[imgidx++] = 0;
                tmpimage[imgidx++] = 0;
            } else {
                idx = getcoloridx(lastit, zxd, zyd);
                tmpimage[imgidx++] = colors[idx][0];
                tmpimage[imgidx++] = colors[idx][1];
                tmpimage[imgidx++] = colors[idx][2];
            }
        }
    }

    imgidx = 0;
    int finalidx = 0;
    int aafactor = 5;
    int aareach = aafactor / 2;
    int aaarea = aafactor * aafactor;
    double aafactorinv = 1.0/aafactor;
    int xi, yi;
    unsigned int val1, val2, val3;
    double dx, dy;
    for (y = 0; y < height; y++) {
        for (x = 0; x < width; x++) {
            fprintf(stderr, "\rAA: %f %%", (float)imgidx/(width*height*3)*100);
            val1 = tmpimage[imgidx++];
            val2 = tmpimage[imgidx++];
            val3 = tmpimage[imgidx++];
            // if pixel is neither at the border nor are its four neighbors
            // different, copy value and continue without antialiasing it
            if (x != 0 && y != 0 && x != width -1 && y != height -1
             && tmpimage[(y+1)*width*3+x*3+0] == val1
             && tmpimage[(y+1)*width*3+x*3+1] == val2
             && tmpimage[(y+1)*width*3+x*3+2] == val3
             && tmpimage[(y-1)*width*3+x*3+0] == val1
             && tmpimage[(y-1)*width*3+x*3+1] == val2
             && tmpimage[(y-1)*width*3+x*3+2] == val3
             && tmpimage[y*width*3+(x+1)*3+0] == val1
             && tmpimage[y*width*3+(x+1)*3+1] == val2
             && tmpimage[y*width*3+(x+1)*3+2] == val3
             && tmpimage[y*width*3+(x-1)*3+0] == val1
             && tmpimage[y*width*3+(x-1)*3+1] == val2
             && tmpimage[y*width*3+(x-1)*3+2] == val3) {
                finalimage[finalidx++] = val1;
                finalimage[finalidx++] = val2;
                finalimage[finalidx++] = val3;
                continue;
            }

            // otherwise do antialiasing
            for (xi = -aareach; xi <= aareach; xi++) {
                dx = xi*aafactorinv;
                for (yi = -aareach; yi <= aareach; yi++) {
                    dy = yi*aafactorinv;
                    if ((xi | yi) != 0) {
                        calculate_pixel(x+dx, y+dy, &lastit, &zxd, &zyd, &inside);
                        if (!inside) {
                            idx = getcoloridx(lastit, zxd, zyd);
                            val1 += colors[idx][0];
                            val2 += colors[idx][1];
                            val3 += colors[idx][2];
                        }
                    }
                }
            }
            finalimage[finalidx++] = val1/aaarea;
            finalimage[finalidx++] = val2/aaarea;
            finalimage[finalidx++] = val3/aaarea;
        }
    }
    // write out image
    printf("P6 %d %d 255\n", width, height);
    fwrite(finalimage, 1, width*height*3, stdout);
    fprintf(stderr, "\n");

    return 0;
}