齐河极地海洋世界门票:AGG 插值器(Interpolator)
来源:百度文库 编辑:九乡新闻网 时间:2024/10/05 22:46:26
AGG 插值器(Interpolator)2010-07-11 21:57
插值器Interpolator
插值器的作用是连接目标位置和源位置,比如要填充一个8*8的图形,对应的填充源是一个4*4的图像,一种简单的线性插值器就要根据目标的位置线性计算得到源对应的位置,如目标点(4,4)、(4,5)、(5,4)、(5,5)这几个位置点对应到源的(2,2)点上。
头文件
- #include
- #include
- #include
- #include
类型
- template
- class agg::span_interpolator_linear
- template
- class agg::span_interpolator_linear_subdiv
- template
- class agg::span_interpolator_persp_exact
- template
- class agg::span_interpolator_persp_lerp
- template
- class agg::span_interpolator_trans
不同的插值器对于不同的变换有各自的优势,对于大部分应用来说,span_interpolator_linear是比较简单高效的。
实验代码,使用span_interpolator_persp_lerp
把上面的演示代码里的interpolator_type改成span_interpolator_persp_lerp,这是一个透视变换的插值器,输入为源四个角的坐标和目标的四个角上的坐标。
- ...
- // 插值器
- //typedef agg::span_interpolator_linear<> interpolator_type; //插值器类型
- //agg::trans_affine img_mtx; // 变换矩阵不需要了
- //interpolator_type ip(img_mtx); // 插值器
- typedef agg::span_interpolator_persp_lerp<> interpolator_type; //插值器类型
- const double offset = 50; // 偏移
- const double scale = 0.5; // 缩放倍数
- double src[8]={offset+0,offset+0,
- offset+pm_img.width()*scale,offset+0,
- offset+pm_img.width()*scale,offset+pm_img.height()*scale,
- offset+0,offset+pm_img.height()*scale
- }; //源四角坐标,按偏移和缩放倍数改变一哈
- double dst[8]={0,0,
- pm_img.width(),0,
- pm_img.width()+100,pm_img.height(),
- 100,pm_img.height()-100
- }; //目标四角坐标,左右乱扯一哈
- interpolator_type ip(src,dst);
- ...
最后别忘了把img_mtx相关代码注释掉:
- //img_mtx.scale(0.5);
- //img_mtx.translate(40,40);
- //img_mtx.invert(); //注意这里
显示效果:
变换器Transformer
注意一下我们前面用的span_interpolator_linear,以及曾经使用过的conv_transform,默认的模板参数Transformer为trans_affine。我们已经知道trans_affine是一个2*3的变换矩阵。在AGG中,变换器不仅仅只有矩阵,这里将要介绍的就是其它的一些变换器。
头文件
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
类型
- agg::trans_affine
- agg::trans_bilinear
- agg::trans_single_path
- agg::trans_double_path
- agg::trans_perspective
- agg::trans_viewport
- agg::trans_warp_magnifier
实验代码,使用trans_warp_magnifier
同样把示例代码中的插值器部分改成下列代码
- ...
- // 插值器
- //typedef agg::span_interpolator_linear<> interpolator_type; //插值器类型
- //agg::trans_affine img_mtx; // 变换矩阵
- //interpolator_type ip(img_mtx); // 插值器
- typedef agg::span_interpolator_trans<
- agg::trans_warp_magnifier // 使用trans_warp_magnifier
- > interpolator_type; //插值器类型
- agg::trans_warp_magnifier mag;
- interpolator_type ip(mag);
- mag.magnification(0.5);
- mag.center(100,100);
- mag.radius(50);
- ...
建议把后面的ras.add_path(ell)改成ras.add_path(ccell),画得大一点好看清效果,呵呵