示例#1
0
Color traceRay(Ray pixel_ray, Scene* s, Camera* c, int depth)
{
	Color pixelColor;
	Ray normal[2];
	pixelColor.r = 0;
	pixelColor.g = 0;
	pixelColor.b = 0;

	Sphere *closestSphere = NULL;
	Plane *closestPlane = NULL;
	float closestSphereDist = fInfinity;
	float closestPlaneDist = fInfinity;

	if (depth <= 0) return {0,0,0};

	for (int i = 0; i < s->spheres.size(); i++) {
		float dist = sphere_intersect(&s->spheres[i], &pixel_ray);
		if (dist != fInfinity) {
			if(closestSphereDist == fInfinity || 
				(closestSphereDist > dist && abs(closestSphereDist-dist) > 0.0001))
			{
				closestSphereDist = dist;
				closestSphere = &s->spheres[i];
				Point intersection = add(pixel_ray.p0, mul(pixel_ray.dir, dist));
				Ray sphereNorm;
				sphereNorm.p0 = intersection;
				sphereNorm.dir = normalize(sub(intersection, closestSphere->center));
				normal[0] = sphereNorm;
			}
		}
	}

	for (int i = 0; i < s->planes.size(); i++) {
		float dist = plane_intersect(&s->planes[i], &pixel_ray);
		if (dist != fInfinity) {
			if(closestPlaneDist == fInfinity || 
				(closestPlaneDist > dist && abs(closestPlaneDist-dist) > 0.0001))
			{
				closestPlaneDist = dist;
				closestPlane = &s->planes[i];
				Point intersection = add(pixel_ray.p0, mul(pixel_ray.dir, dist));
				Ray planeNorm;
				planeNorm.p0 = intersection;
				planeNorm.dir = normalize(closestPlane->normal);
				normal[1] = planeNorm;
			}
		}
	}

	if (closestPlane != NULL && closestSphere != NULL) {
		if (closestPlaneDist < closestSphereDist) {
			closestSphere = NULL;
		} else 
			closestPlane = NULL;
	}

	if (closestPlane != NULL) {
		Color lambert = lambertian(normal[1], s, NULL, closestPlane);
		pixelColor.r = lambert.r;
		pixelColor.g = lambert.g;
		pixelColor.b = lambert.b;

		if(depth != 0)
		{
			if(closestPlane->material.transparency != 0.0)
			{
				Ray transRay;
				transRay.dir = pixel_ray.dir;
				transRay.p0 = mul(normal[1].p0, 1.01f);

				Color transparent = traceRay(transRay, s, c, depth-1);

				pixelColor.r = pixelColor.r * (1 - closestPlane->material.transparency) +
					transparent.r * closestPlane->material.transparency;
				pixelColor.g = pixelColor.g * (1 - closestPlane->material.transparency) +
					transparent.g * closestPlane->material.transparency;
				pixelColor.b = pixelColor.b * (1 - closestPlane->material.transparency) +
					transparent.b * closestPlane->material.transparency;
			}
			
			if(closestPlane->material.reflection != 0.0)
			{
				Ray reflRay = reflect(pixel_ray, normal[1]);
				Color reflection = traceRay( reflRay, s, c, depth-1 );

				pixelColor.r = pixelColor.r * (1 - closestPlane->material.reflection) +
					reflection.r * closestPlane->material.reflection;
				pixelColor.g = pixelColor.g * (1 - closestPlane->material.reflection) +
					reflection.g * closestPlane->material.reflection;
				pixelColor.b = pixelColor.b * (1 - closestPlane->material.reflection) +
					reflection.b * closestPlane->material.reflection;
			}
		}

	} else if (closestSphere != NULL) {
		Color lambert = lambertian(normal[0], s, closestSphere, NULL);
		pixelColor.r += lambert.r;
		pixelColor.g += lambert.g;
		pixelColor.b += lambert.b;

		if(depth != 0) 
		{
			if(closestSphere->material.transparency != 0.0)
			{
				Ray transRay;
				transRay.dir = pixel_ray.dir;
				transRay.p0 = normal[0].p0;

				Color transparent = traceRay(transRay, s, c, depth-1);
				
				pixelColor.r = pixelColor.r * (1 - closestSphere->material.transparency) +
					transparent.r * closestSphere->material.transparency;
				pixelColor.g = pixelColor.g * (1 - closestSphere->material.transparency) +
					transparent.g * closestSphere->material.transparency;
				pixelColor.b = pixelColor.b * (1 - closestSphere->material.transparency) +
					transparent.b * closestSphere->material.transparency;
			}

			if(closestSphere->material.reflection != 0.0)
			{
				Ray reflRay;
				reflRay = reflect(pixel_ray, normal[0]);

				Color reflection = traceRay(reflRay, s, c, depth-1);
				
				pixelColor.r = pixelColor.r * (1 - closestSphere->material.reflection) +
					reflection.r * closestSphere->material.reflection;
				pixelColor.g = pixelColor.g * (1 - closestSphere->material.reflection) +
					reflection.g * closestSphere->material.reflection;
				pixelColor.b = pixelColor.b * (1 - closestSphere->material.reflection) +
					reflection.b * closestSphere->material.reflection;
			}
		}
	}

	if(pixelColor.r > 1)
	{
		//printf("cut off red\n");
		pixelColor.r = 1.0;
	}
	if(pixelColor.g > 1)
	{
		//printf("cut off green\n");
		pixelColor.g = 1.0;
	}
	if(pixelColor.b > 1)
	{
		//printf("cut off blue\n");
		pixelColor.b = 1.0;
	}

	return pixelColor;
}
示例#2
0
double *call_map_model(double la,double lo,double lambda0, double phi0,int brightness_model,double *brightness_params,double **bb_g,int make_grid,double theta1, double theta2, double r1, double r2, double star_bright,double la_cen,double lo_cen, double *lo_2d, double *la_2d, double **T_2d, double **y1_grid, double **y2_grid, double **y12_grid){
    double point_T,mu,p_t_bright,point_b;
    double l1,l2;
    double *output;

    double R = 1.0;
    int n_bb_seg = 10;

    point_T = 0.0;
    point_b = 0.0;

//    printf("bb_g %f\n",bb_g[0][1]);

    if(brightness_model == 1 || brightness_model == 3 || brightness_model == 4 || brightness_model == 6|| brightness_model == 8|| brightness_model == 10|| brightness_model == 11|| brightness_model == 12) {
        l1 = brightness_params[1];
        l2 = brightness_params[2];
    }
    if(brightness_model == 0){
        point_b = Uniform_b(brightness_params[0]);
    }
    else if(brightness_model == 1){
        point_T = Uniform_T(brightness_params[3]);
        point_b = bb_interp(point_T, bb_g);
    }

//    if(brightness_model == 2){
//        double p_day = brightness_params[0];
//        double p_night = brightness_params[1];
//        point_b = Two_b(la,lo,p_day,p_night);
//    }
//    if(brightness_model == 3){
//        double p_day = brightness_params[3];
//        double p_night = brightness_params[4];
//        double point_T = p_night;
//        point_T = Two_T(la,lo,p_day,p_night);
//        point_b = bb_interp(point_T, bb_g);
//    }

    else if(brightness_model == 4){
        double xi =brightness_params[3];
        double T_n =brightness_params[4];
        double delta_T =brightness_params[5];
        point_T = zhang_2016(la,lo,xi,T_n,delta_T);
        point_b = bb_interp(point_T, bb_g);
    }
    else if(brightness_model == 5){

        point_b = spherical(la,lo,brightness_params,0);
    }

    else if(brightness_model == 14){

        point_T = spherical(la,lo,brightness_params,1);
        point_b = bb_interp(point_T, bb_g); 
    }

    else if(brightness_model == 6){
       double insol = brightness_params[3];
       double albedo = brightness_params[4];
       double redist = brightness_params[5];
       point_T = kreidberg_2016(la, lo, insol, albedo, redist);
       point_b = bb_interp(point_T, bb_g); 
    }

    else if(brightness_model == 2 || brightness_model == 7){
        double la0 = brightness_params[0];
        double lo0 = brightness_params[1];
        double p_b = brightness_params[2];
        double spot_b = brightness_params[4];
        double size = brightness_params[5];
//        printf("%f %f %f %f %f\n",la0,lo0,p_b,spot_b,size);
        point_b = Hotspot_b(la, lo, la0,lo0,p_b,spot_b,size,make_grid ,theta1,theta2,r1,r2,lambda0,phi0,la_cen,lo_cen);
     }

    else if(brightness_model == 3 || brightness_model == 8){
        double la0 = brightness_params[4];
        double lo0 = brightness_params[5];
        double p_T = brightness_params[6];
        double spot_T = brightness_params[7];
        double size = brightness_params[8];
        double b1 = bb_interp(p_T, bb_g); 
        double b2 = bb_interp(spot_T, bb_g); 
        point_T = Hotspot_b(la, lo, la0,lo0,p_T,spot_T,size,make_grid ,theta1,theta2,r1,r2,lambda0,phi0,la_cen,lo_cen);
        point_b = Hotspot_b(la, lo, la0,lo0,b1,b2,size,make_grid ,theta1,theta2,r1,r2,lambda0,phi0,la_cen,lo_cen);
    }
    else if(brightness_model == 9){
        double albedo = brightness_params[3];
        double ars = pow(brightness_params[4],2);
        double insol = ars*star_bright;
//        printf("%f \n",insol*M_PI);
        point_b = lambertian(la,lo,insol,albedo);
    }
    else if(brightness_model == 10){
        double xi =brightness_params[3];
        double T_n =brightness_params[4];
        double delta_T =brightness_params[5];
        point_T = zhang_2016(la,lo,xi,T_n,delta_T);
        point_b = bb_interp(point_T, bb_g);

        double albedo = brightness_params[6];
        double ars = pow(brightness_params[7],2);
        double insol = ars*star_bright;
        point_b = point_b + lambertian(la,lo,insol,albedo);
    }

    else if(brightness_model == 11){
        double xi =brightness_params[3];
        double T_n =brightness_params[4];
        double delta_T =brightness_params[5];
        double clouds = brightness_params[6];

        point_T = zhang_2016(la,lo,xi,T_n,delta_T);

        point_b = bb_interp(point_T, bb_g);

        if(pow(lo,2) > pow(M_PI/2.0,2)){
            point_b = point_b - clouds;
        }
    }

    else if(brightness_model == 12 || brightness_model == 13){

/*        printf("\n");
        printf("%f\n",lo*180.0/M_PI);
        printf("%i\n",find_minimum(lo_2d, lo*180.0/M_PI, (int) brightness_params[3]));
        printf("%f\n",lo_2d[find_minimum(lo_2d, lo*180.0/M_PI, (int) brightness_params[3])]);
        printf("\n");*/

        int *out1;
        out1 = malloc(sizeof(int) * 2);

        int *out2;
        out2 = malloc(sizeof(int) * 2);

        int nlo, nla, nearest;

        if(brightness_model == 12){
            nlo = brightness_params[3];
            nla = brightness_params[4];
            nearest = brightness_params[5];
        }
        if(brightness_model == 13){
            nlo = brightness_params[0];
            nla = brightness_params[1];
            nearest = brightness_params[2];
        }

        find_top_two(lo_2d, lo*180.0/M_PI, (int) nlo, out1);

//        printf("before second %i\n",(int) brightness_params[4]);
        find_top_two(la_2d, la*180.0/M_PI, (int) nla, out2);

//        printf("positions %i %i %i %i %i %i\n",out1[0],out1[1],out2[0],out2[1],nlo,nla);
//        printf("positions %f %f %f %f\n",lo_2d[out1[0]],lo_2d[out1[1]],la_2d[out2[0]],la_2d[out2[1]]);

        float *ansy, *ansy1, *ansy2;

        ansy = malloc(sizeof(float) * 1);
        ansy1 = malloc(sizeof(float) * 1);
        ansy2 = malloc(sizeof(float) * 1);

        float *y,*y1,*y2,*y12;
        y = malloc(sizeof(float) * 5);
        y1 = malloc(sizeof(float) * 5);
        y2 = malloc(sizeof(float) * 5);
        y12 = malloc(sizeof(float) * 5);

        y[1] = T_2d[out1[0]][out2[0]];
        y[2] = T_2d[out1[1]][out2[0]];
        y[3] = T_2d[out1[1]][out2[1]];
        y[4] = T_2d[out1[0]][out2[1]];

        y1[1] = y1_grid[out1[0]][out2[0]];
        y1[2] = y1_grid[out1[1]][out2[0]];
        y1[3] = y1_grid[out1[1]][out2[1]];
        y1[4] = y1_grid[out1[0]][out2[1]];

        y2[1] = y2_grid[out1[0]][out2[0]];
        y2[2] = y2_grid[out1[1]][out2[0]];
        y2[3] = y2_grid[out1[1]][out2[1]];
        y2[4] = y2_grid[out1[0]][out2[1]];

        y12[1] = y12_grid[out1[0]][out2[0]];
        y12[2] = y12_grid[out1[1]][out2[0]];
        y12[3] = y12_grid[out1[1]][out2[1]];
        y12[4] = y12_grid[out1[0]][out2[1]];


//        printf("%f %f %f %f %f %f\n",lo_2d[out1[0]],lo_2d[out1[1]], la_2d[out2[0]], la_2d[out2[1]], lo*180.0/M_PI, la*180.0/M_PI);
        bcuint(y, y1, y2, y12, lo_2d[out1[0]],lo_2d[out1[1]], la_2d[out2[0]], la_2d[out2[1]], lo*180.0/M_PI, la*180.0/M_PI, ansy, ansy1, ansy2);

        if (nearest == 1) {
            int c_lo = find_minimum(lo_2d, lo*180.0/M_PI, (int) nlo);
            int c_la = find_minimum(la_2d, la*180.0/M_PI, (int) nla);
            *ansy = T_2d[c_lo][c_la];
        }

        if(brightness_model == 12){
            point_T = *ansy;
            point_b = bb_interp(point_T, bb_g);
        }
        if(brightness_model == 13){
            point_b = *ansy;
        }

        free(out1);
        free(out2);

        free(y);
        free(y1);
        free(y2);
        free(y12);

        free(ansy);
        free(ansy1);
        free(ansy2);

        }
    else{
        printf("BRIGHTNESS MODEL NOT RECOGNISED\n");
    }

//        printf("%f %f %f\n",ars, star_bright,insol);
    output = malloc(sizeof(double) * 2); // dynamic `array (size 2) of pointers to double`

    output[0] = point_b;
    output[1] = point_T;

    return output;

}