2010-03-24 19 views
21

Tôi thực sự bị mắc kẹt về cách lập trình này. Làm thế nào để vẽ một vòng tròn trong Java với một bán kính và các điểm xung quanh các cạnh?Vẽ một vòng tròn có bán kính và các điểm xung quanh cạnh

Tôi cần vẽ một vòng tròn trong JFrame với bán kính và các điểm xung quanh chu vi. tôi có thể tính toán toán học như thế nào để tìm các tọa độ của các điểm xung quanh cạnh nhưng tôi không thể dường như có thể lập trình vòng tròn. Tôi hiện đang sử dụng một phương pháp Ellipse2D nhưng điều đó dường như không hoạt động và không trả về một bán kính, theo sự hiểu biết của tôi, nó không vẽ vòng tròn từ trung tâm thay vì từ một phối hợp bắt đầu sử dụng chiều cao và chiều rộng.

Mã hiện tại của tôi nằm trên một khung riêng biệt nhưng tôi cần phải thêm nó vào khung hiện có của mình.

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

public class circle extends JFrame { 
    public circle() { 
    super("circle"); 
    setSize(410, 435); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    Panel sp = new Panel(); 
    Container content = getContentPane(); 
    content.add(sp); 
    setContentPane(content); 
    setVisible(true); 
} 

public static void main (String args[]){ 
    circle sign = new circle(); 
} 
} 

class Panel extends JPanel { 
public void paintComponent(Graphics comp) { 
    super.paintComponent(comp); 
    Graphics2D comp2D = (Graphics2D) comp; 

    comp2D.setColor(Color.red); 
    Ellipse2D.Float sign1 = new Ellipse2D.Float(0F, 0F, 350F, 350F); 
    comp2D.fill(sign1); 
} 
} 

Trả lời

60

điểm trên circle có thể được xác định như một chức năng của θ góc:

x = a + cos r (θ)
y = b + r sin (θ)

Ở đây, gia tăng của 2π/8 được hiển thị.

Phụ lục: Như được đề xuất trong nhận xét của @Christoffer Hammarström, ví dụ revised này làm giảm số lượng magic numbers trong bản gốc. Số điểm mong muốn trở thành một tham số cho hàm tạo. Nó cũng thích nghi việc hiển thị với kích thước của vùng chứa.

alt text

/** @see https://stackoverflow.com/questions/2508704 */ 
public class CircleTest extends JPanel { 

    private static final int SIZE = 256; 
    private int a = SIZE/2; 
    private int b = a; 
    private int r = 4 * SIZE/5; 
    private int n; 

    /** @param n the desired number of circles. */ 
    public CircleTest(int n) { 
     super(true); 
     this.setPreferredSize(new Dimension(SIZE, SIZE)); 
     this.n = n; 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setRenderingHint(
      RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 
     g2d.setColor(Color.black); 
     a = getWidth()/2; 
     b = getHeight()/2; 
     int m = Math.min(a, b); 
     r = 4 * m/5; 
     int r2 = Math.abs(m - r)/2; 
     g2d.drawOval(a - r, b - r, 2 * r, 2 * r); 
     g2d.setColor(Color.blue); 
     for (int i = 0; i < n; i++) { 
      double t = 2 * Math.PI * i/n; 
      int x = (int) Math.round(a + r * Math.cos(t)); 
      int y = (int) Math.round(b + r * Math.sin(t)); 
      g2d.fillOval(x - r2, y - r2, 2 * r2, 2 * r2); 
     } 
    } 

    private static void create() { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new CircleTest(9)); 
     f.pack(); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       create(); 
      } 
     }); 
    } 
} 
+3

+1 cho ảnh chụp màn hình hiển thị mã đang chạy !!! – OscarRyz

+0

Cảm ơn bạn đó chỉ là những gì tôi đang tìm kiếm – alchemey89

+0

@windopal: Tuyệt vời. Xem các chỉnh sửa của tôi về lỗi cắt ngắn đáng xấu hổ. @Oscar Reyes: _¡gracias! _. – trashgod

3

Hãy thử một cái gì đó như thế này:

public class CirclePanel extends JPanel 
    { 
    public static void main(String[] args) throws Exception 
    { 
     JFrame f = new JFrame(); 

     f.setContentPane(new CirclePanel()); 
     f.setSize(700,500); 
     f.setVisible(true); 
    } 

    public void paint(Graphics g) 
    { 
     super.paint(g); 
     //Draws the line 
     g.drawOval(0,0,this.getWidth(), this.getHeight()); 

     //draws filled circle 
     g.setColor(Color.red); 
     g.fillOval(0,0,this.getWidth(), this.getHeight()); 
    } 
    } 

Bạn cũng có thể ghi đè lên các phương pháp sơn trong lớp khung hình, nhưng sau đó bạn sẽ phải tính toán kích thước của các đồ trang trí cửa sổ và nó bị bẩn có .. .

+0

cảm ơn. Tôi đã tự hỏi nếu có một cách để thêm một điểm nhìn thấy xung quanh các cạnh của vòng tròn tại một tọa độ nhất định? – alchemey89

0

Tôi khuyên bạn nên dành thời gian để xem lại phần "thuật toán vòng tròn trung điểm hoặc thuật toán Bresenham vòng tròn của". Giải pháp được chấp nhận dựa trên các phép toán rất tốn kém như phép nhân nhân và hàm lượng giác.