uwp - 在 InkCanvas 中调整已绘制的 Inkstrokes 的大小
问题描述
在选择通过鼠标单击绘制的特定笔划后,我正在绘制矩形边界。之后,我想通过拖动矩形的角来调整矩形的大小。同时,我还想调整由矩形包围的笔划的大小。
对于缩放,我尝试使用
Matrix3x2 scale1 = Matrix3x2.CreateScale(2.0f);
foreach(var stroke in strokes)
{
stroke.PointTransform = scale1;
}
但据我了解,缩放时。它使用原始坐标系。(我在第二张图的左上角标出了原来的坐标系)
缩放时有没有办法改变坐标系?可能是任何矩阵计算?
如果有人在降级我的问题,请告诉我原因,这样我就可以改进自己并重新提出问题。 [注意:我使用自定义干燥和 Win2D 来渲染 InkStrokes,应用程序是用 C# 为 UWP 编写的]
解决方案
我能够找到一种方法来做到这一点。假设,我们正在移动右下角以调整大小。
- 使用 SelectWithLine 或 SelectWithPolyLine 函数获取和绘制边界矩形。(这也会将笔划的 Selected 参数设置为 True)
- 使用 OnPointerMoved 获取 xScale 和 yScale 的缩放因子。
- 随着Pointer的移动,重绘描边和包围Rect。
应按如下方式进行缩放。(维护变量[xScalePrev, yScalePrev] 来跟踪两个轴是否随着指针移动而缩放)
if (xScalePrev != xScale & yScalePrev != yScale) { Matrix3x2 scale1 = Matrix3x2.CreateScale(1 + (float)xScale, 1 + (float)yScale); Matrix3x2 a = stroke.PointTransform * scale1; float xOffset = a.M31 - (float)boundingRect.Left * (float)xScale; float yOffset = a.M32 - (float)boundingRect.Top * (float)yScale; stroke.PointTransform = new Matrix3x2(a.M11, a.M12, a.M21, a.M22, xOffset, yOffset); xScalePrev = xScale; yScalePrev = yScale; } else if (xScalePrev != xScale) { Matrix3x2 scale1 = Matrix3x2.CreateScale(1 + (float)xScale, 1); Matrix3x2 a = stroke.PointTransform * scale1; float xOffset = a.M31 - (float)boundingRect.Left * (float)xScale; stroke.PointTransform = new Matrix3x2(a.M11, a.M12, a.M21, a.M22, xOffset, a.M32); xScalePrev = xScale; } else if (yScalePrev != yScale) { Matrix3x2 scale1 = Matrix3x2.CreateScale(1, 1 + (float)yScale); Matrix3x2 a = stroke.PointTransform * scale1; float yOffset = a.M32 - (float)boundingRect.Top * (float)yScale; stroke.PointTransform = new Matrix3x2(a.M11, a.M12, a.M21, a.M22, a.M31, yOffset); yScalePrev = yScale; }
这就是我使用右下角调整大小的方式。同样,这也可以在其他角落实现。
推荐阅读
- mediawiki-extensions - 如何将 Scribunto 版本与 Wikibase 容器版本匹配?
- ios - 如何在 MDCTabBar 中显示差异 viewContoller - swift
- unix - 仅从目录中查找最新的 hdfs 文件
- node.js - cassandra 在执行时继续运行
- jboss - 无法再使用 -D 将参数传递给 cli 脚本
- java - Spring boot - 在保存对象时根据 id 字段保存非 id 字段
- javascript - 如何在 VS Code 中显示 LSP 的相关信息
- c# - c#中带有自签名证书的SSL TLS通信不起作用
- maven - 如何在所有测试后调用自定义方法/清理?(盖布和斯波克)
- python - 获取用户的输入以创建 csv 文件