2012-09-13 17 views
8

This question has been asked before, nhưng câu trả lời không giải quyết được vấn đề, vì vậy tôi hỏi lại.Có cách nào để vẽ đường thẳng với độ chính xác subpixel trong Swing không?

Được đề xuất thay vì sử dụng g2.drawLine, bạn có thể sử dụng g2.draw(line), trong đó lineLine2D.Double. Tuy nhiên, như bạn có thể thấy từ ảnh chụp màn hình, các dòng vẫn được vẽ như thể chúng đã kết thúc trên một pixel nguyên (mỗi bộ 10 dòng chính xác song song).

import javax.swing.*; 
import java.awt.*; 
import java.awt.geom.Line2D; 

public class FrameTestBase extends JFrame { 

    public static void main(String args[]) { 
     FrameTestBase t = new FrameTestBase(); 
     t.add(new JComponent() { 
      public void paintComponent(Graphics g) { 
       Graphics2D g2 = (Graphics2D) g; 
       g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
         RenderingHints.VALUE_ANTIALIAS_ON); 
       for (int i = 0; i < 50; i++) { 
        double delta = i/10.0; 
        double y = 5 + 5*i; 
        Shape l = new Line2D.Double(5, y, 200, y + delta); 
        g2.draw(l); 
    // Base case, with ints, looks exactly the same: 
    //    g2.drawLine(5, (int)y, 200, (int)(y + delta)); 
       } 
      } 
     }); 

     t.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     t.setSize(220, 300); 
     t.setVisible(true); 
    } 
} 

non-parallel lines

Vậy là nó không thể trong Swing hiển thị chính xác dòng mà không kết thúc chính xác vào một điểm ảnh?

+1

Bạn có thể thử g2d.setRenderingHint (RenderingHints .KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); ? http://stackoverflow.com/questions/5018635/java-does-subpixel-line-accuracy-require-an-affinetransform – I82Much

+0

Bạn nên vẽ các pixel cạnh trong một màu khác nhau (subpixel)/graytone (không phải subpixel antialiasing). – ninjalj

+0

@ I82Much Điều đó dường như hoạt động! Bạn nên thêm câu trả lời này làm câu trả lời! –

Trả lời