AGG 插值器(Interpolator)

本文详细介绍了AGG库中的插值器和变换器,包括不同类型的插值器如span_interpolator_linear和变换器如trans_warp_magnifier,并通过实验代码展示了它们的应用效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

插值器Interpolator

插值器的作用是连接目标位置和源位置,比如要填充一个8*8的图形,对应的填充源是一个4*4的图像,一种简单的线性插值器就要根据目标的位置线性计算得到源对应的位置,如目标点(4,4)、(4,5)、(5,4)、(5,5)这几个位置点对应到源的(2,2)点上。

头文件
  1. #include <agg_span_interpolator_linear.h>
  2. #include <agg_span_interpolator_persp.h>
  3. #include <agg_span_interpolator_trans.h>
类型
  1. template<class Transformer = trans_affine, unsigned SubpixelShift = 8>
  2. class agg::span_interpolator_linear
  3. template<class Transformer = trans_affine, unsigned SubpixelShift = 8>
  4. class agg::span_interpolator_linear_subdiv
  5. template<unsigned SubpixelShift = 8>
  6. class agg::span_interpolator_persp_exact
  7. template<unsigned SubpixelShift = 8>
  8. class agg::span_interpolator_persp_lerp
  9. template<class Transformer, unsigned SubpixelShift = 8>
  10. class agg::span_interpolator_trans

不同的插值器对于不同的变换有各自的优势,对于大部分应用来说,span_interpolator_linear是比较简单高效的。

实验代码,使用span_interpolator_persp_lerp

上面的演示代码里的interpolator_type改成span_interpolator_persp_lerp,这是一个透视变换的插值器,输入为源四个角的坐标和目标的四个角上的坐标。

  1. ...
  2. // 插值器
  3. //typedef agg::span_interpolator_linear<> interpolator_type; //插值器类型
  4. //agg::trans_affine img_mtx; // 变换矩阵不需要了
  5. //interpolator_type ip(img_mtx); // 插值器
  6. typedef agg::span_interpolator_persp_lerp<> interpolator_type; //插值器类型
  7. const double offset = 50; // 偏移
  8. const double scale = 0.5; // 缩放倍数
  9. double src[8]={offset+0,offset+0,
  10.      offset+pm_img.width()*scale,offset+0,
  11.      offset+pm_img.width()*scale,offset+pm_img.height()*scale,
  12.      offset+0,offset+pm_img.height()*scale
  13. }; //源四角坐标,按偏移和缩放倍数改变一哈
  14. double dst[8]={0,0,
  15.      pm_img.width(),0,
  16.      pm_img.width()+100,pm_img.height(),
  17.      100,pm_img.height()-100
  18. }; //目标四角坐标,左右乱扯一哈
  19. interpolator_type ip(src,dst);
  20. ...

最后别忘了把img_mtx相关代码注释掉:

  1. //img_mtx.scale(0.5);
  2. //img_mtx.translate(40,40);
  3. //img_mtx.invert(); //注意这里
显示效果:

变换器Transformer

注意一下我们前面用的span_interpolator_linear,以及曾经使用过的conv_transform,默认的模板参数Transformer为trans_affine。我们已经知道trans_affine是一个2*3的变换矩阵。在AGG中,变换器不仅仅只有矩阵,这里将要介绍的就是其它的一些变换器。

头文件
  1. #include <agg_trans_affine.h>
  2. #include <agg_trans_bilinear.h>
  3. #include <agg_trans_single_path.h>
  4. #include <agg_trans_double_path.h>
  5. #include <agg_trans_perspective.h>
  6. #include <agg_trans_viewport.h>
  7. #include <agg_trans_warp_magnifier.h>
类型
  1. agg::trans_affine
  2. agg::trans_bilinear
  3. agg::trans_single_path
  4. agg::trans_double_path
  5. agg::trans_perspective
  6. agg::trans_viewport
  7. agg::trans_warp_magnifier
实验代码,使用trans_warp_magnifier

同样把示例代码中的插值器部分改成下列代码

  1. ...
  2. // 插值器
  3. //typedef agg::span_interpolator_linear<> interpolator_type; //插值器类型
  4. //agg::trans_affine img_mtx; // 变换矩阵
  5. //interpolator_type ip(img_mtx); // 插值器
  6. typedef agg::span_interpolator_trans<
  7.      agg::trans_warp_magnifier // 使用trans_warp_magnifier
  8. > interpolator_type; //插值器类型
  9. agg::trans_warp_magnifier mag;
  10. interpolator_type ip(mag);
  11. mag.magnification(0.5);
  12. mag.center(100,100);
  13. mag.radius(50);
  14. ...

建议把后面的ras.add_path(ell)改成ras.add_path(ccell),画得大一点好看清效果,呵呵

显示效果


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值