diff --git a/lib/geometry/point3s.h b/lib/geometry/point3s.h index 9e4e5c8..9b60050 100644 --- a/lib/geometry/point3s.h +++ b/lib/geometry/point3s.h @@ -471,32 +471,45 @@ namespace gctl * @param[in] dlon lon间隔 * @param[in] dlat lat间隔 * @param[in] rad 半径值 + * @param[in] cor 网格起始位置 */ template - void get_grid_point3s(array> &out_ps, T lonmin, T lonmax, T latmin, - T latmax, T dlon, T dlat, T rad) + void grid_points_2d(array> &out_ps, T lonmin, T lonmax, T latmin, + T latmax, T dlon, T dlat, T rad, matrix_corner_e cor = BtmLeft) { - if (lonmin >= lonmax || latmin >= latmax || lonmin+dlon>lonmax || latmin+dlat>latmax) + if (lonmin >= lonmax || latmin >= latmax || + lonmin + dlon > lonmax || latmin + dlat > latmax || + dlon <= 0 || dlat <= 0) { - throw invalid_argument("Invalid range parameters. From get_grid_point3s(...)"); + throw invalid_argument("[gctl::grid_points_2d] Invalid parameters."); } - if (dlon <= 0 || dlat <= 0) - { - throw invalid_argument("Invalid interval parameters. From get_grid_point3s(...)"); - } - - int lonnum = floor((lonmax-lonmin)/dlon) + 1; - int latnum = floor((latmax-latmin)/dlat) + 1; + int lonnum = round((lonmax-lonmin)/dlon) + 1; + int latnum = round((latmax-latmin)/dlat) + 1; out_ps.resize(lonnum*latnum); - for (int j = 0; j < latnum; j++) + if (cor == BtmLeft) { - for (int i = 0; i < lonnum; i++) + for (int j = 0; j < latnum; j++) { - out_ps.at(j*lonnum+i).lon = lonmin + dlon*i; - out_ps.at(j*lonnum+i).lat = latmin + dlat*j; - out_ps.at(j*lonnum+i).rad = rad; + for (int i = 0; i < lonnum; i++) + { + out_ps.at(j*lonnum+i).lon = lonmin + dlon*i; + out_ps.at(j*lonnum+i).lat = latmin + dlat*j; + out_ps.at(j*lonnum+i).rad = rad; + } + } + } + else // cor == TopLeft + { + for (int j = 0; j < latnum; j++) + { + for (int i = 0; i < lonnum; i++) + { + out_ps.at(j*lonnum+i).lon = lonmin + dlon*i; + out_ps.at(j*lonnum+i).lat = latmax - dlat*j; + out_ps.at(j*lonnum+i).rad = rad; + } } } return;