Graphics2D的旋转precision问题 [英] Graphics2D Rotation Precision Issues
本文介绍了Graphics2D的旋转precision问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我画4层叠矩形,绕一个点在画布上,然后再次绘制相同的形状,但堆叠的矩形没有保持完全一致。
下面是截图:
正如你所看到的,第一不转动块是完美的,但下面的是对齐。为什么会出现这种情况,并哪能prevent呢?
SSCE
//只需导入一切保持简短而亲切
进口java.awt中*。
导入的java.awt.geom *。
进口的javax.swing *。
@燮pressWarnings(串行)
公共类AlignmentIssue扩展JComponent的{
@覆盖
公共无效漆(图形G){
Graphics2D的G2D =(Graphics2D的)克;
双角= Math.toRadians(30);
INT numRects =(INT)Math.floor(2.0 * Math.PI /角);
矩形RECT =新的Rectangle(0,100,20,25);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.translate(的getWidth()/ 2,的getHeight()/ 2);
的for(int i = 0; I< numRects ++我){
的AffineTransform变换= g2d.getTransform();
为(中间体n = 0时; N 3; ++ n)的{
g2d.draw(RECT);
g2d.translate(0,rect.height);
}
g2d.setTransform(变换);
g2d.rotate(角度);
}
}
公共静态无效的主要(字串[] args){
JFrame的框架=新的JFrame(对齐问题);
frame.add(新AlignmentIssue());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.set preferredSize(新尺寸(800,600));
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(真正的);
}
}
解决方案
您需要更多的precise行程控制:
g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,RenderingHints.VALUE_STROKE_PURE);
默认可以让几何形状变化了一下,根据实现。纯试图保持亚像素精度。
I am drawing 4 stacked rectangles, rotating the canvas about a point and then drawing that same shape again but the stacked rectangles aren't remaining completely aligned.
Here's a screenshot:
As you can see, the first, unrotated block is perfect but the following ones are misaligned. Why is this happening and how can I prevent it?
SSCE
//Just import everything to keep it short and sweet
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
@SuppressWarnings("serial")
public class AlignmentIssue extends JComponent {
@Override
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D)g;
double angle = Math.toRadians(30);
int numRects = (int)Math.floor(2.0 * Math.PI / angle);
Rectangle rect = new Rectangle(0, 100, 20, 25);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.translate(getWidth() / 2, getHeight() / 2);
for(int i = 0; i < numRects; ++i) {
AffineTransform transform = g2d.getTransform();
for(int n = 0; n < 3; ++n) {
g2d.draw(rect);
g2d.translate(0, rect.height);
}
g2d.setTransform(transform);
g2d.rotate(angle);
}
}
public static void main(String[] args) {
JFrame frame = new JFrame("Alignment Issue");
frame.add(new AlignmentIssue());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setPreferredSize(new Dimension(800, 600));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
解决方案
You need more precise stroke control:
g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
The default may let the geometry vary a bit, depending on the implementation. Pure tries to keep subpixel accuracy.
这篇关于Graphics2D的旋转precision问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文