You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于muPDF库API文档中矩阵变换顺序的疑问

问题解答:muPDF pre系列矩阵变换的顺序逻辑

首先明确两个核心点:C语言嵌套函数的执行顺序,以及muPDF pre_*函数的定义。

1. C语言嵌套函数的执行顺序

对于fn3(fn2(fn1(x)))这类嵌套调用,确实是从内到外执行:先调用fn1(x),再将其结果传入fn2,最后将fn2的结果传入fn3。对应到你的代码:

ctm = fz_pre_translate(fz_pre_rotate(fz_scale(sx, sy), r), tx, ty);

执行顺序是:

  • 第一步:调用fz_scale(sx, sy)生成缩放矩阵
  • 第二步:将缩放矩阵传入fz_pre_rotate生成新矩阵
  • 第三步:将第二步的矩阵传入fz_pre_translate得到最终CTM

2. muPDF pre_*函数的核心定义

根据muPDF API文档,pre_*系列函数的关键是将新变换操作应用于现有矩阵所代表的变换链的最前面——也就是先执行新操作,再执行之前所有已定义的变换。

用数学变换复合的逻辑解释(A∘B表示先执行B,再执行A):

  • 调用fz_pre_rotate(S, r)(S是缩放矩阵):生成的矩阵是S∘R,对应变换顺序为「先旋转(R),再缩放(S)」
  • 再调用fz_pre_translate(S∘R, tx, ty):生成的矩阵是(S∘R)∘T,对应变换顺序为「先平移(T),再旋转(R),最后缩放(S)」

最终结论

这段代码构建的矩阵变换顺序是:平移 → 旋转 → 缩放,和C语言嵌套函数的执行顺序(缩放→旋转→平移)完全相反,核心原因是pre_*函数会把新变换插入到现有变换链的最前端,而非追加到末尾。

内容的提问来源于stack exchange,提问作者George Robinson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 18:10:48