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

TransformGroup组合缩放旋转平移后,如何正确计算鼠标中心缩放位置?

旋转后以鼠标为中心缩放的正确计算方法

问题根源:你在缩放时忽略了旋转变换对坐标的映射作用,直接用缩放后的原始坐标计算平移量,没有经过旋转变换,导致旋转后缩放中心偏移。

修改后的缩放操作代码(MouseWheel事件):

var point = e.GetPosition(Canvas);
// 获取鼠标点对应的原始图像坐标系位置
var inversePoint = RenderTransformGroup.Inverse.Transform(point);

// 计算新的缩放比例(建议用乘法实现平滑缩放,避免比例失控)
var scaleFactor = e.Delta > 0 ? 1.1 : 0.9;
var newScaleX = Math.Max(0.1, ScaleTransform.ScaleX * scaleFactor); // 限制最小缩放比例
var newScaleY = Math.Max(0.1, ScaleTransform.ScaleY * scaleFactor);

// 计算原始点经过新缩放后的坐标
var scaledPoint = new Point(inversePoint.X * newScaleX, inversePoint.Y * newScaleY);
// 将缩放后的坐标应用当前旋转变换,得到画布坐标系中的对应位置
var rotatedPoint = RotateTransform.Transform(scaledPoint);

// 调整平移量,让旋转后的缩放点与鼠标点重合
TranslateTransform.X = point.X - rotatedPoint.X;
TranslateTransform.Y = point.Y - rotatedPoint.Y;

// 更新缩放比例
ScaleTransform.ScaleX = newScaleX;
ScaleTransform.ScaleY = newScaleY;

// 更新旋转中心为当前图像缩放后的中心,保证后续旋转逻辑正常
RotateTransform.CenterX = (imageWidth * newScaleX) / 2;
RotateTransform.CenterY = (imageHeight * newScaleY) / 2;

关键说明:

  1. 逆变换获取原始坐标:通过RenderTransformGroup.Inverse.Transform(point)得到鼠标点对应的原始图像坐标系位置,确保缩放基于图像本身的坐标点。
  2. 考虑旋转的坐标映射:缩放后的点必须经过当前的旋转变换,才能得到画布坐标系中的正确位置,再以此计算平移量,保证鼠标点始终是缩放中心。
  3. 更新旋转中心:缩放后图像尺寸变化,需同步更新旋转中心,确保后续旋转操作仍以图像中心为轴。
  4. 平滑缩放与范围限制:用乘法实现缩放更平滑,添加最小缩放比例限制,避免图像因缩放至0消失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:44:51