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

如何合并多个Scale变换得到结果缩放以恢复ItemsControl视图?

合并多个ScaleAt变换为单一等效变换

要将连续的多个ScaleAt操作合并为一个等效的变换,核心是利用WPF中Matrix的乘法特性,先计算出组合后的变换矩阵,再从矩阵中反推出对应的单一ScaleAt参数。

步骤1:组合变换矩阵

WPF中,变换的顺序是先执行的变换矩阵放在乘法右侧。比如先执行matrix1再执行matrix2,组合后的矩阵为matrix2 * matrix1(后应用的变换乘在前一个矩阵的左侧)。

针对你给出的示例代码:

Matrix matrix1 = new();
matrix1.ScaleAt(0.5, 0.5, 100, 0);

Matrix matrix2 = new();
matrix2.ScaleAt(0.5, 0.5, 0, 0);

// 组合两个变换:先执行matrix1,再执行matrix2
Matrix combinedMatrix = matrix2 * matrix1;

步骤2:从组合矩阵提取等效ScaleAt参数

ScaleAt(sx, sy, cx, cy)对应的变换矩阵可拆解为:先将坐标原点平移到缩放中心的反方向,执行缩放,再平移回原中心。展开后的矩阵形式为:

[ sx   0   cx*(1-sx) ]
[  0  sy   cy*(1-sy) ]
[  0   0        1    ]

基于这个公式,我们可以从组合后的矩阵反推参数:

  • 缩放因子:sx = combinedMatrix.M11,sy = combinedMatrix.M22(均匀缩放时sx=sy)
  • 缩放中心:
    double cx = combinedMatrix.OffsetX / (1 - combinedMatrix.M11);
    double cy = combinedMatrix.OffsetY / (1 - combinedMatrix.M22);
    

示例验证

针对你的例子,组合后的矩阵计算结果为:

  • M11 = 0.25,M22 = 0.25(总缩放因子为0.25)
  • OffsetX =25,OffsetY=0

代入公式计算缩放中心:
cx =25/(1-0.25)= 100/3 ≈33.333,cy=0

所以等效的单一缩放操作是:

Matrix equivalentMatrix = new();
equivalentMatrix.ScaleAt(0.25, 0.25, 100.0/3, 0);

执行这个单一变换,和连续执行matrix1+matrix2的效果完全一致。

注意事项

  • 如果缩放因子为1(无缩放),则无需计算缩放中心,直接保留平移即可。
  • 非均匀缩放(sx≠sy)时,分别按上述公式计算x和y方向的缩放中心即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 23:25:09