Changeset 61096


Ignore:
Timestamp:
Jul 1, 2014, 2:24:45 AM (10 years ago)
Author:
zarch
Message:

r.horizon: Change parameters name as discussed in #2338, add new parameters: start and end as discussed in #2331, and change the output name using the angle instead of the angle index, as discussed in #2332

File:
1 edited

Legend:

Unmodified
Added
Removed
  • grass/trunk/raster/r.horizon/main.c

    r58552 r61096  
    7070const char *mapset = NULL;
    7171const char *per;
    72 char shad_filename[GNAME_MAX];
     72char *shad_filename;
    7373char *outfile;
    7474
     
    120120int d, day, tien = 0;
    121121
    122 double length, maxlength = BIG, zmult = 1.0, step = 0.0, dist;
    123 double fixedMaxLength = BIG;
     122double length, maxlength = BIG, zmult = 1.0, dist;
     123double fixedMaxLength = BIG, step = 0.0, start = 0.0, end = 0.0;
    124124char *tt, *lt;
    125125double z_orig, zp;
     
    128128    distcosangle;
    129129double TOLER;
     130const char *str_step;
    130131
    131132int mode;
     
    141142int ll_correction = FALSE;
    142143double coslatsq;
     144
    143145
    144146/* why not use G_distance() here which switches to geodesic/great
     
    156158
    157159
    158 
    159160int main(int argc, char *argv[])
    160161{
     
    164165    struct
    165166    {
    166         struct Option *elevin, *dist, *coord, *direction, *horizon, *step,
    167             *bufferzone, *e_buff, *w_buff, *n_buff, *s_buff, *maxdistance, *output;
     167        struct Option *elevin, *dist, *coord, *direction, *horizon,
     168                      *step, *start, *end, *bufferzone, *e_buff, *w_buff,
     169                      *n_buff, *s_buff, *maxdistance, *output;
    168170    } parm;
    169171
     
    190192         " counterclockwise with east=0, north=90 etc. The output is the horizon height in radians.");
    191193
    192     parm.elevin = G_define_option();
    193     parm.elevin->key = "elev_in";
    194     parm.elevin->type = TYPE_STRING;
    195     parm.elevin->required = YES;
    196     parm.elevin->gisprompt = "old,cell,raster";
    197     parm.elevin->description =
    198         _("Name of the input elevation raster map [meters]");
     194    parm.elevin = G_define_standard_option(G_OPT_R_ELEV);
    199195    parm.elevin->guisection = _("Input options");
    200196
     
    209205
    210206    parm.step = G_define_option();
    211     parm.step->key = "horizon_step";
     207    parm.step->key = "step";
    212208    parm.step->type = TYPE_DOUBLE;
    213209    parm.step->required = NO;
     
    215211        _("Angle step size for multidirectional horizon [degrees]");
    216212    parm.step->guisection = _("Input options");
     213
     214    parm.start = G_define_option();
     215    parm.start->key = "start";
     216    parm.start->type = TYPE_DOUBLE;
     217    parm.start->answer = "0.0";
     218    parm.start->required = NO;
     219    parm.start->description =
     220        _("Start angle for multidirectional horizon [degrees]");
     221    parm.start->guisection = _("Input options");
     222
     223    parm.end = G_define_option();
     224    parm.end->key = "end";
     225    parm.end->type = TYPE_DOUBLE;
     226    parm.end->answer = "360.0";
     227    parm.end->required = NO;
     228    parm.end->description =
     229        _("End angle for multidirectional horizon [degrees]");
     230    parm.end->guisection = _("Input options");
    217231
    218232    parm.bufferzone = G_define_option();
     
    265279
    266280
    267     parm.horizon = G_define_option();
    268     parm.horizon->key = "horizon";
    269     parm.horizon->type = TYPE_STRING;
     281    parm.horizon = G_define_standard_option(G_OPT_R_BASENAME_OUTPUT);
    270282    parm.horizon->required = NO;
    271     parm.horizon->gisprompt = "old,cell,raster";
    272     parm.horizon->description = _("Prefix of the horizon raster output maps");
    273283    parm.horizon->guisection = _("Output options");
    274284
     
    342352
    343353    if (parm.coord->answer == NULL) {
     354        G_debug(1, "Setting mode: WHOLE_RASTER");
    344355        setMode(WHOLE_RASTER);
    345356    }
    346357    else {
     358        G_debug(1, "Setting mode: SINGLE_POINT");
    347359        setMode(SINGLE_POINT);
    348360        if (sscanf(parm.coord->answer, "%lf,%lf", &xcoord, &ycoord) != 2) {
     
    384396        horizon = parm.horizon->answer;
    385397        if (parm.step->answer != NULL)
     398            str_step = parm.step->answer;
    386399            sscanf(parm.step->answer, "%lf", &step);
     400        sscanf(parm.start->answer, "%lf", &start);
     401        sscanf(parm.end->answer, "%lf", &end);
     402        if (start < 0.0) {
     403            G_fatal_error(
     404                _("Negative values of start angle are not allowed. Aborting."));
     405        }
     406        if (end < 0.0 || end > 360.0) {
     407            G_fatal_error(
     408                _("End angle is not between 0 and 360. Aborting."));
     409        }
     410        if (start >= end) {
     411            G_fatal_error(
     412                _("You specify a start grater than the end angle. Aborting."));
     413        }
     414        G_debug(1, "Angle step: %g, start: %g, end: %g", step, start, end);
    387415    }
    388416    else {
     
    393421        }
    394422        sscanf(parm.step->answer, "%lf", &step);
    395 
    396 
    397423    }
    398424
     
    10141040{
    10151041    int i, j, l, k = 0;
    1016     int numDigits;
     1042    size_t numDigits = 3;
     1043    size_t decimals, add;
    10171044
    10181045    int xindex, yindex;
     
    10271054    double delt_dist;
    10281055
    1029     char formatString[10];
     1056    char *formatString;
    10301057    char msg_buff[256];
    10311058
     
    10401067
    10411068    int arrayNumInt;
    1042     double dfr_rad;
     1069    int start_indx;
     1070    double dfr_rad, start_rad, angle_deg;
    10431071
    10441072    xindex = (int)((xcoord - xmin) / stepx);
     
    11041132        else {
    11051133            dfr_rad = step * deg2rad;
    1106             arrayNumInt = (int)(360. / fabs(step));
    1107         }
    1108 
    1109         numDigits = (int)(log10(1. * arrayNumInt)) + 1;
    1110         sprintf(formatString, "%%s_%%0%dd", numDigits);
     1134            start_rad = start * deg2rad;
     1135            arrayNumInt = (int)((end - start) / fabs(step));
     1136            start_indx = (int)(start / step);
     1137        }
     1138
     1139        /* numDigits = (int)(log10(1. * arrayNumInt)) + 1;
     1140        sprintf(formatString, "%%s_%%0%dd", numDigits); */
     1141
     1142        decimals = G_get_num_decimals(str_step);
    11111143
    11121144        for (k = 0; k < arrayNumInt; k++) {
    11131145           struct History history;
    11141146
    1115             if (step != 0.0)
    1116                 sprintf(shad_filename, formatString, horizon, k);
    1117 
    1118             angle = (single_direction * deg2rad) + (dfr_rad * k);
     1147            angle = (start + single_direction) * deg2rad + (dfr_rad * k);
     1148            angle_deg = angle * rad2deg + 0.0001;
     1149
     1150            if (step != 0.0)
     1151                 shad_filename = G_generate_basename(horizon, angle_deg, 3, decimals);
     1152
    11191153            /*             
    11201154               com_par(angle);
    11211155             */
    11221156            G_message(_("Calculating map %01d of %01d (angle %.2f, raster map <%s>)"),
    1123                      (k + 1), arrayNumInt, angle * rad2deg, shad_filename);
     1157                     (k + 1), arrayNumInt, angle_deg, shad_filename);
    11241158
    11251159            for (j = hor_row_start; j < hor_row_end; j++) {
     
    12651299
    12661300            Rast_write_history(shad_filename, &history);
    1267         }
    1268     }
    1269 }
     1301            G_free(shad_filename);
     1302        }
     1303    }
     1304}
Note: See TracChangeset for help on using the changeset viewer.