/* PM Example 1 */ #include #include #include #include "pm.h" #define RANGE_MIN 0 #define RANGE_MAX 1000 #define RANGE_INC 100 #define RANGE_ZERO 200 int main(int argc, char *argv[]) { PMAtmosphere at; PMWind w; PMWindData wd[2]; PMBullet b; PMBC bcs[2]; PMFirearm f; PMTrajectory tj; pPMOutputData td; PMOutput ot; double v, x_moa, z_moa; int i; long size, count; char error_buffer[128]; /* Atmosphere */ at.mode = PM_ATMOS_STANDARD; pm_set_value(&at.altitude, PM_UNITS_FT, 0); if (PM_RETURN_SUCCESS != pm_atmosphere(&at)) { pm_get_error_info(error_buffer, sizeof(error_buffer)); printf("Error code = %ld, Info = %s\n", pm_get_last_error(), error_buffer); } /* Wind */ w.data = wd; w.count = 1; pm_set_value(&wd[0].range, PM_UNITS_YD, 0.0); pm_set_value(&wd[0].wind_x, PM_UNITS_MPH, 10.0); pm_set_value(&wd[0].wind_y, PM_UNITS_MPH, 0.0); pm_set_value(&wd[0].wind_z, PM_UNITS_MPH, 0.0); /* Bullet */ pm_set_value(&b.weight, PM_UNITS_GRN, 168.0); pm_set_value(&b.caliber, PM_UNITS_IN, 0.308); b.bcs = bcs; b.drag_func = PM_DRAG_FUNCTION_G1; b.count = 1; pm_set_value(&bcs[0].velocity, PM_UNITS_FPS, 0.0); bcs[0].bc = 0.5; /* Firearm */ pm_set_value(&f.chrono_velocity, PM_UNITS_FPS, 3000.0); pm_set_value(&f.chrono_distance, PM_UNITS_FT, 10.0); pm_set_value(&f.elevation, PM_UNITS_RAD, 0.0); pm_set_value(&f.windage, PM_UNITS_RAD, 0.0); pm_set_value(&f.line_of_sight, PM_UNITS_DEG, 0.0); pm_set_value(&f.cant, PM_UNITS_DEG, 0.0); pm_set_value(&f.sight_height, PM_UNITS_IN, 1.5); pm_set_value(&f.sight_offset, PM_UNITS_IN, 0.0); pm_set_value(&f.zero_height, PM_UNITS_IN, 0.0); pm_set_value(&f.zero_offset, PM_UNITS_IN, 0.0); /* Trajectory */ tj.atmosphere = &at; tj.bullet = &b; tj.firearm = &f; tj.wind = &w; tj.range_min = RANGE_MIN; tj.range_inc = RANGE_INC; tj.range_max = RANGE_MAX; tj.range_zero = RANGE_ZERO; tj.mode = PM_TRAJ_INTEG_YARDS; pm_trajectory_count(&tj, &count); pm_trajectory_size(&tj, &size); td = malloc(size); if (NULL != td) { ot.count = count; ot.data = td; } pm_trajectory_set_option(&tj, PM_TRAJ_CORRECT_WINDAGE, 0); pm_trajectory_set_option(&tj, PM_TRAJ_CORRECT_ELEVATION, 1); pm_trajectory_set_option(&tj, PM_TRAJ_CORRECT_CHRONO, 1); pm_trajectory_set_option(&tj, PM_TRAJ_TRAJECTORY, 1); pm_trajectory_set_option(&tj, PM_TRAJ_POINT_BLANK_RANGE, 1); pm_trajectory_set_option(&tj, PM_TRAJ_POINT_BLANK_RANGE_ZERO, 1); if (PM_RETURN_SUCCESS == pm_trajectory(&tj, &ot)) { printf("%6s %6s %6s %6s %6s %6s %6s %6s %6s %6s\n", "Range", "Drop", "Drop", "Wind", "Wind", "Vel", "Mach", "Energy", "Mom", "Time"); printf("%6s %6s %6s %6s %6s %6s %6s %6s %6s %6s\n", "(yard)", "(in)", "(moa)", "(in)", "(moa)", "(f/s)", "", "(f-lb)", "(lb-s)", "(s)"); for (i = 0; i < ot.count; i++) { pm_output_drop(&ot.data[i], PM_UNITS_MOA, &z_moa); pm_output_windage(&ot.data[i], PM_UNITS_MOA, &x_moa); pm_get_value(&ot.data[i].range, PM_UNITS_YD, &v); printf("%6.1f ", v); pm_get_value(&ot.data[i].drop, PM_UNITS_IN, &v); printf("%6.1f %6.1f ", v, z_moa); pm_get_value(&ot.data[i].windage, PM_UNITS_IN, &v); printf("%6.1f %6.1f ", v, x_moa); pm_get_value(&ot.data[i].velocity, PM_UNITS_FPS, &v); printf("%6.1f ", v); pm_get_value(&ot.data[i].mach, PM_UNITS_NONE, &v); printf("%6.3f ", v); pm_get_value(&ot.data[i].energy, PM_UNITS_FTLB, &v); printf("%6.1f ", v); pm_get_value(&ot.data[i].momentum, PM_UNITS_LBS, &v); printf("%6.3f ", v); pm_get_value(&ot.data[i].time, PM_UNITS_SEC, &v); printf("%6.3f\n", v); } printf("\nMaximum point blank range = %d\n", ot.pbr_max_range); printf("Maximum point blank zero = %d\n", ot.pbr_zero_range); printf("Range at maximum height = %d\n", ot.pbr_mid_range); } else { pm_get_error_info(error_buffer, sizeof(error_buffer)); printf("Error code = %ld, Info = %s\n", pm_get_last_error(), error_buffer); } return (0); }