@@ -103,10 +103,63 @@ void ifft2(const ComplexMatrix& input, MatrixXd& output) {
103
103
}
104
104
}
105
105
106
+ void pad (int &w, int &h, std::vector<float > &normals, int padding) {
107
+ int W = w + padding;
108
+ int H = h + padding;
109
+ std::vector<float > n (W*H*3 );
110
+ for (int y = 0 ; y < H; y++) {
111
+ for (int x = 0 ; x < W; x++) {
112
+ int X = x - padding;
113
+ int Y = y - padding;
114
+ if (x < padding) {
115
+ X = padding -x;
116
+ }
117
+
118
+ if (x >= w + padding) {
119
+ X = 2 *w + padding - 1 - x;
120
+ }
121
+
122
+ if (y < padding) {
123
+ Y = padding - y;
124
+ }
125
+
126
+ if (y >= h + padding) {
127
+ Y = 2 *h + padding - 1 - y;
128
+ Y = H - padding + h - 1 -y;
129
+ }
130
+ for (int k = 0 ; k < 3 ; k++)
131
+ n[3 *(x + y*W) + k] = normals[3 *(X + Y*w) + k];
132
+ assert (!isnan (n[x + y*W]));
133
+ }
134
+ }
135
+ w = W;
136
+ h = H;
137
+ swap (normals, n);
138
+ }
139
+
140
+ void depad (int &w, int &h, std::vector<float > &heights, int padding) {
141
+
142
+ int W = w;
143
+ int H = h;
144
+ w -= padding;
145
+ h -= padding;
146
+ std::vector<float > elev (w*h);
147
+ for (int y = 0 ; y < h; y++) {
148
+ for (int x = 0 ; x < w; x++) {
149
+ elev[x + w*y] = heights[x + padding + (y + padding)*W];
150
+ }
151
+ }
152
+ swap (elev, heights);
153
+ }
154
+
106
155
void fft_integrate (std::function<bool (QString s, int n)> progressed,
107
156
int cols, int rows, std::vector<float> &normals, std::vector<float> &heights) {
108
157
109
158
159
+ int minsize = std::min (cols, rows);
160
+ int padding = minsize/4 ;
161
+ pad (cols, rows, normals, padding);
162
+
110
163
111
164
MatrixXd dzdx (rows, cols);
112
165
MatrixXd dzdy (rows, cols);
@@ -152,6 +205,8 @@ void fft_integrate(std::function<bool(QString s, int n)> progressed,
152
205
}
153
206
}
154
207
208
+ depad (cols, rows, heights, padding);
209
+
155
210
/*
156
211
[wx, wy] = meshgrid(([1:cols]-(fix(cols/2)+1))/(cols-mod(cols,2)), ...
157
212
([1:rows]-(fix(rows/2)+1))/(rows-mod(rows,2)));
0 commit comments