在 InkCanvas 中调整已绘制的 Inkstrokes 的大小
Resize an already drawn Inkstrokes in InkCanvas
我在选择了用鼠标单击绘制的特定笔划后绘制了一个矩形边界。之后,我想通过拖动矩形的角来调整矩形的大小。同时,我也想调整由矩形包围的笔划的大小。
为了缩放,我尝试使用
Matrix3x2 scale1 = Matrix3x2.CreateScale(2.0f);
foreach(var stroke in strokes)
{
stroke.PointTransform = scale1;
}
但据我了解,缩放时。它使用原始坐标系。 (我在第二张图的左上角标出了原来的坐标系)
有没有办法在缩放时改变坐标系?可能是什么矩阵计算?
如果有人对我的问题进行降级,请告诉我原因,这样我可以改进自己并重新表述问题。
[注意:我正在使用 Custom Drying 和 Win2D 渲染 InkStrokes,应用程序是用 C# 为 UWP 编写的]
我找到了一种方法来做到这一点。
假设,我们正在移动右下角以调整大小。
- 使用 SelectWithLine 或 SelectWithPolyLine 函数获取并绘制边界 Rect。 (这也会将笔画的 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;
}
这就是我使用右下角调整大小的方法。同样,这也可以在其他角落实施。
缩放时要使用'A'的坐标吗?从第二张图片来看,你似乎想根据'A'的左下角缩放笔画,那么你可以创建一个由给定中心点偏移的缩放矩阵。例如:
var container = inkCanvas.InkPresenter.StrokeContainer;
var bounds = container.BoundingRect;
var center = new Vector2((float)bounds.Left, (float)bounds.Bottom);
var transform = Matrix3x2.CreateScale(2.0f, 2.0f, center);
foreach (var stroke in strokes)
{
stroke.PointTransform = transform;
}
我在选择了用鼠标单击绘制的特定笔划后绘制了一个矩形边界。之后,我想通过拖动矩形的角来调整矩形的大小。同时,我也想调整由矩形包围的笔划的大小。
为了缩放,我尝试使用
Matrix3x2 scale1 = Matrix3x2.CreateScale(2.0f);
foreach(var stroke in strokes)
{
stroke.PointTransform = scale1;
}
但据我了解,缩放时。它使用原始坐标系。 (我在第二张图的左上角标出了原来的坐标系)
有没有办法在缩放时改变坐标系?可能是什么矩阵计算?
如果有人对我的问题进行降级,请告诉我原因,这样我可以改进自己并重新表述问题。 [注意:我正在使用 Custom Drying 和 Win2D 渲染 InkStrokes,应用程序是用 C# 为 UWP 编写的]
我找到了一种方法来做到这一点。 假设,我们正在移动右下角以调整大小。
- 使用 SelectWithLine 或 SelectWithPolyLine 函数获取并绘制边界 Rect。 (这也会将笔画的 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; }
这就是我使用右下角调整大小的方法。同样,这也可以在其他角落实施。
缩放时要使用'A'的坐标吗?从第二张图片来看,你似乎想根据'A'的左下角缩放笔画,那么你可以创建一个由给定中心点偏移的缩放矩阵。例如:
var container = inkCanvas.InkPresenter.StrokeContainer;
var bounds = container.BoundingRect;
var center = new Vector2((float)bounds.Left, (float)bounds.Bottom);
var transform = Matrix3x2.CreateScale(2.0f, 2.0f, center);
foreach (var stroke in strokes)
{
stroke.PointTransform = transform;
}