Изменение размера уже нарисованных чернил в InkCanvas - PullRequest
0 голосов
/ 24 апреля 2020

Я рисую прямоугольную границу после выбора определенного c штриха, который я нарисовал щелчком мыши. После этого я хочу изменить размер прямоугольника, перетаскивая углы прямоугольника. В то же время я хочу, чтобы изменил размер штриха, ограниченного прямоугольником .

Для масштабирования я попытался использовать Matrix3x2 scale1 = Matrix3x2.CreateScale(2.0f); foreach(var stroke in strokes) { stroke.PointTransform = scale1; }

Но как я понял , При масштабировании. он использует оригинальную систему координат. (Я отметил исходную систему координат в верхнем левом углу второго изображения)

Есть ли способ изменить систему координат при масштабировании? Может быть какой-нибудь матричный расчет?

Если кто-то понижает мой вопрос, скажите, пожалуйста, почему, чтобы я мог улучшить себя и перефразировать вопрос. [Примечание: я использую Custom Drying и Win2D для рендеринга InkStrokes, приложение написано в C# для UWP]

enter image description here

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Является ли координата «А», которую вы хотите использовать при масштабировании? На втором рисунке вы, кажется, хотите масштабировать обводки на основе нижнего левого угла «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;
}
0 голосов
/ 27 апреля 2020

Мне удалось найти способ сделать это. Предположим, мы перемещаем нижний правый угол для изменения размера.

  1. Получите и нарисуйте ограничивающий прямоугольник, используя функции SelectWithLine или SelectWithPolyLine. (Это также установит для параметра Выбранные штрихи значение True)
  2. Получите коэффициенты масштабирования xScale и yScale с помощью OnPointerMoved.
  3. С помощью перемещения указателя перерисовайте обводку и ограничивающий прямоугольник .
  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;
                }
    

Так я добился изменения размера с помощью нижнего правого угла. Точно так же это может быть реализовано и в других углах.

...