2017-02-04 18 views
-2

で楕円を生成するためのブレゼンハムのサークルアルゴリズムを用いました。しかし、私は2つの問題を抱えています。 1つは、rの新しい値がGridComponentに渡され、楕円が新しい半径で再描画されるように、panel_gridをリフレッシュすることができないことです。 2番目の問題は、円を生成するコードを取得することができましたが、代わりに楕円を生成するように修正する方法がわかりません。誰かが私にこれらの問題を解決する方法を段階的に説明できますか?前もって感謝します。私は楕円を描画するためにグリッドを使用して、ブレゼンハムのサークルアルゴリズムのGUIベースのプログラムを作成しようとしています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を変更しますそれはセッターメソッド

の呼びかけあなたの質問の最初の部分にお答えします

第二部ではより困難であると私は、他には、あなたが

しかし、Bresenham's circle/ellipse drawing algorithmは洞察力を提供するかもしれない幅と高さの半径を必要とし、2つの値を必要と言って、コードを生成しようとするつもりはありません

関連する問題