하위 픽셀 위치 지정을 사용하여 Java에서 2 차원 도형을 렌더링하려고 시도했지만 실패했습니다. ,서브 픽셀 렌더링
선이 균등하게 이격되어야하지만 :
는import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
public class TestFrame extends Frame {
private static final int D = 64;
public static void main(String args[]) {
new TestFrame(D, D);
}
private final Insets ins;
private final double scale = 1;
TestFrame(int w, int h) {
ins = getInsets();
final Dimension dim = new Dimension(w + ins.left + ins.right, h + ins.top + ins.bottom);
pack();
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent we) {
dispose();
}
});
setSize(dim);
setLocationRelativeTo(null);
setBackground(Color.BLACK);
setVisible(true);
repaint();
}
@Override
public void paint(Graphics gfx) {
super.paint(gfx);
final Graphics2D g2d = (Graphics2D)gfx;
g2d.setTransform(new AffineTransform(1.0/scale, 0.0, 0.0, 1.0/scale, ins.left, ins.top));
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setStroke(new BasicStroke((float)scale));
g2d.setColor(Color.WHITE);
for (double deg = 0; deg < 90.0; deg += 2.0) {
final double rad = deg/180.0 * Math.PI;
final double x1 = Math.cos(rad) * D * scale;
final double y1 = Math.sin(rad) * D * scale;
final double x2 = Math.cos(rad) * (D - 4.0) * scale;
final double y2 = Math.sin(rad) * (D - 4.0) * scale;
g2d.draw(new Line2D.Double(x1, y1, x2, y2));
}
}
}
이 결과는 다음을 일으킨다 : 실패한 시도 (순간위한 scale
및 AffineTransform
무시) 이하이고 보시다시피, 그렇지 않습니다. 내 생각에 시작 지점과 끝 지점은 가장 가까운 픽셀로 반올림됩니다.
Line2D.Double
을 사용한 SO 언급에 대한 해결책 (이미 수행 중이며 분명히 작동하지 않음) 또는 AffineTransform
을 사용하여 규모를 축소하십시오. 코드 샘플의 변수 scale
을 100으로 변경하면 훨씬 더 높은 눈금으로 줄을 그립니다. 그런 다음 변환을 사용하여 제안에 따라 다시 축소 할 수 있습니다. 이것 역시 결과 이미지에 영향을 미치지 않습니다.
내가 뭘 잘못하고 있니?
아무것도가, 반올림과 혼합 자바의 앨리어싱 알고리즘 것 같다 ... 나는 많은 매개 변수를 변경 시도, 최상의 결과는 선폭을 변경하여, 그러나 광도는 실제로 아래로 ... –
떨어 아아, 단지를 'g2d.setRenderingHint (RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); '를 시도하고 그것을 수정하는 것 같습니다. 약간 비밀. –
그걸 시도하지 않았어! "스트로크 표준화 제어 힌트 값 - 지오메트리는 수정되지 않은 채로두고 서브 픽셀 정확도로 렌더링해야합니다." 필요한 것 또는 다른 VALUE_STROKE_NORMALIZE? –