Frage

Ich bin wirklich stecken, wie man über die Programmierung dieses gehen. Wie mit einem Radius und Punkten um den Rand einen Kreis in Java ziehen?

Ich brauche einen Kreis in einem JFrame mit einem Radius zu ziehen und die Punkte um den Umfang. i kann mathematisch berechnen, wie die Koordinaten des Punktes um den Rand zu finden, aber ich kann nicht scheinen zu können, um den Kreis programmieren. Ich bin derzeit eine Ellipse2D Methode verwenden, aber das scheint nicht zu Arbeit und kehrt nicht mit einem Radius, wie unter meinem Verständnis ist es nicht, den Kreis von der Mitte zieht eher von einem Startkoordinaten eine Höhe und Breite verwendet wird.

Mein aktueller Code ist auf einem separaten Rahmen, aber ich brauche es zu meinem bestehenden Rahmen hinzuzufügen.

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); 
 } 
}
War es hilfreich?

Lösung

Punkte auf einem Kreis kann als eine Funktion des Winkels θ angegeben werden:

  

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

Hier Schritte von 2π / 8 angezeigt.

Nachtrag: Wie bereits angedeutet in einem Kommentar von @Christoffer Hammarström dies Beispiel überarbeitet reduziert die Anzahl der magische Zahlen im Original. Die gewünschte Anzahl von Punkten wird ein Parameter für den Konstruktor. Es passt sich auch die Darstellung der Größe des Behälters.

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

Andere Tipps

Versuchen Sie etwas wie folgt aus:

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

Sie können auch die Farbe Methode in der Rahmenklasse außer Kraft setzen, aber dann würden die Sie haben in der Größe der Fensterdekorationen zu berechnen, und es wird schmutzig dort ...

Verwenden Sie Minueto .

Ich empfehle einige Zeit in Anspruch nehmen, den „Rasterung von Kreisen oder Bresenham Kreis-Algorithmus“ zu überprüfen. Die akzeptierte Lösung basiert auf sehr kostspielig mathematischen Operationen wie float Multiplikation und trigonometrische Funktionen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top