我对仿射变换还很陌生,我发现有一些事情很令人沮丧。。
我一直在做一个在屏幕上画激光的个人项目。我使用radialgradientpaint类来绘制激光的辉光,然后使用缩放和旋转仿射变换来更改椭圆的形状,并将激光转向特定的方向。
当我尝试旋转图形(没有缩放)时,它似乎会缩小它,我不知道这是为什么。我试过查这个但没用。也许我误解了这个类上的javadoc。为什么会这样?
我也很好奇如何让变换后的对象移动到与未变换图形相同的位置。即使坐标相同,两个图形也会移动到不同的位置。我知道这可能是因为仿射变换移动了整个图形,我可能需要将变换后的图形转换到与未变换图形相同的位置,但我不确定如何处理这个问题。
以下是我的代码中绘制激光的部分:
public void render(Graphics g) {
// If the graphic is visible on the frame, draw it
if(onScreen()) {
Graphics2D g2d = (Graphics2D) g;
// Preserves the original presets of the program's graphics
AffineTransform ogTransform = g2d.getTransform();
Shape ogClip = g2d.getClip();
Point2D center = new Point2D.Float(x, y);
float[] dist = {0.3f, 0.9f};
Color[] colors = {new Color(1.0f, 1.0f, 1.0f, 0.9f), new Color(0.0f, 1.0f, 0.0f, 0.1f)};
g2d.setPaint(new RadialGradientPaint(center, radius, dist, colors));
AffineTransform scaleTransform = AffineTransform.getScaleInstance(scaleX, scaleY);
AffineTransform rotationTransform = AffineTransform.getRotateInstance(angle, x + width/2f, y + height/2f);
// Transforms the shape to look more like a laser
rotationTransform.concatenate(scaleTransform);
g2d.setTransform(rotationTransform);
// Draws a "cut-out" of the rectangle
g2d.setClip(new Ellipse2D.Double(x - radius, y - radius, radius * 2, radius * 2));
g2d.fillRect(x - radius, y - radius, radius * 2, radius * 2);
// Default transformation and clip are set
g2d.setTransform(ogTransform);
g2d.setClip(ogClip);
// Outlines where the transformed graphic should be
g.setColor(Color.orange);
g.drawRect(x - 10, y - 10, 20, 20);
}
}
感谢您的帮助!
暂无答案!
目前还没有任何答案,快来回答吧!