codice:
	    
    import java.awt.*;    
    import java.awt.Graphics;
    import java.awt.Image;
    import javax.swing.*;
    import javax.imageio.ImageIO;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.awt.event.*;
    import javax.script.ScriptEngineManager;
    import javax.script.ScriptEngine;    
    import javax.script.ScriptException;
    import javax.script.SimpleBindings;
    import static java.lang.Math.*;
      
    public class Draw extends JFrame {
    
    
       public static void main(String [] args) {                           
                
                SwingUtilities.invokeLater(() -> new Draw().setVisible(true));
                                 
       }  
      
       
       public Draw(){
       
        setSize(800, 800);                  
                                    
        setVisible(true); 
        
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                        
        add(new Pannello());
                
       } 
       
 
   }
   
  
   //Classe Pedina è l'elemento che si sposta nelle 3 Dimensioni a scatti.    
   class Pedina{ 
       
       //Valori di riferimento relativi al poligono(vedere immagine assonometria-isometrica)
     private int LX = 52;
        private int LY = 52;                                   
        private int LZ = 60;
        
        private double X; private double Y; private double Z;
        
        private String Name = "";
       
       private Color Col;
       
       private Polygon p;
       
       private Point[] P = new Point[4];
       private Point[] A = new Point[4];
       
       String getName() {
           return Name;
    }
    
    double getX() {
           return X;
    }
    double getY() {
           return Y;
    }
    double getZ() {
           return Z;
    }
    Point[] getP() {
           return P;
    }
    //Serve a centrare il poligono
    Point getC() {
           return new Point((P[0].x+P[2].x)/2,(P[0].y+P[2].y)/2);
    }
        
    void setX(double X) {
           this.X = X;
    }
     void setY(double Y) {
           this.Y = Y;
    }
    void setZ(double Z) {
           this.Z = Z;
    }
    
    void setXYZ(double X, double Y, double Z) {
        this.X = X;
        this.Y = Y;
        this.Z = Z;
    }
    void Scala(int n){
    
            for(int k=0; k<n; k++){
        
            A[1].x=A[0].x/2+A[1].x/2;
               A[1].y=A[0].y/2+A[1].y/2;               
               
               A[3].x=A[0].x/2+A[3].x/2;
               A[3].y=A[0].y/2+A[3].y/2;
               
               A[2].x=A[0].x/2+A[2].x/2;
               A[2].y=A[0].y/2+A[2].y/2;
           
               
               }
        
    }
       
       Pedina(String name, double X, double Y, double Z, Color col){
       
                     
               //I punti A[] sono gli estremi del parallelogramma(poligono/pedina) 
               //rappresentato
                   
                 A[0] = new Point(222,250);
               A[1] = new Point(275,275);
               A[2] = new Point(222,300);
               A[3] = new Point(170,275);                                
               
               Scala(4); //Scala la pedina di n=4(in tal caso) fattori
                      
               setX(X); setY(Y); setZ(Z);
                
            P[0] = new Point((int)(A[0].x-LX*(X-1)+(Y-1)*LX),
                     (int)(A[0].y+(X-1)*LY/2+LY/2*(Y-1)-(Z-1)*LZ));  
                     
                P[1] = new Point((int)(A[1].x-LX*(X-1)+(Y-1)*LX),
                     (int)(A[1].y+(X-1)*LY/2+LY/2*(Y-1)-(Z-1)*LZ));  
                         
                P[2] = new Point((int)(A[2].x-LX*(X-1)+(Y-1)*LX),
                     (int)(A[2].y+(X-1)*LY/2+LY/2*(Y-1)-(Z-1)*LZ)); 
                         
                  P[3] = new Point((int)(A[3].x-LX*(X-1)+(Y-1)*LX),
                     (int)(A[3].y+(X-1)*LY/2+LY/2*(Y-1)-(Z-1)*LZ));  
                         
                p = new Polygon();
                
                
                p.addPoint(P[0].x,P[0].y);   
                p.addPoint(P[1].x,P[1].y); 
                p.addPoint(P[2].x,P[2].y); 
                p.addPoint(P[3].x,P[3].y); 
                
                Col = col;
                Name = name;
                
    }      
    
    //Funzione che cambia la posizione della pedina:
    
    void changePosition(){
    
        
            P[0] = new Point((int)(A[0].x-LX*(X-1)+(Y-1)*LX),
                     (int)(A[0].y+(X-1)*LY/2+LY/2*(Y-1)-(Z-1)*LZ));  
                     
                P[1] = new Point((int)(A[1].x-LX*(X-1)+(Y-1)*LX),
                     (int)(A[1].y+(X-1)*LY/2+LY/2*(Y-1)-(Z-1)*LZ));  
                         
                P[2] = new Point((int)(A[2].x-LX*(X-1)+(Y-1)*LX),
                     (int)(A[2].y+(X-1)*LY/2+LY/2*(Y-1)-(Z-1)*LZ)); 
                         
                  P[3] = new Point((int)(A[3].x-LX*(X-1)+(Y-1)*LX),
                     (int)(A[3].y+(X-1)*LY/2+LY/2*(Y-1)-(Z-1)*LZ));  
                    
                p = new Polygon();
                
                p.addPoint(P[0].x,P[0].y);   
                p.addPoint(P[1].x,P[1].y); 
                p.addPoint(P[2].x,P[2].y); 
                p.addPoint(P[3].x,P[3].y);
    }
    
    //Funzioni per il recupero del poligono/colore
    public Polygon getPXYZ(){return p; }
    public Color getCol(){return Col; }
       
   }
   
   class Pannello extends JPanel {    
   
   
       String fileName;
       BufferedImage imageFile;
       BufferedImage image;
       File file;
       
    Pedina Pedina;
   
    JTextField TX;
    JTextField TY;
    JTextField TZ;
    
    JButton B;
       
    double X0 = 1.0; double Y0 = 1.0; double Z0 = 1.0;    
     
   
        Pannello(){
        
            JLabel     LX = new JLabel("X:");
                        LX.setVisible(true);
                        LX.setLocation(400,500);    
                        LX.setSize(100,25);
                        
                      TX = new JTextField("1.0");
                        TX.setVisible(true);
                        TX.setLocation(500,500);    
                        TX.setSize(100,25);
        JLabel     LY = new JLabel("Y:");   
                    LY.setVisible(true);
                        LY.setLocation(400,535);    
                        LY.setSize(100,25);    
                                        
                     TY = new JTextField("1.0");
                        TY.setVisible(true);
                        TY.setLocation(500,535);    
                        TY.setSize(100,25);
        JLabel     LZ = new JLabel("Z:");    
                    LZ.setVisible(true);
                        LZ.setLocation(400,570);    
                        LZ.setSize(100,25);
                                            
                     TZ = new JTextField("1.0");
                        TZ.setVisible(true);
                        TZ.setLocation(500,570);    
                        TZ.setSize(100,25);     
                        
                B = new JButton("Imposta");
                        B.setVisible(true);
                        B.setLocation(500,590);    
                        B.setSize(100,25);           
            
            this.setLayout(null);       
            
            this.add(LX);
            this.add(LY);
            this.add(LZ);
            
            this.add(TX);
            this.add(TY);
            this.add(TZ); 
                                              
            B.addActionListener(new load_XYZ());                       
            
            this.add(B);
            
            Pedina = new Pedina("Pedina", X0,Y0,Z0, new Color(0,0,255));
            
            //Percorso File immagine Isometrica(allegata)              
        fileName = "/home/cartella/img/ass-isometrica.png";
        
        imageFile = new BufferedImage(800,800,BufferedImage.TYPE_INT_RGB);
        
        file = new File(fileName);
        
        try {                         
        
            imageFile = ImageIO.read(file);                                
            
        
        } catch(Exception e) {
            System.out.println(e);
        }
                                   
                   
        
        }
        
        private class load_XYZ implements ActionListener {
            
        public void actionPerformed(ActionEvent e) { 
        
            X0 = Double.parseDouble(TX.getText());    
            Y0 = Double.parseDouble(TY.getText());
            Z0 = Double.parseDouble(TZ.getText());
            
            Pedina.setXYZ(X0,Y0,Z0);
            Pedina.changePosition();        
                
            repaint();                    
                                                                                                        
        }
            
      }
      
      public double eval(String str) throws Exception{
          ScriptEngineManager sem = new ScriptEngineManager();
            ScriptEngine engine = sem.getEngineByName("JavaScript"); 
            System.out.println(sem.getEngineFactories()); 
            return (double)engine.eval("5+3");         
    }
 
   
        @Override
        protected void paintComponent(Graphics g)  {
        
            super.paintComponent(g);                                    
                                                            
        image = imageFile;                    
                    
        g.drawImage(image, 0, 0, null);            
        
        System.out.println("OK");
        
        double k=0.0628;
        double j=0.0628;
        int n=0; 
        int m=0;        
        
        double r=0.25; double R=1;
        
        Color colore = new Color(0,0,0);
        
        /*
        try {
        eval("4+2");
        }
        catch(Exception e){};*/
        
        for(double v=0; v<=6.28; v+=j){    
                            
                                        
            for(double u=0; u<=6.28; u+=k){
            
                                                                                                                                                        
                //Coordinate parametriche per rappresentare il toro:                
                X0 = (R+r*cos(v))*cos(u);
                Y0 = (R+r*cos(v))*sin(u);
                Z0 = r*sin(v);
             
                                
                                                                
                    Pedina.setXYZ(X0,Y0,Z0);
                    
                    Pedina.changePosition();  
                                   
                    //*Esempio di variazione del colore(da migliorare):
                    colore = new Color((int)(n%200),50,0);
                                        
                    g.setColor(colore);    
                                                           
                    n++;  
                                      
                    g.fillPolygon(Pedina.getPXYZ()); 
                    
                    
                                                                     
                     
                }                                   
                
                
                m++;
                
              
                    
            }
            
            
            
        }
                
        
    }