2010-03-24 8 views
21

Я действительно зациклился на том, как это сделать. Как нарисовать круг в Java с радиусом и острием по краю?Нарисуйте круг с радиусом и точками вокруг края

Мне нужно нарисовать круг в JFrame с радиусом и острием по окружности. я могу математически рассчитать, как найти координаты точки вокруг края, но я не могу запрограммировать круг. В настоящее время я использую метод Ellipse2D, но он, похоже, не работает и не возвращает радиус, поскольку, насколько я понимаю, он не рисует круг из центра, а не из начальной координаты с использованием высоты и ширины.

Мой текущий код находится на отдельной рамке, но мне нужно добавить его в существующую рамку.

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

ответ

60

Очки на circle могут быть определены как функция от угла & thetas:

х = а + г соз (q)
у = Ь + г Sin (θ)

Здесь приращения 2л/8 показаны.

Приложение: Как было предложено в комментарии от @Christoffer Hammarström, этот пример revised уменьшает число magic numbers в оригинале. Желаемое количество точек становится параметром для конструктора. Он также адаптирует рендеринг к размеру контейнера.

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 для скриншота, который показывает текущий код !!! – OscarRyz

+0

Спасибо, что я только что искал – alchemey89

+0

@windopal: Отлично. См. Мои исправления для неловкой ошибки усечения. @Oscar Reyes: _¡gracias! _. – trashgod

3

попробовать что-то вроде этого:

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

Вы также можете переопределить метод рисования в классе кадров, но тогда вам придется рассчитать размер окна украшений и пачкается там ..

.
+0

спасибо. Мне было интересно, есть ли способ добавить видимую точку вокруг края круга в заданной координате? – alchemey89

0

Я рекомендую занять некоторое время, чтобы рассмотреть «средний точку алгоритма круга или круг алгоритм Bresenham в». Принятое решение основано на очень дорогостоящих математических операциях, таких как умножение на флоат и тригонометрические функции.