void test_fx_fixed_limits_double(ostream& out) { out << "****************** limits fx_fixed<8, 5>_double\n"; sc_fixed<8, 5> zero_min("-0"); SHOW(zero_min); sc_fixed<8, 5> zero_plus("+0"); SHOW(zero_plus); sc_fixed<8, 5> zero(0); SHOW(zero); sc_fixed<8, 5> long_max(LONG_MAX); SHOW(long_max); sc_fixed<8, 5> long_min(LONG_MIN); SHOW(long_min); sc_fixed<8, 5> int_max(INT_MAX); SHOW(int_max); sc_fixed<8, 5> int_min(INT_MIN); SHOW(int_min); sc_fixed<8, 5> uint_max(UINT_MAX); SHOW(uint_max); sc_fixed<8, 5> ulong_max(ULONG_MAX); SHOW(ulong_max); sc_fixed<8, 5> double_min(DBL_MIN); SHOW(double_min); sc_fixed<8, 5> double_max(DBL_MAX); SHOW(double_max); sc_fixed<8, 5> float_min(FLT_MIN); SHOW(float_min); sc_fixed<8, 5> float_max(FLT_MAX); SHOW(float_max); // sc_fixed<8, 5> res; // SHOW_EXPS(double_min); // SHOW_EXPS(double_max); // SHOW_EXPS(float_min); // SHOW_EXPS(float_max); }
void test_fx_fix_limits_long(ostream& out) { out << "****************** limits fx_fix_long\n"; sc_fix zero_min("-0"); SHOW(zero_min); sc_fix zero_plus("+0"); SHOW(zero_plus); sc_fix zero(0); SHOW(zero); sc_fix long_max(LONG_MAX); SHOW(long_max); sc_fix long_min(LONG_MIN); SHOW(long_min); sc_fix int_max(INT_MAX); SHOW(int_max); sc_fix int_min(INT_MIN); SHOW(int_min); sc_fix uint_max(UINT_MAX); SHOW(uint_max); sc_fix ulong_max(ULONG_MAX); SHOW(ulong_max); sc_fix double_min(DBL_MIN); SHOW(double_min); sc_fix double_max(DBL_MAX); SHOW(double_max); sc_fix float_min(FLT_MIN); SHOW(float_min); sc_fix float_max(FLT_MAX); SHOW(float_max); // sc_fix res; // SHOW_EXPS(long_max); // SHOW_EXPS(long_min); // SHOW_EXPS(int_max); // SHOW_EXPS(int_min); // SHOW_EXPS(uint_max); // SHOW_EXPS(ulong_max); }
void test_fx_float_limits_zero(ostream& out) { cerr << "****************** limits fx_float_zero\n"; sc_fxval zero_min("-0"); SHOW(zero_min); sc_fxval zero_plus("+0"); SHOW(zero_plus); sc_fxval zero(0); SHOW(zero); sc_fxval nan("NaN"); SHOW(nan); sc_fxval inf_plus("+Inf"); SHOW(inf_plus); sc_fxval inf_min("-Inf"); SHOW(inf_min); sc_fxval inf("Inf"); SHOW(inf); sc_fxval long_max(LONG_MAX); SHOW(long_max); sc_fxval long_min(LONG_MIN); SHOW(long_min); sc_fxval int_max(INT_MAX); SHOW(int_max); sc_fxval int_min(INT_MIN); SHOW(int_min); sc_fxval uint_max(UINT_MAX); SHOW(uint_max); sc_fxval ulong_max(ULONG_MAX); SHOW(ulong_max); sc_fxval double_min(DBL_MIN); SHOW(double_min); sc_fxval double_max(DBL_MAX); SHOW(double_max); sc_fxval float_min(FLT_MIN); SHOW(float_min); sc_fxval float_max(FLT_MAX); SHOW(float_max); sc_fxval res; SHOW_EXPS(zero_min); SHOW_EXPS(zero_plus); SHOW_EXPS(zero); }
/** Solving quadratic equation x, y - relative present position of second ball dx, dy - relative displacement of first ball (second is immobile in this equation) d - sum of radiuses dr - change in radius sum in this quantum of time This function is good both for mobile and immobile balls or points, that change size or not :) */ long double check_collision_between_two_balls(long double x, long double y, long double dx, long double dy, long double d, long double dr){ long double a = dx * dx + dy * dy - dr * dr, b = 2 * (x * dx + y * dy - d * dr); if(a == 0){//linear if(b == 0){ return EMPTY_COLLISION_TIME; }else{ b = -(x * x + y * y - d * d) / b; if(b <= 0 && b >= 1){ return b; }else{ return EMPTY_COLLISION_TIME; } } }else{ d *= d; d = b * b - 4 * a * (x * x + y * y - d);//delta if(d < 0){ return EMPTY_COLLISION_TIME; }else{ b = -b; a *= 2; if(d == 0){ b /= a; if(b >= 0 && b <= 1){ return b; } else{ return EMPTY_COLLISION_TIME; } }else{ d = sqrt(d); x = (b + d) / a; y = (b - d) / a; if(x >= 0 && x <= 1){ if(y >= 0 && y <= 1){ return double_min(x, y); }else{ return x; } }else{ if(y >= 0 && y <= 1){ return y; }else{ return EMPTY_COLLISION_TIME; } } } } } }
int main() { printf("Floating point information:\n"); printf("float radix: %d\n", FLT_RADIX); printf("float exponent size: %d (%d bits)\n", FLT_MAX_EXP, bits(FLT_MAX_EXP)); printf("double exponent size: %d (%d bits)\n", DBL_MAX_EXP, bits(DBL_MAX_EXP)); printf("long double exponent size: %d (%d bits)\n", LDBL_MAX_EXP, bits(LDBL_MAX_EXP)); printf("Ranges:\n"); printf("float: [%f, %f]\n", float_min(), float_max()); printf("float: [%f, %f] (system)\n", FLT_MIN, FLT_MAX); printf("double: [%f, %f]\n", double_min(), double_max()); printf("double: [%f, %f] (system)\n", DBL_MIN, DBL_MAX); printf("long double: [%Lf, %Lf]\n", dlong_min(), dlong_max()); printf("long double: [%Lf, %Lf] (system)\n", LDBL_MIN, LDBL_MAX); return 0; }
int main() { printf("\nFixed Point\n"); printf("____________\n\n"); printf("\nBy Calculation.\n\n"); fixed_range(); printf("\nFrom limits.h\n\n"); header_limits_range(); printf("\nFloating Point"); printf("\n________________\n\n"); printf("\nBy Calculation.\n\n"); float_max(); float_min(); double_max(); double_min(); long_double_max(); printf("\nFrom float.h\n\n"); header_float_range(); return 0; }
collision_data get_collision_with_movable(movable_object *who, movable_object *with_whom){ #define WHO_PLAYER ((movable_player*)who->object_data) #define WITH_PLAYER ((movable_player*)with_whom->object_data) #define WHO_PARTICLE ((movable_particle*)who->object_data) #define WITH_PARTICLE ((movable_particle*)with_whom->object_data) collision_data new_coll; new_coll.time = EMPTY_COLLISION_TIME; long double dr; switch(who->type){ case motPLAYER: if(WHO_PLAYER->shield + WHO_PLAYER->shield_push > WHO_PLAYER->r0){ dr = WHO_PLAYER->shield_push; }else{ dr = 0; } switch(with_whom->type){ case motPLAYER: if(WITH_PLAYER->shield + WITH_PLAYER->shield_push > WITH_PLAYER->r0){ dr += WITH_PLAYER->shield_push; } new_coll.time = check_collision_between_two_balls(WITH_PLAYER->center.x - WHO_PLAYER->center.x, WITH_PLAYER->center.y - WHO_PLAYER->center.y, with_whom->dx - who->dx, with_whom->dy - who->dy, WHO_PLAYER->r + WITH_PLAYER->r, dr); new_coll.time = double_min(new_coll.time, check_collision_between_two_balls(WITH_PLAYER->center.x - WHO_PLAYER->center.x, WITH_PLAYER->center.y - WHO_PLAYER->center.y, with_whom->dx - who->dx, with_whom->dy - who->dy, WHO_PLAYER->r0 + WITH_PLAYER->r0, 0)); break; case motPARTICLE: new_coll.time = check_collision_between_two_balls(WITH_PARTICLE->center.x - WHO_PLAYER->center.x, WITH_PARTICLE->center.y - WHO_PLAYER->center.y, with_whom->dx - who->dx, with_whom->dy - who->dy, WITH_PARTICLE->r + WHO_PLAYER->r, dr); new_coll.time = double_min(new_coll.time, check_collision_between_two_balls(WITH_PARTICLE->center.x - WHO_PLAYER->center.x, WITH_PARTICLE->center.y - WHO_PLAYER->center.y, with_whom->dx - who->dx, with_whom->dy - who->dy, WITH_PARTICLE->r + WHO_PLAYER->r0, 0)); break; default: break; } break; case motPARTICLE: switch(with_whom->type){ case motPLAYER: if(WITH_PLAYER->shield + WITH_PLAYER->shield_push > WITH_PLAYER->r0){ dr = WITH_PLAYER->shield_push; }else{ dr = 0; } new_coll.time = check_collision_between_two_balls(WITH_PLAYER->center.x - WHO_PARTICLE->center.x, WITH_PLAYER->center.y - WHO_PARTICLE->center.y, with_whom->dx - who->dx, with_whom->dy - who->dy, WITH_PLAYER->r + WHO_PARTICLE->r, dr); new_coll.time = double_min(new_coll.time, check_collision_between_two_balls(WITH_PLAYER->center.x - WHO_PARTICLE->center.x, WITH_PLAYER->center.y - WHO_PARTICLE->center.y, with_whom->dx - who->dx, with_whom->dy - who->dy, WITH_PLAYER->r0 + WHO_PARTICLE->r, 0)); break; case motPARTICLE: new_coll.time = check_collision_between_two_balls(WITH_PARTICLE->center.x - WHO_PARTICLE->center.x, WITH_PARTICLE->center.y - WHO_PARTICLE->center.y, with_whom->dx - who->dx, with_whom->dy - who->dy, WITH_PARTICLE->r + WHO_PARTICLE->r, 0); break; default: break; } break; default: break; } #undef WHO_PLAYER #undef WITH_PLAYER #undef WHO_PARTICLE #undef WITH_PARTICLE return new_coll; }
collision_data get_collision_with_primitive(movable_object *who, primitive_object *with_what){ #define WHO_PLAYER ((movable_player*)who->object_data) #define WHO_PARTICLE ((movable_particle*)who->object_data) #define WITH_POINT ((point*)with_what->object_data) #define WITH_SEGMENT ((segment*)(with_what->object_data)) #define WITH_CIRCLE ((circle*)with_what->object_data) #define WITH_EXIT ((fixed_exit*)(((prim_exit*)with_what->object_data)->fixed_data)) collision_data new_coll; long double dr; new_coll.time = EMPTY_COLLISION_TIME; new_coll.with_movable = false; switch(who->type){ case motPLAYER: if(WHO_PLAYER->shield + WHO_PLAYER->shield_push > WHO_PLAYER->r0){ dr = WHO_PLAYER->shield_push; }else{ dr = 0; } switch(with_what->type){ case potPOINT: new_coll.time = check_collision_between_two_balls(WITH_POINT->x - WHO_PLAYER->center.x, WITH_POINT->y - WHO_PLAYER->center.y, who->dx, who->dy, WHO_PLAYER->r, dr); new_coll.time = double_min(new_coll.time, check_collision_between_two_balls(WITH_POINT->x - WHO_PLAYER->center.x, WITH_POINT->y - WHO_PLAYER->center.y, who->dx, who->dy, WHO_PLAYER->r0, 0)); break; case potSEGMENT: new_coll.time = check_collision_between_ball_and_segment(WHO_PLAYER->center.x, WHO_PLAYER->center.y, who->dx, who->dy, WHO_PLAYER->r, dr, WITH_SEGMENT); new_coll.time = double_min(new_coll.time, check_collision_between_ball_and_segment(WHO_PLAYER->center.x, WHO_PLAYER->center.y, who->dx, who->dy, WHO_PLAYER->r0, 0, WITH_SEGMENT)); break; case potCIRCLE: new_coll.time = check_collision_between_two_balls(WITH_CIRCLE->center.x - WHO_PLAYER->center.x, WITH_CIRCLE->center.y - WHO_PLAYER->center.y, who->dx, who->dy, WHO_PLAYER->r + WITH_CIRCLE->r, dr); new_coll.time = double_min(new_coll.time, check_collision_between_two_balls(WITH_CIRCLE->center.x - WHO_PLAYER->center.x, WITH_CIRCLE->center.y - WHO_PLAYER->center.y, who->dx, who->dy, WHO_PLAYER->r0 + WITH_CIRCLE->r, 0)); break; case potEXIT: if(!((prim_exit*)with_what->object_data)->done){ new_coll.time = check_exit(WITH_EXIT->center.x - WHO_PLAYER->center.x, WITH_EXIT->center.y - WHO_PLAYER->center.y, WITH_EXIT); } break; } break; case motPARTICLE: switch(with_what->type){ case potPOINT: new_coll.time = check_collision_between_two_balls(WITH_POINT->x - WHO_PARTICLE->center.x, WITH_POINT->y - WHO_PARTICLE->center.y, who->dx, who->dy, WHO_PARTICLE->r, 0); break; case potSEGMENT: new_coll.time = check_collision_between_ball_and_segment(WHO_PARTICLE->center.x, WHO_PARTICLE->center.y, who->dx, who->dy, WHO_PARTICLE->r, 0, WITH_SEGMENT); break; case potCIRCLE: new_coll.time = check_collision_between_two_balls(WITH_CIRCLE->center.x - WHO_PARTICLE->center.x, WITH_CIRCLE->center.y - WHO_PARTICLE->center.y, who->dx, who->dy, WHO_PARTICLE->r + WITH_CIRCLE->r, 0); break; default: ; } break; default: break; } #undef WHO_PLAYER #undef WHO_PARTICLE #undef WITH_POINT #undef WITH_SEGMENT #undef WITH_CIRCLE #undef WITH_EXIT return new_coll; }