Как повернуть изображение на основе двух точек - PullRequest
4 голосов
/ 07 апреля 2011

У меня есть некоторые изображения, которыми я манипулирую, и на этих изображениях у меня всегда есть две точки (x1, y1) и (x2, y2). как это:

|----------------|
|                |
|    .           |
|                |
|          .     |
|                |
|----------------|

Мне нужно написать алгоритм для выравнивания изображения вот так

|----------------|
|                |
|                |
|    .     .     |
|                |
|                |
|----------------|

Я уже прочитал этот вопрос, но угол, полученный из

double angle = Math.Atan2(pointB.Y - pointA.Y, pointB.X - pointA.X);

Не работает, когда я использую этот код вращения в Java:

public static BufferedImage tilt(BufferedImage image, double angle) {
    double sin = Math.abs(Math.sin(angle)), cos = Math.abs(Math.cos(angle));
    int w = image.getWidth(), h = image.getHeight();
    int neww = (int) Math.floor(w * cos + h * sin), newh = (int) Math
            .floor(h * cos + w * sin);
    GraphicsConfiguration gc = getDefaultConfiguration();
    BufferedImage result = gc.createCompatibleImage(neww, newh,
            Transparency.OPAQUE);
    Graphics2D g = result.createGraphics();

    g.setColor(Color.white);
    g.setBackground(Color.white);
    g.fillRect(0, 0, neww, newh);

    g.translate((neww - w) / 2, (newh - h) / 2);

    g.rotate(angle, w / 2, h / 2);
    g.drawRenderedImage(image, null);
    g.dispose();
    return result;
}

В посте, упомянутом ранее, они используют код c #, такой как

myImage.TranslateTransform(-pointA.X, -pointA.Y);
myImage.RotateTransform((float) angle, MatrixOrder.Append);
myImage.TranslateTransform(pointA.X, pointA.Y, MatrixOrder.Append);

Есть ли кто-нибудь, кто мог бы помочь с реализацией Java для этого случая?

Ответы [ 3 ]

1 голос
/ 13 апреля 2011

Хорошо ... чтобы решить проблему, я просто преобразовал значение в радианах, возвращаемое Math.atan2, в градусы, и вращение работало хорошо.

Спасибо всем

0 голосов
/ 28 мая 2013

для меня ниже работал для выравнивания маркировки листа OMR, где точка A - это угловая метка TopLeft, точка B - это угловая метка BottomLeft

двойной угол = Math.Atan2 (pointB.x - pointA.x, pointB.y - pointA.y);

0 голосов
/ 07 апреля 2011

Если левая точка в вашем примере - A, а правая точка в вашем примере - B, представьте, что вы хотите нарисовать точку C (A.X, B.Y), которая имеет угол 90 градусов, чтобы завершить треугольник. Если вы используете расчет геометрии для вычисления угла A, вы знаете, на сколько повернуть.

...