Найти новые координаты после поворота изображения в 90/180/270 в c# - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть изображение (w: 10, h: 15) и несколько рисунков (прямоугольник A (6,4), W: 2, H: 4) в файле XML. Мне нужно узнать новые координаты A (ie: A '(11,6)) после поворота изображения на 90/180/270 градусов в C#.

Исходное изображение

После поворота на 90 градусов

Я попробовал следующий код, но получаю A относительно исходного изображения. Мне нужны координаты в повернутом изображении.

public static PointF RotatePoint(double x, double y, double pageHeight, double pageWidth, int rotateAngle)
    {
        //Calculate rotate angle in radian
        var angle = rotateAngle * Math.PI / 180.0f;

        //Find rotate orgin
        double rotateOrginX = pageWidth / 2;
        double rotateOrginY = pageHeight / 2;

        var cosA = Math.Cos(angle);
        var sinA = Math.Sin(angle);

        var pX = (float)(cosA * (x - rotateOrginX) - sinA * (y - rotateOrginY) + rotateOrginX);
        var pY = (float)(sinA * (x - rotateOrginX) + cosA * (y - rotateOrginY) + rotateOrginY);

        Console.WriteLine($"Rotate {rotateAngle}\tX: {pX}\tY: {pY}");

        return new PointF { X = pX, Y = pY };
    }

1 Ответ

0 голосов
/ 28 февраля 2020

Если повороты бывают только на 90 °, 180 ° или 270 ° с использованием Math.Sin() и Cos() излишне.

При поворотах на 90 ° координатами можно довольно легко манипулировать ...

W  : Image width before rotation
H  : Image height before rotation
x  : X coordinate in image before rotation
x' : X coordinate in image after rotation
y  : Y coordinate in image before rotation
y' : Y coordinate in image after rotation

For 0° CCW:
x' = x
y' = y

For 90° CCW:
x' = y
y' = W - x

For 180° CCW/CW:
x' = W - x
y' = H - y

For 270° CCW:
x' = H - y
y' = x

In C#:

public static PointF RotatePoint(float x, float y, int pageWidth, int pageHeight, int degrees)
{
    switch(turns)
    {
        case 0: return new PointF(x,y);
        case 90: return new PointF(y, pageWidth - x);
        case 180: return new PointF(pageWidth - x, pageHeight - y);
        case 270: return new PointF(pageHeight - y, x);
        default:
            // Either throw ArgumentException or implement the universal logic with Sin(), Cos()
    }
}
...