在InkCanvas中调整已绘制的笔触的大小

时间:2020-04-24 12:34:56

标签: uwp directx transform inkcanvas win2d

选择鼠标单击绘制的特定笔划后,我正在绘制矩形边界。之后,我想通过拖动矩形的角来调整矩形的大小。同时,我还希望调整矩形所包围的笔触的大小

为了缩放,我尝试使用 Matrix3x2 scale1 = Matrix3x2.CreateScale(2.0f); foreach(var stroke in strokes) { stroke.PointTransform = scale1; }

但是据我了解,缩放时。它使用原始坐标系。 (我已经在第二张图片的左上角标记了原始坐标系)

缩放时是否可以更改坐标系?可能是矩阵计算吗?

如果有人降级了我的问题,请告诉我原因,这样我可以改善自己并重新表述该问题。 [注意:我正在使用自定义干燥和Win2D来渲染InkStrokes,应用程序是用C#编写的,用于UWP]

enter image description here

2 个答案:

答案 0 :(得分:1)

缩放时是否要使用'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;
}

答案 1 :(得分:0)

我能够找到一种方法来做到这一点。 假设我们要移动右下角的大小。

  1. 使用SelectWithLine或SelectWithPolyLine函数获取并绘制边界Rect。 (这还将把笔触的“选定”参数设置为“真”)
  2. 通过OnPointerMoved获取xScale和yScale的比例因子。
  3. 随着Pointer的移动,重新绘制笔划和边界Rect。
  4. 缩放应按以下步骤进行。 (维护变量[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;
                }
    

这就是我通过右下角调整大小的方法。同样,这也可以在其他角落实现。