35 unsigned int mx_max = grid.size();
36 unsigned int my_max = grid[0].size();
38 unsigned int size =
std::max(mx_max, my_max);
40 unsigned int pow_size = 1;
41 while(pow_size < size) {
47 for(
unsigned int mx = 0; mx < mx_max; ++mx) {
48 pow_grid[mx].
resize(pow_size, 0);
49 for(
unsigned int my = 0; my < my_max; ++my) {
50 pow_grid[mx][my] = grid[mx][my];
54 for(
unsigned int mx = mx_max; mx < pow_size; ++mx) {
55 pow_grid[mx].
resize(pow_size, 0);
64 for(
unsigned int mx = 0; mx < mx_max; ++mx) {
65 visited_grid[mx].
resize(my_max,
false);
69 for(
unsigned int mx = 0; mx < mx_max; ++mx) {
70 for(
unsigned int my = 0; my < my_max; ++my) {
71 double h = grid[mx][my];
73 if (!visited_grid[mx][my] && h > 0) {
74 unsigned int max_x = mx_max;
75 unsigned int max_y = my;
76 for(
unsigned int y2 = my; y2 < my_max && std::abs(grid[mx][y2] - h) < 1e-10; ++y2) {
77 for(
unsigned int x2 = mx; x2 < max_x; ++x2) {
78 if (std::abs(grid[x2][y2] - h) > 1e-10) {
86 for(
unsigned int y2 = my; y2 < max_y; ++y2) {
87 for(
unsigned int x2 = mx; x2 < max_x; ++x2) {
88 visited_grid[x2][y2] =
true;
92 int p0 = hmap.
mesh_.
addPoint(resolution * mx, resolution * my, h);
93 int p1 = hmap.
mesh_.
addPoint(resolution * max_x, resolution * my, h);
94 int p2 = hmap.
mesh_.
addPoint(resolution * mx, resolution * max_y, h);
95 int p3 = hmap.
mesh_.
addPoint(resolution * max_x, resolution * max_y, h);
104 for(
unsigned int mx = 0; mx <= mx_max; ++mx) {
109 for(
unsigned int my = 0; my <= my_max; ++my) {
111 if (mx < mx_max && my < my_max) {
116 if (mx > 0 && my < my_max) {
117 h2 = grid[mx - 1][my];
121 if (std::abs(h - h_last) + std::abs(h2 - h2_last) > 1e-10) {
123 int p0 = hmap.
mesh_.
addPoint(resolution * mx, resolution * my_start, h_last);
124 int p1 = hmap.
mesh_.
addPoint(resolution * mx, resolution * my, h_last);
125 int p2 = hmap.
mesh_.
addPoint(resolution * mx, resolution * my_start, h2_last);
126 int p3 = hmap.
mesh_.
addPoint(resolution * mx, resolution * my, h2_last);
131 if (std::abs(h - h2) > 1e-10) {
137 }
else if (std::abs(h - h2) > 1e-10) {
147 for(
unsigned int my = 0; my <= my_max; ++my) {
151 for(
unsigned int mx = 0; mx <= mx_max; ++mx) {
153 if (mx < mx_max && my < my_max) {
158 if (my > 0 && mx < mx_max) {
159 h2 = grid[mx][my - 1];
163 if (std::abs(h - h_last) + std::abs(h2 - h2_last) > 1e-10) {
165 int p0 = hmap.
mesh_.
addPoint(resolution * mx_start, resolution * my, h_last);
166 int p1 = hmap.
mesh_.
addPoint(resolution * mx, resolution * my, h_last);
167 int p2 = hmap.
mesh_.
addPoint(resolution * mx_start, resolution * my, h2_last);
168 int p3 = hmap.
mesh_.
addPoint(resolution * mx, resolution * my, h2_last);
173 if (std::abs(h - h2) > 1e-10) {
179 }
else if (std::abs(h - h2) > 1e-10) {
195 unsigned int mx_min,
unsigned int my_min,
196 unsigned int mx_max,
unsigned int my_max,
double resolution) {
198 double max_height = 0;
199 for(
unsigned int mx = mx_min; mx < mx_max; ++mx) {
200 for(
unsigned int my = my_min; my < my_max; ++my) {
201 max_height =
std::max(max_height, map[mx][my]);
205 if (max_height == 0) {
209 Vector3 min_map((
double)mx_min * resolution,
210 (
double)my_min * resolution, 0);
211 Vector3 max_map((
double)mx_max * resolution,
212 (
double)my_max * resolution, max_height);
216 if (mx_max - mx_min == 1 || my_max - my_min == 1) {
217 assert(mx_max - mx_min == 1 && my_max - my_min == 1);
223 unsigned int cx = (mx_max + mx_min) / 2;
224 unsigned int cy = (my_max + my_min) / 2;