分享

AGG 插值器(Interpolator)

 lhzstudio 2011-10-15
AGG 插值器(Interpolator)
2010-07-11 21:57

插值器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(); //注意这里

显示效果:

span_interpolator_persp_lerp

变换器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),画得大一点好看清效果,呵呵

显示效果

trans_warp_magnifier

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多