AffineTransform без преобразования Stroke?

При использовании функции Graphics2D scale () с двумя разными параметрами (масштабирование с разными соотношениями в x- и y-направлениях), все, что нарисовано позже в этом объекте Graphics2D, также масштабируется. Это дает странный эффект: линии, нарисованные в одном направлении, толще, чем в другом. Следующая программа производит этот эффект, она показывает это окно:

example screenshot

public class StrokeExample extends JPanel {


    public void paintComponent(Graphics context) {
        super.paintComponent(context);
        Graphics2D g = (Graphics2D)context.create();
        g.setStroke(new BasicStroke(0.2f));

        int height = getHeight();
        int width = getWidth();

        g.scale(width/7.0, height/4.0);

        g.setColor(Color.BLACK);
        g.draw(new Rectangle( 2, 1, 4, 2));
    }

    public static void main(String[] params) {
        EventQueue.invokeLater(new Runnable(){public void run() {

            StrokeExample example = new StrokeExample();

            JFrame f = new JFrame("StrokeExample");
            f.setSize(100, 300);
            f.getContentPane().setLayout(new BorderLayout());
            f.getContentPane().add(example);
            f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            f.setVisible(true);
        }});

    }

}

Я использую это преобразование координат, чтобы избежать необходимости вручную преобразовывать координаты моей модели приложения ((2,1, 2,4) в этом примере) в screen ( или компонент) координаты пикселей, но мне не нужно это искажение штриха. Другими словами, я хочу, чтобы все линии имели одинаковую ширину , независимо от текущих масштабных коэффициентов x и y.

Я знаю, что производит этот эффект (объект Stroke создает обводку прямоугольника, который будет раскрашен в пользовательских координатах, которые затем преобразуются в координаты экрана), но я не уверен, как решить эту проблему.

  • Следует ли мне создать новую реализацию Stroke, которая обводит фигуры по-разному в направлении X и Y (тем самым устраняя искажение здесь)? (Или кто-нибудь уже знает такую ​​реализацию?)
  • Должен ли я преобразовать мои формы в координаты экрана и обводить их там?
  • Есть другие (лучшие) идеи?
12
задан Paŭlo Ebermann 18 February 2011 в 20:17
поделиться