2017-02-04 13 views
-2

그리드와 Bresenham의 Circle Algorithm을 사용하여 타원을 그리는 GUI 기반 프로그램을 만들려고합니다. 그러나 두 가지 문제가 있습니다. 하나는 새로운 r 값이 GridComponent에 전달되고 타원이 새로운 반경으로 다시 그려지도록 panel_grid를 새로 고칠 수 없다는 것입니다. 두 번째 문제는 내가 원을 생성하는 코드를 얻을 수 있었지만 대신 타원을 생성하기 위해이 코드를 수정하는 방법을 알 수 없었습니다. 누군가 나에게이 두 가지 문제를 해결하는 방법을 단계별로 설명 할 수 있습니까? 미리 감사드립니다.Bresenham의 원 알고리즘을 사용하여 Java에서 타원 생성

public class GUI extends JFrame { 

    private int r = 100; 

    public GUI(){ 
     JFrame frame = new JFrame("Bresenham’s Ellipse Algorithm"); 
     frame.setIconImage(Toolkit.getDefaultToolkit().getImage(GUI.class.getResource("/com/sun/java/swing/plaf/windows/icons/TreeLeaf.gif"))); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.setPreferredSize(new Dimension(600, 600)); 
     frame.setMinimumSize(new Dimension(440, 400)); 
     JPanel panel = new JPanel(); 

     JLabel label = new JLabel("Input the Dimensions of the Ellipse"); 
     label.setFont(new Font("Sinhala Sangam MN", Font.PLAIN, 16)); 
     JPanel panel_inst = new JPanel(); 
     panel_inst.setPreferredSize(new Dimension(550, 30)); 
     panel_inst.add(label); 

     panel.add(panel_inst); 

     JPanel panel_1 = new JPanel(); 
     JLabel w = new JLabel("Radius"); 
     JTextField width = new JTextField(10); 
     JPanel panel_grid = new JPanel(); 
     JButton draw = new JButton("Draw"); 
     draw.setPreferredSize(new Dimension(80, 25)); 

     draw.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) {     
       r = Integer.parseInt(width.getText()); 
       panel_grid.revalidate(); 
       panel_grid.repaint(); 
      } 
     }); 
     panel_1.add(w); 
     panel_1.add(width); 
     panel_1.add(draw);  

     panel.add(panel_1); 

     panel_grid.setBackground(Color.white); 
     panel_grid.setPreferredSize(new Dimension(550, 450)); 
     GridComponent grid = new GridComponent(r); 
     panel_grid.add(grid); 
     panel.add(panel_grid); 

     frame.pack(); 
     frame.setVisible(true); 
     frame.setContentPane(panel); 
     } 


    public class GridComponent extends JComponent{ 
     int r; 
     public GridComponent(int r){ 
      this.r = r; 
      setPreferredSize(new Dimension(550, 450)); 
     } 

     public void paintComponent(Graphics g){ 

      //Draw Grid 
      Graphics2D g2 = (Graphics2D) g; 
      int width = 54; 
      int height = 44; 
      int size = 10; 
      for(int i = 0; i < width; i ++){ 
       for(int j = 0; j < height; j++){ 
        Rectangle grid = new Rectangle(0 + i * size, 0 + j * size, size, size); 
        g2.draw(grid); 
       } 
      } 
      g.setColor(Color.black); 
      g2.fillOval((int)Math.floor((width*size)/2)-3,(int)Math.floor((height*size)/2-6)+3, 5, 5); 
      g2.drawLine(0, (int)Math.floor((height*size)/2)-1, (int)Math.floor((width*size)), (int)Math.floor((height*size)/2)-1); 
      g2.drawLine((int)Math.floor((width*size/2))-1, 0, (int)Math.floor((width*size)/2)-1, (int)Math.floor((height*size))); 


      //Draw Ellipse using algo 
      int a = (int)Math.floor((height*size/2));//(int)Math.floor((width*15/2)); 
      int b = (int)Math.floor((width*size/2));// (int)Math.floor((height*15/2)); 

      int x = r, y = 0, d = 3 - 2*r; 
      g2.setColor(Color.red); 
      // x is initially r, x will be same as y at 45(degree) angle 
      while(y <= x) { 

       // Eight way symmetry of circle 
       g2.drawString("+", x + b, y + a); 
       g2.drawString(".", y + b, x + a); 
       g2.drawString("+", (-1)*y + b, x + a); 
       g2.drawString(".", (-1)*x + b, y + a); 
       g2.drawString("+", (-1)*x + b, (-1)*y + a); 
       g2.drawString(".", (-1)*y + b, (-1)*x + a); 
       g2.drawString("+", y + b, (-1)*x + a); 
       g2.drawString(".", x + b, (-1)*y + a); 

       if(d < 0) // move Up = d + Up + 2 
        d = d + 4*y + 6; 
       else { // move Left = d + Left + 2 
        d = d - 4*(x - y) + 10; 
        //Since we've started at the right hand side of the circle 
        x = x - 1; 
       } 

       // Since we have started at top of the circle 
       y = y + 1;  
      } 
     } 
     private int side; 

    } 


} 

답변

1

시작

...

당신의 GridComponent 클래스 다음

public void setR(int r) { 
    this.r = r; 
    repaint(); 
} 

에 반경에 대한 세터를 추가하여 GridComponent와 상호 작용하기 위해 ActionListener 변경 그것을 setter 메서드라고 부르십시오

GridComponent grid = new GridComponent(r); 
draw.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     r = Integer.parseInt(width.getText()); 
     grid.setR(r); 
    } 
}); 

질문의 첫 부분에 답할 답변은 무엇입니까?

두 번째 부분은 더 어렵습니다 그리고는 다른, 당신은 당신이

그러나, Bresenham's circle/ellipse drawing algorithm는 통찰력을 제공 할 수있는 폭과 높이 반경을 필요로 두 개의 값을 필요로 말을, 코드를 생성하려고 시도하지 않을거야