Java2d: перевести оси - PullRequest
       4

Java2d: перевести оси

1 голос
/ 14 мая 2010

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

Есть ли способ переместить начало координат внизу влево?

Спасибо.

Ответы [ 5 ]

4 голосов
/ 14 мая 2010

Вам понадобится сделать Scale и перевести.

в вашем paintComponent методе вы можете сделать это:

public void paintComponent(Graphics g)
{
    Graphics2D g2d = (Graphics2D) g;
    g2d.translate(0, -height);
    g2d.scale(1.0, -1.0);
    //draw your component with the new coordinates

    //you may want to reset the transforms at the end to prevent
    //other controls from making incorrect assumptions
    g2d.scale(1.0, -1.0);
    g2d.translate(0, height);
}

Мой Swing немного ржавый, но это должно выполнить задачу.

2 голосов
/ 18 сентября 2013

Мы можем использовать следующий способ, чтобы легко решить проблему,

public void paintComponent(Graphics g)
{
Graphics2D g2d = (Graphics2D) g;
// Flip the sign of the coordinate system
g2d.translate(0.0, getHeight());
g2d.scale(1.0, -1.0);
......
}
0 голосов
/ 27 ноября 2018

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

@Test
public void bottomLeftOriginTest() throws IOException {
    int width = 256;
    int height = 512;

    BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);    
    Graphics2D ig = bi.createGraphics();
    // save the "old" transform
    AffineTransform old = ig.getTransform();

    // origin is top left:
    // update graphics object with the inverted y-transform
    if (true) { /* order ok */
        ig.scale(1.0, -1.0);
        ig.translate(0, -bi.getHeight());
    } else {
        ig.translate(0, -bi.getHeight());
        ig.scale(1.0, -1.0);
    }

    int xPoints[] = new int[] { 0, width, width };
    int yPoints[] = new int[] { 0, height, 0 };
    int nPoints = xPoints.length;
    ig.setColor(Color.BLUE);
    ig.fillRect(0, 0, bi.getWidth(), bi.getHeight());

    ig.setColor(Color.RED);
    ig.fillPolygon(xPoints, yPoints, nPoints);

    // restore the old transform
    ig.setTransform(old);

    // Export the result to a file
    ImageIO.write(bi, "PNG", new File("origin.png"));
}

bottom left origin

0 голосов
/ 14 мая 2010

Вы захотите просто привыкнуть к этому. Как упоминал Люк, технически вы МОЖЕТЕ применить преобразование к графическому экземпляру, но это в конечном итоге отрицательно скажется на производительности.

Простое выполнение перевода может сдвинуть позицию 0,0 влево-вниз, но движение вдоль положительных осей будет по-прежнему направо в направлении x и вниз в направлении y, поэтому единственное, что вы бы выполнили, это нарисовать все за кадром. Вам нужно выполнить поворот, чтобы выполнить то, что вы запрашиваете, что добавило бы накладные расходы на вычисления радиана в матрицу преобразования экземпляра графики. Это не хороший компромисс.

0 голосов
/ 14 мая 2010

Вы пробовали Graphics2D.translate () ?

...