При использовании функции Graphics2D scale()
с двумя разными параметрами (масштабирование по разным отношениям в x- и y-направлении) все, нарисованные позже на этом объекте Graphics2D, также масштабируется. Это имеет странный эффект, что линии, проведенные в одном направлении, толще, чем линии в другом направлении. Следующая программа производит этот эффект, он показывает это окно:
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) в этом примере), чтобы отображать (или компонентные) пиксельные координаты, но я не хочу это искажение хода. Другими словами, , я хочу, чтобы все линии были одинаковой ширины, независимо от текущих x- и y-масштабных факторов.
Я знаю, что производит этот эффект (объект Stroke создает поглаженную форму прямоугольника, который будет нарисован в пользовательских координатах, которые затем переводятся на экранные координаты), но я не уверен, как это решить.
- Должен ли я создать новую реализацию Stroke, которая поглаживает Shapes по-разному в X- и Y-направлении (тем самым отменив здесь искажение)? (Или кто-нибудь уже знает такую реализацию?)
- Должен ли я преобразовать свои фигуры в координаты экрана и погладить там?
- Любые другие (лучшие) идеи?