WPF 通过操作调整矩形大小不保持比例

WPF resize rectangle by manipulation does not maintain ratio

我遇到了一个小问题。我正在 WPF 上设计一个应用程序,它将 运行 在 Windows 8.1 平板电脑上。我正在构建一种 "cropping" 软件(除其他外)。

为此,我在我的 window 上创建了一个矩形,并按照此处的 Microsoft 演练进行操作: http://msdn.microsoft.com/en-us/library/vstudio/ee649090(v=vs.100).aspx

因为我不想让我的矩形保持正方形,所以我通过在 ManipulationDelta

上设置 Scale.Y 来更改他们的示例

这是修改后的代码

rectsMatrix.ScaleAt(e.DeltaManipulation.Scale.X,
                    e.DeltaManipulation.Scale.Y,
                    e.ManipulationOrigin.X,
                    e.ManipulationOrigin.Y);

但尽管如此,当我捏合调整大小时,我的矩形仍会调整为正方形。我不明白为什么或如何解决这个问题。

WPF 操作 API 不支持在旋转时独立缩放 X 和 Y。

做这个练习...画一个矩形,然后在上面的某个地方放两个点。现在绘制相同的矩形,将这两个点彼此沿对角线移动。根据这些点之间的增量,您将如何确定用户是尝试旋转还是独立缩放 X 与 Y 或同时进行这两项操作?由于我们掌握的信息有限,这完全是模棱两可的。

这就是为什么应用通常最终会具有特定的 'handles',您需要触摸才能明确进入 'rotate' 模式或 'X/Y resize mode'。从实现的角度来看,您将处理该句柄上的操作事件(与控件本身分开)并相应地设置 ManipulationOrigin 和 ManipulationStartingEventArgs.Mode。

(免责声明:我是几年前创建这些 API 的团队的一员)

从数学的角度来看,我看到了两种方式,第一种比第二种简单,但是当你能做出第二种工作时,它会更令人满意:

第一个: 您可以决定旋转或缩放是用户想要做的。 我会定义两个向量:vw 和一个整数 d,代表 "distance".

  • 取用户触摸的两点为XY。它们之间的距离为 d.
  • 取向量XY为v
  • 将用户手指(X和Y)定义的新向量取为w

那么你必须比较 wd 的长度以及 vw 之间的角度,取为alpha.

例如 if d*sin(degree) < d/4 -> 应该改写为 sin(degree)<0.25 ,然后用户打算缩放,否则他旋转了矩形。

第二个: 这将允许用户同时旋转和缩放。

  • 取 X 和 Y,它们定义 v.
  • 取矩形,例如左侧并命名该向量:a
  • 矩形可以定义为一个向量及其相连的(纯粹的)边(90度),所以取底边的长度为width

现在,如果用户对 v 向量进行转换,则对向量 a 进行相同的转换并使宽度 bigger/smaller . 提示:https://processing.org/tutorials/transform2d/