Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    Problema frattale VonKock jav

    Salve a tutti, questa è la prima volta che chiedo aiuto ad un forum, spero di essere saustiva nel spiegare il mio problema e spero soprattutto che ci sia qualcuno in grado di aiutarmi.
    Ho scritto un programmino in java che mi crea un frattale e poi lo fa rimbalzare per tutta la finestra. Il frattale rimbalza fin tanto che il ciclo che determina la sua posizione va avanti, ma un volta terminto non riesco più a chiudere la finestra. Qualcuno saprebbe dirmi cosa devo scrivere per risolvere questo problema?
    Qui sotto vi posto tutte le classi

    1)VonKock.java

    codice:
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Point;
    import java.awt.Container;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import java.lang.*;
    
    public class VonKock
    {
    
        public static Point trovaP1(Point a,Point b)
        {
            Point p1 = new Point();
            p1.x = a.x + (int)(0.33 * (double)(b.x - a.x));
            p1.y = a.y + (int)(0.33 * (double)(b.y - a.y));
            return p1;
    
        }
    
        public static Point trovaP2(Point a,Point b,Point p1)
        {
            Point p2 = new Point();
            Double l = a.distance(b);
            Double beta = (Math.PI / 3.0) + Math.atan2((b.y - a.y) ,(b.x - a.x));
            p2.x = p1.x + (int)((l / 3.0)* Math.cos(beta));
    
            p2.y = p1.y + (int)((l / 3.0)*Math.sin(beta));
    
            return p2;
        }
    
        public static Point trovaP3(Point a,Point b)
        {
            Point p3 = new Point();
            p3.x = a.x + (int)(0.66 * (double)(b.x - a.x));
            p3.y = a.y + (int)(0.66 * (double)(b.y - a.y));
            return p3;
        }
    
        public static void disegna(Point a, Point b, Graphics g, boolean dis)
        {
            if(dis==true) //DEVO DISEGNARE
               g.setColor(Color.RED);
            else //"CANCELLO"
                g.setColor(Color.BLACK);
    
            if(a.distance(b)<=4)
                g.drawLine(a.x, a.y, b.x, b.y);
            else
            {
                Point p1,p2,p3;
                p1 = trovaP1(a,b);
                p2 = trovaP2(a,b,p1);
                p3 = trovaP3(a,b);
                disegna(a,p1,g,dis);
                disegna(p1,p2,g,dis);
                disegna(p2,p3,g,dis);
                disegna(p3,b,g,dis);
                
    	}
        }
    
    }

    2)MioFrame.java
    codice:
    import java.awt.Frame;
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowListener;
    import java.awt.Container;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    
    public class MioFrame extends Frame implements WindowListener
    {
        private MioCanvas theCanvas;
    
        public MioFrame()
        {
            this.setSize(800, 800);
            this.setVisible(true);
            this.addWindowListener(this);
    
            theCanvas = new MioCanvas(800,800);
            theCanvas.setLocation(100, 100);
    
            this.add(theCanvas);
    
        }
    
        public void windowOpened(WindowEvent e) {
        }
    
        public void windowClosing(WindowEvent e) {
            
        }
    
        public void windowClosed(WindowEvent e) {
         }
    
        public void windowIconified(WindowEvent e) {
        }
    
        public void windowDeiconified(WindowEvent e) {
        }
    
        public void windowActivated(WindowEvent e) {
         }
    
        public void windowDeactivated(WindowEvent e) {
        }
    
    }


    3)MioCanvas.java
    codice:
    import java.awt.Canvas;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Point;
    import java.lang.Thread;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import java.awt.Container;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    
    public class MioCanvas extends Canvas
    {
    
        private int  width,height;
        @SuppressWarnings("empty-statement")
        public MioCanvas(int w,int h)
        {
    
            setSize(w,h);
            width = w;
            height = h;
        }
    
        @Override
        public void paint(Graphics g)
        {
           g.setColor(Color.black);
           g.fillRect(0, 0, width,height);
    
           boolean dis = true;
    
           int versodiviaggio = 3;
           /*
            * se 0 in basso a destra
            * se 1 in alto a destra
            * se 2 in alto a sinistra
            * se 3 in basso a sinistra
            */
           /*
            *@param x coordinata  iniziale Orizzontale della stella
            *@param y coordinata  inizile  Verticale  della  stella 
            */
           int x,y;
    
           x= 200;
    
           y= 400;
           for(int i=0; i< 100; i = i+ 3) {
    
               Point p1 = new Point( x,y );
               Point p2 = new Point( x+50,y );
               Point p3 = new Point( (x+(x+50))/2,y-50);
    
               VonKock.disegna(p1, p2, g,dis);
               VonKock.disegna(p3,p1,g,dis);
               VonKock.disegna(p2,p3,g,dis);
                try {
                    Thread.sleep(15);
                } catch (InterruptedException ex) {
                    Logger.getLogger(MioCanvas.class.getName()).log(Level.SEVERE, null, ex);
                }
    
               dis = !dis;
               p1 = new Point( x,y );
               p2 = new Point( x+50,y );
               p3 = new Point( (x+(x+50))/2,y-50);
    
               VonKock.disegna(p1, p2, g,dis);
               VonKock.disegna(p3,p1,g,dis);
               VonKock.disegna(p2, p3, g,dis);
               dis = !dis;
    
               System.out.println(p1);
               if ( p1.getY()>=height-50 || p1.getX()<=0 || p2.getX()>=width-18 ||
                    p3.getY()<=0   ){
                   System.out.println("ECCO QUANDO CAMBIA: "+p1);
                   versodiviaggio = versodiviaggio==3 ? 0 : ++versodiviaggio;
               }
               switch(versodiviaggio) {
                   case 0: x+=1; y+=1; break;
                   case 1: x+=1; y-=1; break;
                   case 2: x-=1; y-=1; break;
                   case 3: x-=1; y+=1; break;
               }
    
           }
        }
        
    }

    4)Main.java

    codice:
    import java.awt.*;
    import javax.swing.*;
    import java.awt.Container;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.event.*;
    
    public class Main {
    
    
        public static void main(String[] args) {
            MioFrame f = new MioFrame();
        }
    }

  2. #2

    Re: Problema frattale VonKock jav

    Originariamente inviato da Uffy_disp
    2)MioFrame.java
    codice:
    import java.awt.Frame;
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowListener;
    import java.awt.Container;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    
    public class MioFrame extends Frame implements WindowListener
    {
        private MioCanvas theCanvas;
    
        public MioFrame()
        {
            this.setSize(800, 800);
            this.setVisible(true);
            this.addWindowListener(this);
    
            theCanvas = new MioCanvas(800,800);
            theCanvas.setLocation(100, 100);
    
            this.add(theCanvas);
    
        }
    
        public void windowOpened(WindowEvent e) {
        }
    
        public void windowClosing(WindowEvent e) {
            
        }
    
        public void windowClosed(WindowEvent e) {
         }
    
        public void windowIconified(WindowEvent e) {
        }
    
        public void windowDeiconified(WindowEvent e) {
        }
    
        public void windowActivated(WindowEvent e) {
         }
    
        public void windowDeactivated(WindowEvent e) {
        }
    
    }
    Non so a cosa ti serve l'interfaccia WindowListener, visto che non ne implementi nemmeno un metodo.
    Poi in questo caso ti conviene estendere la classe JFrame del pacchetto Swing, e quindi nel costruttore aggiungi questa istruzione:
    codice:
    setDefaultCloseOperation( EXIT_ON_CLOSE );

  3. #3
    Grazie mille per l'aiuto, adesso riesco a chiudere la finestra.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.