t_vec cyl_vec(const t_hit *hit) { t_vec tmp; tmp = (hit->obj)->pos; tmp.z = (hit->hitpos).z; return (vec_unit(&tmp, &(hit->hitpos))); }
void create_carambol_scene( BallsType * balls ) { int i; myvec vdummy; balls->gametype=GAME_CARAMBOL; /* balls */ balls->nr=3; if( balls->ball != NULL ) billard_free( balls->ball ); balls->ball = billard_malloc(sizeof(BallType)*balls->nr); placecarambolballnrs(balls); for(i=0;i<balls->nr;i++){ balls->ball[i].nr=i; } for(i=0;i<balls->nr;i++){ balls->ball[i].m=BALL_M; /* I_kugel = (m.r^2)2/5 = (m.d^2)/10 */ balls->ball[i].I=BALL_M*BALL_D*BALL_D/10.0/**0.01*/; balls->ball[i].d=BALL_D; balls->ball[i].v=vec_xyz(0.0,0.0,0.0); balls->ball[i].w=vec_xyz(0.0,0.0,0.0); balls->ball[i].b[0]=vec_unit(vec_xyz(rand(),rand(),rand())); vdummy=vec_xyz(rand(),rand(),rand()); balls->ball[i].b[1]=vec_unit(vec_diff(vdummy,vec_proj(vdummy,balls->ball[i].b[0]))); balls->ball[i].b[2]=vec_cross(balls->ball[i].b[0],balls->ball[i].b[1]); balls->ball[i].in_game=1; balls->ball[i].in_hole=0; balls->ball[i].soundplayed=0; } /* white ball */ balls->ball[0].r = vec_xyz( TABLE_W/4.0, -TABLE_L/4.0, 0.0 ); balls->ball[1].r = vec_xyz( 0.0, -TABLE_L/4.0, 0.0 ); balls->ball[2].r = vec_xyz( 0.0, +TABLE_L/4.0, 0.0 ); for( i=0 ; i<balls->nr ; i++ ){ balls->ball[i].path=0; balls->ball[i].pathcnt=0; balls->ball[i].pathsize=0; } }
//reflect a vector from a surface plane] void vec_reflect(vec_t *n, vec_t *w, vec_t *v) { vec_t *u = (vec_t *)malloc(sizeof(vec_t)); vec_unit(w, u); vec_scale(-1, u, u); vec_scale((2*vec_dot(u, n)), n, v); vec_diff(u, v, v); free(u); }
plane_t::plane_t(FILE *in, model_t *model, int attrmax):object_t(in, model){ int mask; strcpy(obj_type, "plane"); plane_parse[0].loc = &point; plane_parse[1].loc = &normal; // mask = parser(in, &plane_parse, NUM_ATTRS, attrmax); mask = parser(in, plane_parse, NUM_ATTRS, attrmax); assert(mask == 3); vec_unit(&normal, &normal); vec_copy(&normal, &last_normal); ndotq = vec_dot(&point, &normal); }
plane_t::plane_t( FILE *in, model_t *model, int attrmax) : object_t(in, model) { int mask; strcpy(objtype, "plane"); /* The parser is fairly generic but the address of where to */ /* put the data must be updated for each new object */ plane_parse[0].loc = &point; plane_parse[1].loc = &normal; mask = parser(in, plane_parse, NUM_ATTRS, attrmax); assert(mask == 3); vec_unit(&normal, &normal); vec_copy(&normal, &hitnorm); ndotq = vec_dot(&point, &normal); }
tplane_t::tplane_t(FILE *in, model_t *model, int attrmax) : plane_t(in,model,2) { int mask; char name[32]; vec_t projxdir; //parse tiled plane data tplane_parse[0].loc = &xdir; tplane_parse[1].loc = &dims; //tplane_parse[2].loc = &altname; mask = parser(in, tplane_parse, NUM_ATTRS, 2); assert(mask == 3); fscanf(in,"%s",name); fscanf(in, "%s",altname); //ask material_getbyname to return a pointer to the alt background mat altmat = material_getbyname(model,altname); fscanf(in, "%s", name); assert(name[0] == '}'); //project xdir into the plane and make it a unit vector vec_project(&normal, &xdir, &projxdir); vec_unit(&projxdir, &projxdir); //build a rotation matrix that rotates the plane normal //into the z axis and the projected xdir into the x axis vec_copy(&normal, &rot.row[2]); vec_copy(&projxdir, &rot.row[0]); vec_cross(&rot.row[0], &rot.row[2], &rot.row[1]); //copy tiled plane to objtype strcpy(obj_type, "tiled plane"); }
void bidiag_gkl_restart( int locked, int l, int n, CAX && Ax, CATX && Atx, CD && D, CE && E, CRho && rho, CP && P, CQ && Q, int s_indx, int t_s_indx) { // enhancements version from SLEPc const double eta = 1.e-10; double t_start = 0.0, t_end = 0.0; double local_start = 0.0, local_end = 0.0; double t_total3 = 0.0, t_total4 = 0.0, t_total5 = 0.0, t_total6 = 0.0, t_total7 = 0.0; int rank, nprocs; MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); // Step 1 int recv_len = (int)P.dim0() * nprocs; vec_container<double> tmp(Ax.dim0()); vec_container<double> recv_tmp(recv_len); auto m_Ax = make_gemv_ax(&Ax); auto m_Atx = make_gemv_ax(&Atx); m_Ax(Q.col(l), tmp, P.dim0() > 1000); vec_container<double> send_data(P.dim0(),0); for(size_t i = s_indx; i < s_indx + Ax.dim0(); ++i) send_data[i] = tmp.get(i-s_indx); MPI_Gather(&send_data[0], P.dim0(), MPI_DOUBLE, &recv_tmp[0], P.dim0(), MPI_DOUBLE, 0, MPI_COMM_WORLD); P.col(l) = 0; // Generate truly P.col(l) if(rank == 0) { local_union(P, recv_tmp, l, nprocs); // Step 2 & also in rank 0 for (int j = locked; j < l; ++j) { P.col(l) += -rho(j) * P.col(j); } } MPI_Bcast(&(P.col(0)[0]), P.size(), MPI_DOUBLE, 0, MPI_COMM_WORLD); //MPI_Bcast(&(P.col(l)[0]), P.size(), MPI_DOUBLE, 0, MPI_COMM_WORLD); // Main loop vec_container<double> T(n); int recv_l = Q.dim0() * nprocs; vec_container<double> recv_t(recv_l); for (int j = l; j < n; ++j) { // Step 3 vec_container<double> tmp2(Atx.dim0()); /* for print */ if(rank == 0) t_start = currenttime(); local_start = currenttime(); m_Atx(P.col(j), tmp2, Q.dim0() > 1000); local_end = currenttime(); std::cout << "parallel mv time cost is " << (local_end - local_start) / 1.0e6 << std::endl; vec_container<double> s_data(Q.dim0(), 0); for(size_t i = t_s_indx; i < t_s_indx + Atx.dim0(); ++i) s_data[i] = tmp2[i-t_s_indx]; MPI_Gather(&s_data[0], Q.dim0(), MPI_DOUBLE, &recv_t[0], Q.dim0(), MPI_DOUBLE, 0, MPI_COMM_WORLD); local_start = currenttime(); std::cout << "parallel mv time cost2 is " << (local_start - local_end) / 1.0e6 << std::endl; //Q.col(j+1) = 0; if(rank == 0) { // Generate truly Q.col(j+1) local_union(Q, recv_t, j + 1, nprocs); local_end = currenttime(); t_end = currenttime(); std::cout << "parallel mv time cost3 is " << (local_end - local_start) / 1.0e6 << std::endl; std::cout << "time of step 3 is : " << (t_end - t_start) / 1.0e6 << std::endl; t_total3 += (t_end - t_start) / 1.0e6; } // Step 4 for(size_t aa = 0; aa < Q.dim0(); ++aa) // row MPI_Bcast(&(Q.row(aa)[0]), j + 2, MPI_DOUBLE, 0, MPI_COMM_WORLD); // MPI_Bcast(&(Q.col(0)[0]), Q.size(), MPI_DOUBLE, 0, MPI_COMM_WORLD); if(rank == 0) t_end = currenttime(); auto Qj = mat_cols(Q, 0, j + 1); auto Tj = make_vec(&T, j + 1); //Tj.assign(gemv(Qj.trans(), Q.col(j + 1)), j >= 3); parallel_gemv_task(Qj.trans(), Q.col(j+1), Tj); if(rank == 0) { t_start = currenttime(); t_total4 += (t_start - t_end) / 1.0e6; std::cout << "time of step 4 is : " << (t_start - t_end) / 1.0e6 << std::endl; } // Step 5 if(rank == 0) { double r = Q.col(j + 1).norm2(); D[j] = vec_unit(P.col(j)); Q.col(j + 1).scale(1. / D[j]); Tj = Tj / D[j]; r /= D[j]; Q.col(j + 1).plus_assign(- gemv(Qj, Tj), Q.dim0() > 1000); t_end = currenttime(); t_total5 += (t_end - t_start) / 1.0e6; std::cout << "time of step 5 is : " << (t_end - t_start) / 1.0e6 << std::endl; // Step 6 double beta = r * r - Tj.square_sum(); if (beta < eta * r * r) { Tj.assign(gemv(Qj.trans(), Q.col(j + 1)), Q.dim0() > 1000); r = Q.col(j + 1).square_sum(); Q.col(j + 1).plus_assign(-gemv(Qj, Tj), Q.dim0() > 1000); beta = r * r - Tj.square_sum(); } beta = std::sqrt(beta); E[j] = beta; Q.col(j + 1).scale(1. / E[j]); t_start = currenttime(); t_total6 += (t_start - t_end) / 1.0e6; std::cout << "time of step 6 is : " << (t_start - t_end) / 1.0e6 << std::endl; } // Step 7 // MPI_Bcast(&(Q.col(j+1)[0]), Q.size(), MPI_DOUBLE, 0, MPI_COMM_WORLD); // MPI_Bcast(&(Q.col(0)[0]), Q.size(), MPI_DOUBLE, 0, MPI_COMM_WORLD); for(size_t aa = 0; aa < Q.dim0(); ++aa) MPI_Bcast(&(Q.col(j+1)[aa]), 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); if (j + 1 < n) { if(rank == 0) t_start = currenttime(); vec_container<double> tmp3(Ax.dim0()); vec_container<double> se_data(P.dim0(), 0); m_Ax(Q.col(j + 1), tmp3, P.dim0() > 1000); for(size_t k1 = s_indx; k1 < s_indx + Ax.dim0(); ++k1) se_data[k1] = tmp3[k1-s_indx]; MPI_Gather(&se_data[0], P.dim0(), MPI_DOUBLE, &recv_tmp[0], P.dim0(), MPI_DOUBLE, 0, MPI_COMM_WORLD); // P.col(j+1) = 0; if(rank == 0) { local_union(P, recv_tmp, j + 1, nprocs); P.col(j + 1).plus_assign(- E[j] * P.col(j), P.dim0() > 1000); } /* for print */ if(rank == 0) { t_end = currenttime(); t_total7 += (t_end - t_start) / 1.0e6; std::cout << "time of step 7 is : " << (t_end - t_start) / 1.0e6 << std::endl; } // MPI_Bcast(&(P.col(l)[0]), P.size(), MPI_DOUBLE, 0, MPI_COMM_WORLD); // MPI_Bcast(&(P.col(0)[0]), P.size(), MPI_DOUBLE, 0, MPI_COMM_WORLD); for(size_t aa = 0; aa < P.dim0(); ++aa) MPI_Bcast(&(P.col(j+1)[aa]), 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); } // end if } // end while /* for print time of each step. */ if(rank == 0) { std::cout << "total step 3 time is : " << t_total3 << std::endl; std::cout << "total step 4 time is : " << t_total4 << std::endl; std::cout << "total step 5 time is : " << t_total5 << std::endl; std::cout << "total step 6 time is : " << t_total6 << std::endl; std::cout << "total step 7 time is : " << t_total7 << std::endl; } return ; }
static void ambient(t_color *color) { (color->argb)[0] *= AMBI; (color->argb)[1] *= AMBI; (color->argb)[2] *= AMBI; } int shadow(const t_data *data, const t_hit *hit, t_color *color) { t_hit new; t_ray ray; ray.alpha = (data->objs).light; ray.beta = vec_unit(&(data->objs.light), &(hit->hitpos)); new = get_closest_obj(data, &ray); if (!new.hit) { ambient(color); return (1); } if (new.obj != hit->obj) { ambient(color); return (1); } return (0); }
Plane plane_create(vec p, vec norm, Material m) { return (Plane) { p,vec_unit(norm), (vec) {1,1,1}, m }; }
t_vec center_vec(const t_hit *hit) { return (vec_unit(&((hit->obj)->pos), &(hit->hitpos))); }
void create_snooker_scene( BallsType * balls ) { int i; myvec dball1, dball2, vdummy; VMfloat ang, ampl; myvec verr; balls->gametype=GAME_SNOOKER; /* balls */ balls->nr=22; if( balls->ball != NULL ) billard_free( balls->ball ); balls->ball = billard_malloc(sizeof(BallType)*balls->nr); placesnookerballnrs(balls); for(i=0;i<balls->nr;i++){ balls->ball[i].m=BALL_M; /* I_kugel = (m.r^2)2/5 = (m.d^2)/10 */ balls->ball[i].I=BALL_M*BALL_D*BALL_D/10.0/**0.01*/; balls->ball[i].d=BALL_D; balls->ball[i].r = vec_xyz(TABLE_L*3,TABLE_L*3,0.0); /* get balls out of the way */ balls->ball[i].v=vec_xyz(0.0,0.0,0.0); balls->ball[i].w=vec_xyz(0.0,0.0,0.0); balls->ball[i].b[0]=vec_unit(vec_xyz(rand(),rand(),rand())); vdummy=vec_xyz(rand(),rand(),rand()); balls->ball[i].b[1]=vec_unit(vec_diff(vdummy,vec_proj(vdummy,balls->ball[i].b[0]))); balls->ball[i].b[2]=vec_cross(balls->ball[i].b[0],balls->ball[i].b[1]); balls->ball[i].in_game=1; balls->ball[i].in_hole=0; balls->ball[i].soundplayed=0; } dball1=vec_scale(vec_xyz(-0.5*1.01, 0.5*sqrt(3.0)*1.01,0.0),BALL_D); dball2=vec_scale(vec_xyz( 1.01, 0.0, 0.0),BALL_D); /* red balls */ balls->ball[ 1].r = vec_xyz(0.0,TABLE_L/4.0+1.1*BALL_D,0.0); balls->ball[ 8].r = vec_add( balls->ball[ 1].r, dball1 ); balls->ball[ 9].r = vec_add( balls->ball[ 8].r, dball2 ); balls->ball[10].r = vec_add( balls->ball[ 8].r, dball1 ); balls->ball[11].r = vec_add( balls->ball[10].r, dball2 ); balls->ball[12].r = vec_add( balls->ball[11].r, dball2 ); balls->ball[13].r = vec_add( balls->ball[10].r, dball1 ); balls->ball[14].r = vec_add( balls->ball[13].r, dball2 ); balls->ball[15].r = vec_add( balls->ball[14].r, dball2 ); balls->ball[16].r = vec_add( balls->ball[15].r, dball2 ); balls->ball[17].r = vec_add( balls->ball[13].r, dball1 ); balls->ball[18].r = vec_add( balls->ball[17].r, dball2 ); balls->ball[19].r = vec_add( balls->ball[18].r, dball2 ); balls->ball[20].r = vec_add( balls->ball[19].r, dball2 ); balls->ball[21].r = vec_add( balls->ball[20].r, dball2 ); /* color balls */ for(i=7;i>=2;i--) { spot_snooker_ball(balls,i); } /* white ball */ spot_snooker_ball(balls,0); /* add randomness to init positions */ for( i=1 ; i<balls->nr ; i++ ){ ang = (VMfloat)rand()/(VMfloat)RAND_MAX*2.0*M_PI; ampl = (VMfloat)rand()/(VMfloat)RAND_MAX*0.0049*BALL_D; verr = vec_scale( vec_xyz(cos(ang),sin(ang),0.0), ampl ); balls->ball[i].r = vec_add( balls->ball[i].r, verr ); } for( i=0 ; i<balls->nr ; i++ ){ balls->ball[i].path=0; balls->ball[i].pathcnt=0; balls->ball[i].pathsize=0; } balls->ball[0].v=vec_xyz(0.0,0.0,0.0); }
void create_9ball_scene( BallsType * balls ) { int i; myvec dball1, dball2, vdummy; VMfloat ang, ampl; myvec verr; balls->gametype=GAME_9BALL; /* balls */ balls->nr=10; if( balls->ball != NULL ) billard_free( balls->ball ); balls->ball = billard_malloc(sizeof(BallType)*balls->nr); place9ballnrs(balls); for(i=0;i<balls->nr;i++){ balls->ball[i].m=BALL_M; /* I_kugel = (m.r^2)2/5 = (m.d^2)/10 */ balls->ball[i].I=BALL_M*BALL_D*BALL_D/10.0/**0.01*/; balls->ball[i].d=BALL_D; balls->ball[i].v=vec_xyz(0.0,0.0,0.0); balls->ball[i].w=vec_xyz(0.0,0.0,0.0); balls->ball[i].b[0]=vec_unit(vec_xyz(rand(),rand(),rand())); vdummy=vec_xyz(rand(),rand(),rand()); balls->ball[i].b[1]=vec_unit(vec_diff(vdummy,vec_proj(vdummy,balls->ball[i].b[0]))); balls->ball[i].b[2]=vec_cross(balls->ball[i].b[0],balls->ball[i].b[1]); balls->ball[i].in_game=1; balls->ball[i].in_hole=0; balls->ball[i].soundplayed=0; } dball1=vec_scale(vec_xyz(-0.5*1.01, 0.5*sqrt(3.0)*1.01,0.0),BALL_D); dball2=vec_scale(vec_xyz(+0.5*1.01, 0.5*sqrt(3.0)*1.01,0.0),BALL_D); /* white ball */ balls->ball[0].r = vec_xyz(0.0,-TABLE_L/4.0,0.0); balls->ball[0].w = vec_xyz(0.0,0.0,0.0); /* other balls */ balls->ball[ 1].r = vec_xyz(0.0,TABLE_L/4.0,0.0); balls->ball[ 2].r = vec_add( balls->ball[1].r, vec_scale(dball2,2.0) ); balls->ball[ 3].r = vec_add( balls->ball[2].r, vec_scale(dball1,2.0) ); balls->ball[ 4].r = vec_add( balls->ball[1].r, vec_scale(dball1,2.0) ); balls->ball[ 5].r = vec_add( balls->ball[1].r, dball1 ); balls->ball[ 6].r = vec_add( balls->ball[1].r, dball2 ); balls->ball[ 7].r = vec_add( balls->ball[2].r, dball1 ); balls->ball[ 8].r = vec_add( balls->ball[4].r, dball2 ); balls->ball[ 9].r = vec_add( balls->ball[1].r, vec_add(dball1,dball2) ); /* add randomness to init positions */ for( i=1 ; i<balls->nr ; i++ ){ ang = rand(); ang = (VMfloat)rand()/(VMfloat)RAND_MAX*2.0*M_PI; ampl = (VMfloat)rand()/(VMfloat)RAND_MAX*0.0049*BALL_D; verr = vec_scale( vec_xyz(cos(ang),sin(ang),0.0), ampl ); balls->ball[i].r = vec_add( balls->ball[i].r, verr ); } for( i=0 ; i<balls->nr ; i++ ){ balls->ball[i].path=0; balls->ball[i].pathcnt=0; balls->ball[i].pathsize=0; } balls->ball[0].v=vec_xyz(0.0,0.0,0.0); }
void create_8ball_scene( BallsType * balls ) { int i,j; myvec dball1, dball2, vdummy; VMfloat poserr=0.007; VMfloat ang; myvec verr; balls->gametype=GAME_8BALL; /* balls */ balls->nr=16; if( balls->ball != NULL ) billard_free( balls->ball ); balls->ball = billard_malloc(sizeof(BallType)*balls->nr); place8ballnrs(balls); for(i=0;i<balls->nr;i++){ balls->ball[i].m=BALL_M; /* I_kugel = (m.r^2)2/5 = (m.d^2)/10 */ balls->ball[i].I=BALL_M*BALL_D*BALL_D/10.0/**0.01*/; balls->ball[i].d=BALL_D; balls->ball[i].v=vec_xyz(0.0,0.0,0.0); balls->ball[i].w=vec_xyz(0.0,0.0,0.0); balls->ball[i].b[0]=vec_unit(vec_xyz(rand(),rand(),rand())); vdummy=vec_xyz(rand(),rand(),rand()); balls->ball[i].b[1]=vec_unit(vec_diff(vdummy,vec_proj(vdummy,balls->ball[i].b[0]))); balls->ball[i].b[2]=vec_cross(balls->ball[i].b[0],balls->ball[i].b[1]); balls->ball[i].in_game=1; balls->ball[i].in_hole=0; balls->ball[i].soundplayed=0; } dball1=vec_scale( vec_xyz(-0.5, 0.5*sqrt(3.0), 0.0), (1.0+2.0*poserr)*BALL_D ); dball2=vec_scale( vec_xyz( 1.0, 0.0, 0.0), (1.0+2.0*poserr)*BALL_D ); /* white ball */ balls->ball[0].r = vec_xyz(0.0,-TABLE_L/4.0,0.0); balls->ball[0].w = vec_xyz(0.0,0.0,0.0); /* other balls */ balls->ball[ 1].r = vec_xyz(0.0,TABLE_L/4.0,0.0); balls->ball[ 2].r = vec_add( balls->ball[ 1].r, dball1 ); balls->ball[ 3].r = vec_add( balls->ball[ 2].r, dball2 ); balls->ball[ 4].r = vec_add( balls->ball[ 2].r, dball1 ); balls->ball[ 5].r = vec_add( balls->ball[ 4].r, dball2 ); balls->ball[ 6].r = vec_add( balls->ball[ 5].r, dball2 ); balls->ball[ 7].r = vec_add( balls->ball[ 4].r, dball1 ); balls->ball[ 8].r = vec_add( balls->ball[ 7].r, dball2 ); balls->ball[ 9].r = vec_add( balls->ball[ 8].r, dball2 ); balls->ball[10].r = vec_add( balls->ball[ 9].r, dball2 ); balls->ball[11].r = vec_add( balls->ball[ 7].r, dball1 ); balls->ball[12].r = vec_add( balls->ball[11].r, dball2 ); balls->ball[13].r = vec_add( balls->ball[12].r, dball2 ); balls->ball[14].r = vec_add( balls->ball[13].r, dball2 ); balls->ball[15].r = vec_add( balls->ball[14].r, dball2 ); /* add randomness to init positions */ for( i=1 ; i<balls->nr ; i++ ){ ang = (VMfloat)rand()/(VMfloat)RAND_MAX*2.0*M_PI; //fprintf(stderr,"ball_placemet_err: angle=%f ",ang); verr = vec_scale( vec_xyz(cos(ang),sin(ang),0.0), (poserr*0.95)*BALL_D ); balls->ball[i].r = vec_add( balls->ball[i].r, verr ); } for( i=1 ; i<balls->nr ; i++ ){ for( j=i+1 ; j<balls->nr ; j++ ){ if (vec_abs(vec_diff(balls->ball[i].r,balls->ball[j].r))/BALL_D<1.5){ //fprintf(stderr,"BALLLDISR(%d,%d)=%f\n",balls->ball[i].nr,balls->ball[j].nr,vec_abs(vec_diff(balls->ball[i].r,balls->ball[j].r))/BALL_D); } } } for( i=0 ; i<balls->nr ; i++ ){ balls->ball[i].path=0; balls->ball[i].pathcnt=0; balls->ball[i].pathsize=0; } balls->ball[0].v=vec_xyz(0.0,0.0,0.0); }
void create_6hole_walls_snooker( BordersType * walls ) { int i; /* borders */ // walls->nr=30; walls->nr=32; if( walls->border != NULL ) billard_free( walls->border ); walls->border = billard_malloc( sizeof(BorderType)*walls->nr ); /* bonds */ walls->border[0].pnr = 3; walls->border[0].r1 = vec_xyz( +TABLE_W/2.0, +TABLE_L/2.0-HOLE1_W/SQR2, -BALL_D/2.0 ); walls->border[0].r2 = vec_xyz( +TABLE_W/2.0, +HOLE2_W/2.0, 0.0 ); walls->border[0].r3 = vec_xyz( +TABLE_W/2.0, +TABLE_L/2.0-HOLE1_W/SQR2, BALL_D/2.0 ); walls->border[0].n = vec_xyz( -1.0, 0.0, 0.0 ); walls->border[1].pnr = 3; walls->border[1].r1 = vec_xyz( +TABLE_W/2.0, -TABLE_L/2.0+HOLE1_W/SQR2, -BALL_D/2.0 ); walls->border[1].r2 = vec_xyz( +TABLE_W/2.0, -HOLE2_W/2.0, 0.0 ); walls->border[1].r3 = vec_xyz( +TABLE_W/2.0, -TABLE_L/2.0+HOLE1_W/SQR2, BALL_D/2.0 ); walls->border[1].n = vec_xyz( -1.0, 0.0, 0.0 ); walls->border[2].pnr = 3; walls->border[2].r1 = vec_xyz( -TABLE_W/2.0, +TABLE_L/2.0-HOLE1_W/SQR2, -BALL_D/2.0 ); walls->border[2].r2 = vec_xyz( -TABLE_W/2.0, +HOLE2_W/2.0, 0.0 ); walls->border[2].r3 = vec_xyz( -TABLE_W/2.0, +TABLE_L/2.0-HOLE1_W/SQR2, BALL_D/2.0 ); walls->border[2].n = vec_xyz( +1.0, 0.0, 0.0 ); walls->border[3].pnr = 3; walls->border[3].r1 = vec_xyz( -TABLE_W/2.0, -TABLE_L/2.0+HOLE1_W/SQR2, -BALL_D/2.0 ); walls->border[3].r2 = vec_xyz( -TABLE_W/2.0, -HOLE2_W/2.0, 0.0 ); walls->border[3].r3 = vec_xyz( -TABLE_W/2.0, -TABLE_L/2.0+HOLE1_W/SQR2, BALL_D/2.0 ); walls->border[3].n = vec_xyz( +1.0, 0.0, 0.0 ); walls->border[4].pnr = 3; walls->border[4].r1 = vec_xyz( -TABLE_W/2.0+HOLE1_W/SQR2, +TABLE_L/2.0, -BALL_D/2.0 ); walls->border[4].r2 = vec_xyz( +TABLE_W/2.0-HOLE1_W/SQR2, +TABLE_L/2.0, 0.0 ); walls->border[4].r3 = vec_xyz( -TABLE_W/2.0+HOLE1_W/SQR2, +TABLE_L/2.0, BALL_D/2.0 ); walls->border[4].n = vec_xyz( 0.0, -1.0, 0.0 ); walls->border[5].pnr = 3; walls->border[5].r1 = vec_xyz( -TABLE_W/2.0+HOLE1_W/SQR2, -TABLE_L/2.0, -BALL_D/2.0 ); walls->border[5].r2 = vec_xyz( +TABLE_W/2.0-HOLE1_W/SQR2, -TABLE_L/2.0, 0.0 ); walls->border[5].r3 = vec_xyz( -TABLE_W/2.0+HOLE1_W/SQR2, -TABLE_L/2.0, BALL_D/2.0 ); walls->border[5].n = vec_xyz( 0.0, +1.0, 0.0 ); /* edges */ /* upper right */ walls->border[6].pnr = 2; walls->border[6].r1 = vec_xyz( +TABLE_W/2.0, +TABLE_L/2.0-HOLE1_W/SQR2, -BALL_D/2.0 ); walls->border[6].r2 = vec_xyz( +TABLE_W/2.0, +TABLE_L/2.0-HOLE1_W/SQR2, BALL_D/2.0 ); walls->border[18].pnr = 3; walls->border[18].r1 = vec_xyz( +TABLE_W/2.0, +TABLE_L/2.0-HOLE1_W/SQR2, -BALL_D/2.0 ); walls->border[18].r2 = vec_xyz( +TABLE_W/2.0, +TABLE_L/2.0-HOLE1_W/SQR2, BALL_D/2.0 ); walls->border[18].r3 = vec_xyz( +TABLE_W/2.0+1.0, +TABLE_L/2.0-HOLE1_W/SQR2+HOLE1_TAN, 0.0 ); walls->border[18].n = vec_unit(vec_cross(vec_diff(walls->border[18].r2,walls->border[18].r1),vec_diff(walls->border[18].r3,walls->border[18].r1))); /* upper right */ walls->border[7].pnr = 2; walls->border[7].r1 = vec_xyz( +TABLE_W/2.0-HOLE1_W/SQR2, +TABLE_L/2.0, -BALL_D/2.0 ); walls->border[7].r2 = vec_xyz( +TABLE_W/2.0-HOLE1_W/SQR2, +TABLE_L/2.0, BALL_D/2.0 ); walls->border[19].pnr = 3; walls->border[19].r1 = vec_xyz( +TABLE_W/2.0-HOLE1_W/SQR2, +TABLE_L/2.0, -BALL_D/2.0 ); walls->border[19].r2 = vec_xyz( +TABLE_W/2.0-HOLE1_W/SQR2, +TABLE_L/2.0, BALL_D/2.0 ); walls->border[19].r3 = vec_xyz( +TABLE_W/2.0-HOLE1_W/SQR2+HOLE1_TAN, +TABLE_L/2.0+1.0, 0.0 ); walls->border[19].n = vec_unit(vec_cross(vec_diff(walls->border[19].r1,walls->border[19].r2),vec_diff(walls->border[19].r3,walls->border[19].r1))); /* upper left */ walls->border[8].pnr = 2; walls->border[8].r1 = vec_xyz( -TABLE_W/2.0, +TABLE_L/2.0-HOLE1_W/SQR2, -BALL_D/2.0 ); walls->border[8].r2 = vec_xyz( -TABLE_W/2.0, +TABLE_L/2.0-HOLE1_W/SQR2, BALL_D/2.0 ); walls->border[20].pnr = 3; walls->border[20].r1 = vec_xyz( -TABLE_W/2.0, +TABLE_L/2.0-HOLE1_W/SQR2, -BALL_D/2.0 ); walls->border[20].r2 = vec_xyz( -TABLE_W/2.0, +TABLE_L/2.0-HOLE1_W/SQR2, BALL_D/2.0 ); walls->border[20].r3 = vec_xyz( -TABLE_W/2.0-1.0, +TABLE_L/2.0-HOLE1_W/SQR2+HOLE1_TAN, 0.0 ); walls->border[20].n = vec_unit(vec_cross(vec_diff(walls->border[20].r1,walls->border[20].r2),vec_diff(walls->border[20].r3,walls->border[20].r1))); /* upper left */ walls->border[9].pnr = 2; walls->border[9].r1 = vec_xyz( -TABLE_W/2.0+HOLE1_W/SQR2, +TABLE_L/2.0, -BALL_D/2.0 ); walls->border[9].r2 = vec_xyz( -TABLE_W/2.0+HOLE1_W/SQR2, +TABLE_L/2.0, BALL_D/2.0 ); walls->border[21].pnr = 3; walls->border[21].r1 = vec_xyz( -TABLE_W/2.0+HOLE1_W/SQR2, +TABLE_L/2.0, -BALL_D/2.0 ); walls->border[21].r2 = vec_xyz( -TABLE_W/2.0+HOLE1_W/SQR2, +TABLE_L/2.0, BALL_D/2.0 ); walls->border[21].r3 = vec_xyz( -TABLE_W/2.0+HOLE1_W/SQR2-HOLE1_TAN, +TABLE_L/2.0+1.0, 0.0 ); walls->border[21].n = vec_unit(vec_cross(vec_diff(walls->border[21].r2,walls->border[21].r1),vec_diff(walls->border[21].r3,walls->border[21].r1))); /* lower right */ walls->border[10].pnr = 2; walls->border[10].r1 = vec_xyz( +TABLE_W/2.0, -TABLE_L/2.0+HOLE1_W/SQR2, -BALL_D/2.0 ); walls->border[10].r2 = vec_xyz( +TABLE_W/2.0, -TABLE_L/2.0+HOLE1_W/SQR2, BALL_D/2.0 ); walls->border[22].pnr = 3; walls->border[22].r1 = vec_xyz( +TABLE_W/2.0, -TABLE_L/2.0+HOLE1_W/SQR2, -BALL_D/2.0 ); walls->border[22].r2 = vec_xyz( +TABLE_W/2.0, -TABLE_L/2.0+HOLE1_W/SQR2, BALL_D/2.0 ); walls->border[22].r3 = vec_xyz( +TABLE_W/2.0+1.0, -TABLE_L/2.0+HOLE1_W/SQR2-HOLE1_TAN, 0.0 ); walls->border[22].n = vec_unit(vec_cross(vec_diff(walls->border[22].r1,walls->border[22].r2),vec_diff(walls->border[22].r3,walls->border[22].r1))); /* lower right */ walls->border[11].pnr = 2; walls->border[11].r1 = vec_xyz( +TABLE_W/2.0-HOLE1_W/SQR2, -TABLE_L/2.0, -BALL_D/2.0 ); walls->border[11].r2 = vec_xyz( +TABLE_W/2.0-HOLE1_W/SQR2, -TABLE_L/2.0, BALL_D/2.0 ); walls->border[23].pnr = 3; walls->border[23].r1 = vec_xyz( +TABLE_W/2.0-HOLE1_W/SQR2, -TABLE_L/2.0, -BALL_D/2.0 ); walls->border[23].r2 = vec_xyz( +TABLE_W/2.0-HOLE1_W/SQR2, -TABLE_L/2.0, BALL_D/2.0 ); walls->border[23].r3 = vec_xyz( +TABLE_W/2.0-HOLE1_W/SQR2+HOLE1_TAN, -TABLE_L/2.0-1.0, 0.0 ); walls->border[23].n = vec_unit(vec_cross(vec_diff(walls->border[23].r2,walls->border[23].r1),vec_diff(walls->border[23].r3,walls->border[23].r1))); /* lower left */ walls->border[12].pnr = 2; walls->border[12].r1 = vec_xyz( -TABLE_W/2.0, -TABLE_L/2.0+HOLE1_W/SQR2, -BALL_D/2.0 ); walls->border[12].r2 = vec_xyz( -TABLE_W/2.0, -TABLE_L/2.0+HOLE1_W/SQR2, BALL_D/2.0 ); walls->border[24].pnr = 3; walls->border[24].r1 = vec_xyz( -TABLE_W/2.0, -TABLE_L/2.0+HOLE1_W/SQR2, -BALL_D/2.0 ); walls->border[24].r2 = vec_xyz( -TABLE_W/2.0, -TABLE_L/2.0+HOLE1_W/SQR2, BALL_D/2.0 ); walls->border[24].r3 = vec_xyz( -TABLE_W/2.0-1.0, -TABLE_L/2.0+HOLE1_W/SQR2-HOLE1_TAN, 0.0 ); walls->border[24].n = vec_unit(vec_cross(vec_diff(walls->border[24].r2,walls->border[24].r1),vec_diff(walls->border[24].r3,walls->border[24].r1))); /* lower left */ walls->border[13].pnr = 2; walls->border[13].r1 = vec_xyz( -TABLE_W/2.0+HOLE1_W/SQR2, -TABLE_L/2.0, -BALL_D/2.0 ); walls->border[13].r2 = vec_xyz( -TABLE_W/2.0+HOLE1_W/SQR2, -TABLE_L/2.0, BALL_D/2.0 ); walls->border[25].pnr = 3; walls->border[25].r1 = vec_xyz( -TABLE_W/2.0+HOLE1_W/SQR2, -TABLE_L/2.0, -BALL_D/2.0 ); walls->border[25].r2 = vec_xyz( -TABLE_W/2.0+HOLE1_W/SQR2, -TABLE_L/2.0, BALL_D/2.0 ); walls->border[25].r3 = vec_xyz( -TABLE_W/2.0+HOLE1_W/SQR2-HOLE1_TAN, -TABLE_L/2.0-1.0, 0.0 ); walls->border[25].n = vec_unit(vec_cross(vec_diff(walls->border[25].r1,walls->border[25].r2),vec_diff(walls->border[25].r3,walls->border[25].r1))); /* middle left */ walls->border[14].pnr = 2; walls->border[14].r1 = vec_xyz( -TABLE_W/2.0, HOLE2_W/2.0, -BALL_D/2.0 ); walls->border[14].r2 = vec_xyz( -TABLE_W/2.0, HOLE2_W/2.0, BALL_D/2.0 ); walls->border[26].pnr = 3; walls->border[26].r1 = vec_xyz( -TABLE_W/2.0, HOLE2_W/2.0, -BALL_D/2.0 ); walls->border[26].r2 = vec_xyz( -TABLE_W/2.0, HOLE2_W/2.0, BALL_D/2.0 ); walls->border[26].r3 = vec_xyz( -TABLE_W/2.0-1.0, HOLE2_W/2.0-HOLE2_TAN, 0.0 ); walls->border[26].n = vec_unit(vec_cross(vec_diff(walls->border[26].r2,walls->border[26].r1),vec_diff(walls->border[26].r3,walls->border[26].r1))); /* middle left */ walls->border[15].pnr = 2; walls->border[15].r1 = vec_xyz( -TABLE_W/2.0, -HOLE2_W/2.0, -BALL_D/2.0 ); walls->border[15].r2 = vec_xyz( -TABLE_W/2.0, -HOLE2_W/2.0, BALL_D/2.0 ); walls->border[27].pnr = 3; walls->border[27].r1 = vec_xyz( -TABLE_W/2.0, -HOLE2_W/2.0, -BALL_D/2.0 ); walls->border[27].r2 = vec_xyz( -TABLE_W/2.0, -HOLE2_W/2.0, BALL_D/2.0 ); walls->border[27].r3 = vec_xyz( -TABLE_W/2.0-1.0, -HOLE2_W/2.0+HOLE2_TAN, 0.0 ); walls->border[27].n = vec_unit(vec_cross(vec_diff(walls->border[27].r1,walls->border[27].r2),vec_diff(walls->border[27].r3,walls->border[27].r1))); /* middle right */ walls->border[16].pnr = 2; walls->border[16].r1 = vec_xyz( +TABLE_W/2.0, HOLE2_W/2.0, -BALL_D/2.0 ); walls->border[16].r2 = vec_xyz( +TABLE_W/2.0, HOLE2_W/2.0, BALL_D/2.0 ); walls->border[28].pnr = 3; walls->border[28].r1 = vec_xyz( +TABLE_W/2.0, HOLE2_W/2.0, -BALL_D/2.0 ); walls->border[28].r2 = vec_xyz( +TABLE_W/2.0, HOLE2_W/2.0, BALL_D/2.0 ); walls->border[28].r3 = vec_xyz( +TABLE_W/2.0+1.0, HOLE2_W/2.0-HOLE2_TAN, 0.0 ); walls->border[28].n = vec_unit(vec_cross(vec_diff(walls->border[28].r1,walls->border[28].r2),vec_diff(walls->border[28].r3,walls->border[28].r1))); /* middle right */ walls->border[17].pnr = 2; walls->border[17].r1 = vec_xyz( +TABLE_W/2.0, -HOLE2_W/2.0, -BALL_D/2.0 ); walls->border[17].r2 = vec_xyz( +TABLE_W/2.0, -HOLE2_W/2.0, BALL_D/2.0 ); walls->border[29].pnr = 3; walls->border[29].r1 = vec_xyz( +TABLE_W/2.0, -HOLE2_W/2.0, -BALL_D/2.0 ); walls->border[29].r2 = vec_xyz( +TABLE_W/2.0, -HOLE2_W/2.0, BALL_D/2.0 ); walls->border[29].r3 = vec_xyz( +TABLE_W/2.0+1.0, -HOLE2_W/2.0+HOLE2_TAN, 0.0 ); walls->border[29].n = vec_unit(vec_cross(vec_diff(walls->border[29].r2,walls->border[29].r1),vec_diff(walls->border[29].r3,walls->border[29].r1))); /* friction constants and loss factors */ for(i=0;i<walls->nr;i++){ walls->border[i].mu = 0.1; walls->border[i].loss0 = 0.2; walls->border[i].loss_max = 0.5; walls->border[i].loss_wspeed = 4.0; /* [m/s] */ } /* table surface */ #define TABLE_W2 (TABLE_W-BALL_D*0.9) #define TABLE_L2 (TABLE_L-BALL_D*0.9) walls->border[30].pnr = 3; walls->border[30].r1 = vec_xyz( -TABLE_W/2.0, -TABLE_L/2.0, -BALL_D/2.0-0.0001 ); walls->border[30].r2 = vec_xyz( +TABLE_W/2.0, -TABLE_L/2.0, -BALL_D/2.0-0.0001 ); walls->border[30].r3 = vec_xyz( +TABLE_W/2.0, +TABLE_L/2.0, -BALL_D/2.0-0.0001 ); walls->border[30].n = vec_xyz( 0.0, 0.0, 1.0 ); walls->border[31].pnr = 3; walls->border[31].r1 = vec_xyz( -TABLE_W/2.0, -TABLE_L/2.0, -BALL_D/2.0-0.0001 ); walls->border[31].r3 = vec_xyz( +TABLE_W/2.0, +TABLE_L/2.0, -BALL_D/2.0-0.0001 ); walls->border[31].r2 = vec_xyz( -TABLE_W/2.0, +TABLE_L/2.0, -BALL_D/2.0-0.0001 ); walls->border[31].n = vec_xyz( 0.0, 0.0, 1.0 ); #undef TABLE_W2 #undef TABLE_L2 walls->border[30].mu = 0.2; walls->border[30].loss0 = 0.6; walls->border[30].loss_max = 0.99; walls->border[30].loss_wspeed = 1.5; walls->border[31].mu = 0.2; walls->border[31].loss0 = 0.6; walls->border[31].loss_max = 0.99; walls->border[31].loss_wspeed = 1.5; /* holes */ walls->holenr = 6; if( walls->hole != NULL ) billard_free( walls->hole ); walls->hole = billard_malloc(sizeof(HoleType)*walls->holenr); /* middle right */ walls->hole[0].aim = vec_xyz( +TABLE_W/2.0-HOLE2_AIMOFFS, 0.0, 0.0 ); walls->hole[0].pos = vec_xyz( +TABLE_W/2.0+HOLE2_XYOFFS, 0.0, 0.0 ); walls->hole[0].r = HOLE2_R; /* middle left */ walls->hole[1].aim = vec_xyz( -TABLE_W/2.0+HOLE2_AIMOFFS, 0.0, 0.0 ); walls->hole[1].pos = vec_xyz( -TABLE_W/2.0-HOLE2_XYOFFS, 0.0, 0.0 ); walls->hole[1].r = HOLE2_R; /* upper right */ walls->hole[2].aim = vec_xyz( +TABLE_W/2.0-HOLE1_AIMOFFS, +TABLE_L/2.0-HOLE1_AIMOFFS, 0.0 ); walls->hole[2].pos = vec_xyz( +TABLE_W/2.0+HOLE1_XYOFFS, +TABLE_L/2.0+HOLE1_XYOFFS, 0.0 ); walls->hole[2].r = HOLE1_R; /* upper left */ walls->hole[3].aim = vec_xyz( -TABLE_W/2.0+HOLE1_AIMOFFS, +TABLE_L/2.0-HOLE1_AIMOFFS, 0.0 ); walls->hole[3].pos = vec_xyz( -TABLE_W/2.0-HOLE1_XYOFFS, +TABLE_L/2.0+HOLE1_XYOFFS, 0.0 ); walls->hole[3].r = HOLE1_R; /* lower left */ walls->hole[4].aim = vec_xyz( -TABLE_W/2.0+HOLE1_AIMOFFS, -TABLE_L/2.0-HOLE1_AIMOFFS, 0.0 ); walls->hole[4].pos = vec_xyz( -TABLE_W/2.0-HOLE1_XYOFFS, -TABLE_L/2.0-HOLE1_XYOFFS, 0.0 ); walls->hole[4].r = HOLE1_R; /* lower right */ walls->hole[5].aim = vec_xyz( +TABLE_W/2.0-HOLE1_AIMOFFS, -TABLE_L/2.0+HOLE1_AIMOFFS, 0.0 ); walls->hole[5].pos = vec_xyz( +TABLE_W/2.0+HOLE1_XYOFFS, -TABLE_L/2.0-HOLE1_XYOFFS, 0.0 ); walls->hole[5].r = HOLE1_R; }
Pointl pointl_create(double x, double y, double z, double intensity) { Pointl l; l.pos = (vec){x,y,z}; l.color = vec_unit((vec){intensity, intensity, intensity}); return l; }