Jak zapisać w postaci rekurencyjnej

0

Witam. Napisałem programik rysujący kółka w jFramie. W programie podaje się liczbę która oznacza o ile jest mniejsze kółko jedno od drugiego. Niestety muszę zapisać go w postaci rekurencyjnej i zbytnio nie wiem jak to zapisać.
Główna instrukcja wygląda tak:

private void przyciskActionPerformed(java.awt.event.ActionEvent evt) {                                         
        String wpisano = liczba.getText();
        int wartosc = Integer.parseInt(wpisano);
        Graphics kolo=getGraphics();
        kolo.setColor(Color.PINK);
        for (int i=0; i<=200; i+=wartosc)
        {
            kolo.drawOval(100+(i/2), 100+(i/2),200-i ,200-i);
        }
0

Nie wiem co ma być rekurencyjne więc Ci nie pomogę. Dam Ci radę, nie rysuj w obsłudze zdarzenia, rysuj tylko i wyłącznie w metodzie paint lub paintComponent, w obsłudze zdarzenia wywołaj tylko repaint. (Zminimalizuj swój program z namalowanymi kółkami i przywróć poprzedni rozmiar).

0

Ogólnie zadanie brzmi tak:
Napisać program rysujący coraz mniejsze kółka przy pomocy rekurencji. W programie wprowadzamy do pola tekstowego o ile pikseli ma mieć mniejszy promień kółko od poprzedniego.
Wszystko zrobiłem.. tylko nie zrobiłem tego zadania w sposób rekurencyjny i właśnie nie wiem zbytnio jak zapisać.

0

Pseudokod:

fun drawCircle(graphics2d, x, y, promien):
jesli promien > 0:
graphics2d.drawEllipse(x, y, promien, promien)
drawCircle(x, y, promien - delta)

Dostosowac do drawEllipse itp powinienes dac rade.

0

Udało mi się tak napisać:


package zaliczeniezad02.pkg1;

import java.awt.Color;
import java.awt.Graphics;


public class rysunek extends javax.swing.JFrame {

    
    public rysunek() {
        initComponents();
    }

    
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        text = new javax.swing.JTextField();
        liczba = new javax.swing.JTextField();
        przycisk = new javax.swing.JToggleButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        text.setText("    Podaj liczbe pikseli o ile bedzie zmniejszać się promień kół:");

        liczba.setText("5");

        przycisk.setText("Rysuj");
        przycisk.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                przyciskActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(przycisk, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(text, javax.swing.GroupLayout.PREFERRED_SIZE, 331, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(liczba, javax.swing.GroupLayout.DEFAULT_SIZE, 53, Short.MAX_VALUE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(text, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(liczba, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(przycisk)
                .addContainerGap(251, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void przyciskActionPerformed(java.awt.event.ActionEvent evt) {                                         
        String wpisano = liczba.getText();
        int wartosc = Integer.parseInt(wpisano);                                     
        kuleczka(wartosc);       
           
    }                                        
Graphics kuleczka (int x)
        {
            
            Graphics kolo=getGraphics();
            kolo.setColor(Color.PINK);
            int i=0;
            for ( i=0; i<=200; i+=x)
       {
           kolo.drawOval(100+(i/2), 100+(i/2),200-i ,200-i);
        }
            return kolo;          
            
        }
   
    public static void main(String args[]) {
       
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new rysunek().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify                     
    private javax.swing.JTextField liczba;
    private javax.swing.JToggleButton przycisk;
    private javax.swing.JTextField text;
    // End of variables declaration                   
}
</code

Czy jest to poprawnie rekurencyjnie napisane?
Pisałem w NetBeans JFrame Java.
0

Nie, nie jest, przeciez rysujesz te kola znowu iteracyjnie, w petli for, a to miales juz w pierwszym poscie...

0

Kod działa błędnie:

  • instrukcje rysujące są w niewłaściwym miejscu => narysowane okręgi znikają gdy użytkownik zmaksymalizuje okno,
  • nowe rysowanie po zmianie promienia nie usuwa poprzednich okręgów,
  • trzeba kliknąć dwa razy, żeby się cos narysowało.

1 użytkowników online, w tym zalogowanych: 0, gości: 1