Domanda

Sono davvero bloccato su come andare sulla programmazione questo. Come disegnare un cerchio in Java con un raggio ed i punti attorno al bordo?

Ho bisogno di disegnare un cerchio all'interno di un JFrame con un raggio e punti lungo la circonferenza. posso calcolare matematicamente come trovare le coordinate del punto intorno al bordo, ma i cant sembrano essere in grado di programmare il cerchio. Attualmente sto usando un metodo Ellipse2D, ma che non sembra funzionare e non restituisce un raggio, come sotto la mia comprensione, non trae il cerchio dal centro piuttosto iniziando da coordinare con un'altezza e larghezza.

Il mio codice attuale è su un telaio separato, ma ho bisogno di aggiungere al mio telaio esistente.

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); 
 } 
}
È stato utile?

Soluzione

cerchio può essere specificato come una funzione del θ angolo di:

  

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

Qui, con incrementi di 2π / 8 sono mostrati.

Addendum: Come suggerito in un commento di @Christoffer Hammarström, questo rivisto esempio riduce il numero di numeri magici in originale. Il numero desiderato di punti diventa un parametro al costruttore. Si adatta anche il rendering alle dimensioni del contenitore.

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

Altri suggerimenti

Provare qualcosa di simile a questo:

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

È anche possibile eseguire l'override del metodo paint della classe telaio, ma poi la si dovrà calcolare la dimensione delle decorazioni delle finestre e si sporca lì ...

Vi consiglio di prendere un po 'di tempo per rivedere il "algoritmo di punto medio cerchio o algoritmo cerchio di Bresenham". La soluzione accettata si basa su operazioni matematiche molto costose come moltiplicazione galleggiante e funzioni trigonometriche.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top