2016-09-22 3 views
2

하위 픽셀 위치 지정을 사용하여 Java에서 2 차원 도형을 렌더링하려고 시도했지만 실패했습니다. ,서브 픽셀 렌더링

Rendering

선이 균등하게 이격되어야하지만 :

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)); 
     } 
    } 
} 

이 결과는 다음을 일으킨다 : 실패한 시도 (순간위한 scaleAffineTransform 무시) 이하이고 보시다시피, 그렇지 않습니다. 내 생각에 시작 지점과 끝 지점은 가장 가까운 픽셀로 반올림됩니다.

Line2D.Double을 사용한 SO 언급에 대한 해결책 (이미 수행 중이며 분명히 작동하지 않음) 또는 AffineTransform을 사용하여 규모를 축소하십시오. 코드 샘플의 변수 scale을 100으로 변경하면 훨씬 더 높은 눈금으로 줄을 그립니다. 그런 다음 변환을 사용하여 제안에 따라 다시 축소 할 수 있습니다. 이것 역시 결과 이미지에 영향을 미치지 않습니다.

내가 뭘 잘못하고 있니?

+0

아무것도가, 반올림과 혼합 자바의 앨리어싱 알고리즘 것 같다 ... 나는 많은 매개 변수를 변경 시도, 최상의 결과는 선폭을 변경하여, 그러나 광도는 실제로 아래로 ... –

+2

떨어 아아, 단지를 'g2d.setRenderingHint (RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); '를 시도하고 그것을 수정하는 것 같습니다. 약간 비밀. –

+0

그걸 시도하지 않았어! "스트로크 표준화 제어 힌트 값 - 지오메트리는 수정되지 않은 채로두고 서브 픽셀 정확도로 렌더링해야합니다." 필요한 것 또는 다른 VALUE_STROKE_NORMALIZE? –

답변

1

용액 렌더링 힌트들 중 하나의 세트 : Javadocs 인용

g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); 

:

스트로크 정규화 제어 힌트 값 - 형상 변성 왼쪽 서브 픽셀 정밀도로 렌더링되어야 .

관련 문제