2010-03-24 13 views
21

Naprawdę utknąłem na temat programowania tego. Jak narysować okrąg w Javie z promieniem i punktami wokół krawędzi?Narysuj okrąg z promieniem i punktami wokół krawędzi

Muszę narysować okrąg w ramce JFrame o promieniu i punktach na obwodzie. Mogę matematycznie obliczyć, jak znaleźć współrzędne punktu wokół krawędzi, ale nie mogę wydawać się w stanie zaprogramować koło. Obecnie używam metody Ellipse2D, ale to nie działa i nie zwraca promienia, ponieważ pod moim rozumieniem nie rysuje koła od środka, a nie od współrzędnej początkowej z wykorzystaniem wysokości i szerokości.

Mój obecny kod znajduje się w oddzielnej ramce, ale muszę dodać go do istniejącej ramki.

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

Odpowiedz

60

punktów na circle może być określona jako funkcja kąta θ:

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

Tutaj przyrosty 2n/8 przedstawiono.

Dodatek: jak zasugerowano w komentarzu @Christoffer Hammarström, ten przykład revised redukuje liczbę magic numbers w oryginale. Żądana liczba punktów staje się parametrem konstruktora. Dostosowuje również renderowanie do rozmiaru kontenera.

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 dla zrzutu ekranu pokazującego działający kod !!! – OscarRyz

+0

Dziękujemy, właśnie tego szukałem – alchemey89

+0

@windopal: Excellent. Zobacz moje zmiany, aby uzyskać krępujący błąd związany z obcięciem. @Oscar Reyes: _¡gracias! _. – trashgod

3

spróbować czegoś takiego:

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

Można również zastąpić metodę malowania w klasie ramki, ale wtedy miałby trzeba obliczyć w rozmiarze dekoracji okiennych i zabrudzi tam .. .

+0

dzięki. Zastanawiam się, czy istnieje sposób na dodanie widocznego punktu wokół krawędzi okręgu przy danej współrzędnej? – alchemey89

0

Polecam poświęcić trochę czasu na zapoznanie się z „punktu środkowego koła lub algorytm algorytm okrąg Bresenham za”. Przyjęte rozwiązanie opiera się na bardzo kosztownych operacjach matematycznych, takich jak mnożenie pływaka i funkcje trygonometryczne.