using AGG for interpolating when warping (for real now)
This commit is contained in:
parent
226e382214
commit
1edc6ceceb
1 changed files with 9 additions and 34 deletions
|
@ -72,10 +72,8 @@ static inline void resample_raster(raster &target, raster const& source,
|
||||||
CoordTransform tt(target.data_.width(), target.data_.height(),
|
CoordTransform tt(target.data_.width(), target.data_.height(),
|
||||||
target.ext_, offset_x, offset_y);
|
target.ext_, offset_x, offset_y);
|
||||||
unsigned i, j, mesh_size=16;
|
unsigned i, j, mesh_size=16;
|
||||||
unsigned mesh_nx = ceil(target.data_.width()/double(mesh_size)+1);
|
unsigned mesh_nx = ceil(source.data_.width()/double(mesh_size)+1);
|
||||||
unsigned mesh_ny = ceil(target.data_.height()/double(mesh_size)+1);
|
unsigned mesh_ny = ceil(source.data_.height()/double(mesh_size)+1);
|
||||||
double source_dx = source.data_.width()/double(mesh_nx-1);
|
|
||||||
double source_dy = source.data_.height()/double(mesh_ny-1);
|
|
||||||
|
|
||||||
ImageData<double> xs(mesh_nx, mesh_ny);
|
ImageData<double> xs(mesh_nx, mesh_ny);
|
||||||
ImageData<double> ys(mesh_nx, mesh_ny);
|
ImageData<double> ys(mesh_nx, mesh_ny);
|
||||||
|
@ -85,33 +83,11 @@ static inline void resample_raster(raster &target, raster const& source,
|
||||||
for (i=0; i<mesh_nx; i++) {
|
for (i=0; i<mesh_nx; i++) {
|
||||||
xs(i,j) = i*mesh_size+.5;
|
xs(i,j) = i*mesh_size+.5;
|
||||||
ys(i,j) = j*mesh_size+.5;
|
ys(i,j) = j*mesh_size+.5;
|
||||||
tt.backward(&xs(i,j), &ys(i,j));
|
ts.backward(&xs(i,j), &ys(i,j));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
prj_trans.forward(xs.getData(), ys.getData(), NULL, mesh_nx*mesh_ny);
|
prj_trans.backward(xs.getData(), ys.getData(), NULL, mesh_nx*mesh_ny);
|
||||||
|
|
||||||
for(j=0; j<mesh_ny-1; j++) {
|
|
||||||
for (i=0; i<mesh_nx-1; i++) {
|
|
||||||
box2d<double> win(xs(i,j), ys(i,j), xs(i+1,j+1), ys(i+1,j+1));
|
|
||||||
win = ts.forward(win);
|
|
||||||
CoordTransform tw(mesh_size, mesh_size, win);
|
|
||||||
unsigned x, y;
|
|
||||||
for (y=0; y<mesh_size; y++) {
|
|
||||||
for (x=0; x<mesh_size; x++) {
|
|
||||||
double x2=x, y2=y;
|
|
||||||
tw.backward(&x2,&y2);
|
|
||||||
if (x2>=0 && x2<source.data_.width() &&
|
|
||||||
y2>=0 && y2<source.data_.height())
|
|
||||||
{
|
|
||||||
target.data_(i*mesh_size+x,(j+1)*mesh_size-y) =\
|
|
||||||
source.data_((unsigned)x2,(unsigned)y2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
// warp image using projected mesh points using bilinear interpolation
|
// warp image using projected mesh points using bilinear interpolation
|
||||||
// inside mesh cell
|
// inside mesh cell
|
||||||
typedef agg::pixfmt_rgba32 pixfmt;
|
typedef agg::pixfmt_rgba32 pixfmt;
|
||||||
|
@ -133,7 +109,7 @@ static inline void resample_raster(raster &target, raster const& source,
|
||||||
for(j=0; j<mesh_ny-1; j++) {
|
for(j=0; j<mesh_ny-1; j++) {
|
||||||
for (i=0; i<mesh_nx-1; i++) {
|
for (i=0; i<mesh_nx-1; i++) {
|
||||||
box2d<double> win(xs(i,j), ys(i,j), xs(i+1,j+1), ys(i+1,j+1));
|
box2d<double> win(xs(i,j), ys(i,j), xs(i+1,j+1), ys(i+1,j+1));
|
||||||
win = ts.forward(win);
|
win = tt.forward(win);
|
||||||
double polygon[8] = {win.minx(), win.miny(),
|
double polygon[8] = {win.minx(), win.miny(),
|
||||||
win.maxx(), win.miny(),
|
win.maxx(), win.miny(),
|
||||||
win.maxx(), win.maxy(),
|
win.maxx(), win.maxy(),
|
||||||
|
@ -159,10 +135,10 @@ static inline void resample_raster(raster &target, raster const& source,
|
||||||
typedef agg::image_accessor_clone<pixfmt> img_accessor_type;
|
typedef agg::image_accessor_clone<pixfmt> img_accessor_type;
|
||||||
img_accessor_type ia(pixf_tile);
|
img_accessor_type ia(pixf_tile);
|
||||||
|
|
||||||
unsigned x0 = i * source_dx;
|
unsigned x0 = i * mesh_size;
|
||||||
unsigned y0 = j * source_dy;
|
unsigned y0 = j * mesh_size;
|
||||||
unsigned x1 = (i+1) * source_dx;
|
unsigned x1 = (i+1) * mesh_size;
|
||||||
unsigned y1 = (j+1) * source_dy;
|
unsigned y1 = (j+1) * mesh_size;
|
||||||
|
|
||||||
agg::trans_bilinear tr(polygon, x0, y0, x1, y1);
|
agg::trans_bilinear tr(polygon, x0, y0, x1, y1);
|
||||||
|
|
||||||
|
@ -182,7 +158,6 @@ static inline void resample_raster(raster &target, raster const& source,
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue