2010-07-14 1 views
1

Я хотел бы иметь возможность масштабирования и unzoom на сцене Java2D, сделанной из Path2D.Double без , сгущая линии, просто расширяя расстояния.неразрушающие преобразования на объектах java2d

I'v пытался применить преобразование к объекту Graphics2D, получаемого методом paintComponent, но это делает линии более толстыми. Единственный способ, которым я нашел, - применить преобразование к строкам (например, line.transform(AffineTransform.getScaleInstance(2d,2d))), но каждый раз, когда я снова увеличиваю и снова открываю окно, я теряю информацию из-за ошибок с плавающей запятой.

Короче говоря: трансформации разрушительны. есть ли способ сказать: «Я хочу нарисовать эту линию с использованием этого преобразования без изменения содержания строки»?

ответ

0

Как вы нашли, изменение Graphics2D преобразования влияет все рисунок, но ничто не мешает сохранение, изменение и восстановление преобразования внутри paintComponent(). В этом example контент рисуется в масштабированном контексте, а Rectangle.Double, окружающий целевой объект, нарисован без масштабирования.

Приложение: example использует явные преобразования, но вместо этого вы можете использовать AffineTransform. Например, Rectangle2D, Path2D реализует интерфейс Shape, поэтому вы можете использовать createInverse() и createTransformedShape(), соответственно. Вот связанный example.

+0

Я видел, что могу сохранить трансформацию и восстановить ее позже, что касается Graphics2D, но я то, что хотел бы сделать, можно переформулировать так же, как сделать то же самое с Path2D. –

+0

@Paul Brauner: Вы можете использовать 'AffineTransform' на' Path2D', как было предложено выше. – trashgod

+0

yep, но затем он изменяет Path2D, вот и все, я хотел бы иметь возможность применить его к Path2D и получить новый, не изменяя оригинальный. –

1

Я нашел решение: меняю ширину линии в соответствии с масштабным коэффициентом Graphic2D, таким образом я могу применить преобразование к самому Graphic2D и не разрушить исходные координаты, содержащиеся в Path2D.

tr = g.getTransform() 
g.transform(AffineTransform.getScaleInstance(scaleFactor,scaleFactor)) 
g.setStroke(new java.awt.BasicStroke(1.0f/scaleFactor.toFloat)) 
/* draw lines */ 
g.setTransform(tr) 

 Смежные вопросы

  • Нет связанных вопросов^_^