листать 2d компоненты в Java - PullRequest
       105

листать 2d компоненты в Java

1 голос
/ 20 ноября 2011

Я пытаюсь перевернуть 2-й объект любого объекта. Возможно ли это сделать на Java? если они находятся в отдельном квадранте, могу ли я изменить их квадрант? Это похоже на то, что мы делаем, чтобы переворачивать изображения в Paint. Эту же утилиту я пытаюсь выполнить на Java. Я слышал об аффинном преобразовании, в котором он использует бит под названием TYPE_FLIP, но я не уверен, как его использовать. Любой маленький пример будет очень полезен. Примечание: я не хочу переворачивать изображения, но реальные 2D-объекты. Таким образом, с помощью Affine Transform.

   import javax.swing.JFrame;
   import java.awt.Color;
   import java.awt.Graphics;
   import java.awt.Graphics2D;
   import java.awt.geom.AffineTransform;

    public class TestRotate extends JFrame
    {
     public void paint( Graphics g )
     {
        super.paintComponents(g);
        AffineTransform saveTransform;   
        int[] HouseX = {100,150,200,150,100,50};
        int[] HouseY = {100,100,(int)(100+(40*(Math.sqrt(3))/2)),(int)(100+(40*(Math.sqrt(3)))),(int)(100+(40*(Math.sqrt(3)))),(int)(100+(40*(Math.sqrt(3))/2))};

        Graphics2D g2 = ( Graphics2D ) g;
        g.setColor( Color.BLACK );
        g.drawPolygon(HouseX, HouseY, 6);    
        saveTransform = g2.getTransform();
        AffineTransform transform = new AffineTransform();

        transform.scale( 1.0, -1.0 );
        g2.setTransform( transform ); 
        g2.setColor( Color.BLUE );
        g.drawPolygon(HouseX, HouseY, 6); 

        transform.rotate( Math.toRadians( 45 ) );
        g2.setTransform( transform );
        g2.setColor( Color.GREEN );
        g.drawPolygon(HouseX, HouseY, 6);
     }
     public static void main(String args[])    
     {
        TestRotate frame = new TestRotate();
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.setSize( 600, 500 );
        frame.setVisible( true );
     }}

1 Ответ

3 голосов
/ 20 ноября 2011

Этот код не дает полного ответа, но призван заставить вас задуматься. То, о чем вы должны думать, это «Куда уходит форма ромба?». Попробуйте настроить числа, используемые при масштабировании преобразования, и посмотрите, сможете ли вы понять это A .

Diamond Here Diamond Gone

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.AffineTransform;

public class TestRotate
{
    public static void main(String args[])
    {
        JFrame frame = new JFrame("Test Rotate");

        JPanel gui = new JPanel(new BorderLayout());

        final HousePanel housePanel = new HousePanel();
        gui.add(housePanel, BorderLayout.CENTER);

        final JCheckBox transform = new JCheckBox("Transform");
        transform.addActionListener( new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                housePanel.setTransform(transform.isSelected());
                housePanel.repaint();
            }
        });
        gui.add(transform, BorderLayout.NORTH);

        frame.add( gui );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        gui.setPreferredSize( new Dimension(300, 200) );
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible( true );
    }
}

class HousePanel extends JPanel {

    public int[] HouseX = {
        100,105,110,105,100,95
    };

    public int[] HouseY = {
        100,
        100,
        (int)(100+(5*(Math.sqrt(3))/2)),
        (int)(100+(5*(Math.sqrt(3)))),
        (int)(100+(5*(Math.sqrt(3)))),
        (int)(100+(5*(Math.sqrt(3))/2))
    };

    boolean transform = false;

    public void setTransform(boolean transform) {
        this.transform = transform;
    }

    public void paintComponent( Graphics g )
    {
        final Graphics2D g2 = (Graphics2D) g;
        g2.clearRect( 0, 0, this.getWidth(), this.getHeight() );
        g2.setColor( Color.BLACK );

        if (transform) {
            AffineTransform transform = new AffineTransform();

            transform.scale( -1.0, 1.0 );
            g2.setTransform( transform );
        }
        g2.drawPolygon(HouseX, HouseY, 6);
    }

}

A) ОК. Основная проблема заключается в том, что для используемого вами типа преобразования обычно необходимо объединить как масштаб , так и перевод.

Причина в том.

  1. Когда фигура переворачивается горизонтально, она рисуется слева от видимой (видимой) области компонента.
  2. Когда фигура переворачивается вертикально, она рисуется на выше видимой области.

После того, как преобразование 'flip' выполнено с использованием масштаба, concatenate () , которое с помощью translate () преобразует фигуру обратно в видимую область.

Эти комбинированные преобразования просты, если вы знаете, как. Я не знаю как.

...