Hallo
Habe hier gerade einen seltsamen Fehler, und wollte mal fragen ob der woanders auch auftritt:
Ich erstelle ein TexturePaint aus einem BufferedImage mit einem Karomuster. Mit diesem Paint male ich 2 Quadrate.
- Das erste Quadrat wird um 22.5° gedreht gezeichnet. Die Textur wird richtig angezeigt, nämlich auch um 22.5° gedreht.
- Das zweite Quadrat wird um 45° gedreht gezeichnet. Die Textur wird falsch angezeigt, nämlich wieder nur um 22.5° gedreht (statt 45°)
(Wenn man NACH dem ersten Zeichnen eine andere Zeichenoperation ausführt, funktioniert es - siehe mit XXX markierte Zeile - aber das ist nur eine oberflächliche Beobachtung...)
Hier mal der Code:
Und im Anhang zwei Bilder. Das erste zeigt den Fehler (die Textur im zweiten Quadrat ist nicht mit dem Quadrat ausgerichtet, sondern so wie das erste). Das zweite zeigt das, was eigentlich rauskommen sollte (und was auch rauskommt, wenn man die XXX-Zeile einfügt - aber das ist ja Unfug...)
Getestet auf WinXP 32, GeForce8800 mit ziemlich aktuellen Treibern, JDK 1.7.0_07 und 1.6.0_26
Habe hier gerade einen seltsamen Fehler, und wollte mal fragen ob der woanders auch auftritt:
Ich erstelle ein TexturePaint aus einem BufferedImage mit einem Karomuster. Mit diesem Paint male ich 2 Quadrate.
- Das erste Quadrat wird um 22.5° gedreht gezeichnet. Die Textur wird richtig angezeigt, nämlich auch um 22.5° gedreht.
- Das zweite Quadrat wird um 45° gedreht gezeichnet. Die Textur wird falsch angezeigt, nämlich wieder nur um 22.5° gedreht (statt 45°)
(Wenn man NACH dem ersten Zeichnen eine andere Zeichenoperation ausführt, funktioniert es - siehe mit XXX markierte Zeile - aber das ist nur eine oberflächliche Beobachtung...)
Hier mal der Code:
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.TexturePaint;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class TexturePaintTest extends JPanel
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(400,400);
f.getContentPane().add(new TexturePaintTest());
f.setVisible(true);
}
});
}
Paint paint = null;
List<Shape> shapes = null;
TexturePaintTest()
{
BufferedImage texture = new BufferedImage(
10, 10, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = texture.createGraphics();
g.setColor(Color.GRAY);
g.fillRect(0,0,10,10);
g.setColor(Color.BLACK);
g.drawRect(0,0,10,10);
g.dispose();
paint = new TexturePaint(texture,
new Rectangle(texture.getWidth(), texture.getHeight()));
shapes = new ArrayList<Shape>();
shapes.add(new Rectangle2D.Double(100, 100, 50, 50));
shapes.add(new Rectangle2D.Double(200, 100, 50, 50));
}
@Override
protected void paintComponent(Graphics gr)
{
super.paintComponent(gr);
Graphics2D g = (Graphics2D)gr;
g.setColor(Color.WHITE);
g.fillRect(0, 0, getWidth(), getHeight());
for (int i=0; i<2; i++)
{
AffineTransform oldAT = g.getTransform();
g.transform(AffineTransform.getRotateInstance(
Math.toRadians(22.5+i*22.5), 200,200));
g.setPaint(paint);
g.fill(shapes.get(i));
g.setTransform(oldAT);
// XXX Works when uncommenting this line:
//g.fillRect(0, 0, 10, 10);
}
}
}
Und im Anhang zwei Bilder. Das erste zeigt den Fehler (die Textur im zweiten Quadrat ist nicht mit dem Quadrat ausgerichtet, sondern so wie das erste). Das zweite zeigt das, was eigentlich rauskommen sollte (und was auch rauskommt, wenn man die XXX-Zeile einfügt - aber das ist ja Unfug...)
Getestet auf WinXP 32, GeForce8800 mit ziemlich aktuellen Treibern, JDK 1.7.0_07 und 1.6.0_26