неразрушающие преобразования на объектах java2d - PullRequest
1 голос
/ 14 июля 2010

Я бы хотел иметь возможность увеличивать и уменьшать масштаб сцены Java2D, созданной из Path2D. Двойной без утолщение линий, просто путем расширения расстояний.

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

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

Ответы [ 2 ]

1 голос
/ 16 июля 2010

Я нашел решение: я изменяю ширину линии в соответствии с масштабным коэффициентом в 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)
0 голосов
/ 14 июля 2010

Как вы обнаружили, изменение преобразования Graphics2D влияет на все чертежи, но ничто не мешает сохранить, изменить и восстановить преобразование внутри paintComponent().В этом примере содержимое рисуется в масштабированном контексте, в то время как Rectangle.Double, окружающее целевой объект, рисуется в немасштабированном виде.преобразования, но вы можете использовать AffineTransform вместо этого.Как и Rectangle2D, Path2D реализует интерфейс Shape, поэтому вы можете использовать createInverse() и createTransformedShape() соответственно.Вот связанный пример .

...