Newsgroup: it.comp.java
Titolo: AffineTrasform per Fabrizio ( Lungo)

Ormai per Fabrizio sono diventato assillante !! e anche per gli altri! Ti
invio anche sul news il listato con il problema della classe AffineTrasform!
Devo disegnare su di un frame la regione lazio ( è un progetto per
un'esame!)prendendo le coordinate da un txt importato da autocad, ma ho
notevole difficoltà a capire il funzionamento della classe affine transform,
l'ultima modifica che ho apportato al programma mi disegna il tutto ma in
modo microscopico!
Stò impazzendo! non capisco come ruotare gli assi dal momento che autocad ha
la y crescente verso l'alto invece java verso il basso ( non posso ruotare
le coord di autocad perchè non posso modificare i dati in ingresso per le
specifiche di progetto!) E sulla rete non ci sono esempi dettagliati! Invio
anche una parte del txt per vedere il " botto " di coordinate che ho!
Aiuto!!! e grazie in anticipo qualunque sarà l'esito della risposta!.
import javax.swing.JFrame;
 import javax.swing.JPanel;
 import java.awt.Graphics;
 import java.awt.Graphics2D;
 import java.awt.Container;
 import java.util.StringTokenizer;
 import java.util.Arrays;
 import java.awt.Polygon;
 import java.awt.geom.AffineTransform;
 import java.awt.geom.Rectangle2D;
 public class RegioneLazio
    {
 public static void main (String[]args )
 {
  LazioFrame frame = new LazioFrame ();
 frame.setTitle(" PROVINCIA DI RIETI");
 frame.show();
 }
 }
 class LazioFrame extends JFrame
 {public LazioFrame ()
   { setSize(800, 600);
 file://costruisco i componenti
 panel =new LazioPanel();
 file://costruisco riferimento a lastra contenuti
 Container contentPane= getContentPane();
 contentPane.add(panel, "Center");
  }
 private LazioPanel panel;
  }
  file://adesso definiamo la classe LazioPanel
  class LazioPanel extends JPanel
  { public void paintComponent(Graphics g)
  { super.paintComponent(g);
  Graphics2D g2= (Graphics2D)g;
   final int X_LENGHT = 500;
   final int Y_LENGHT = 500;
   double []x= new double[X_LENGHT];
   double []y= new double[Y_LENGHT];
    int xsize =0;
    int ysize=0;
    String linea =" ";
 ConsoleReader console = new ConsoleReader(System.in);
    boolean done = false;
    while (!done)
 { linea= console.readLine();
     if( linea==null)  done=true;
         else
 {StringTokenizer tokenizer= new StringTokenizer(linea);
   while ( tokenizer.hasMoreTokens())
    {
 if(xsize<x.length)
 {
    x[xsize]= Double.parseDouble(tokenizer.nextToken());
    xsize++;
     }
     else
     {double [] BigX = new double [3*x.length];
     file://copio tutti gli elementi da x a BigX
     System.arraycopy ( x,0,BigX, 0, x.length);
      x=BigX;  }
    if(ysize<y.length)
 {
    y[ysize]= Double.parseDouble(tokenizer.nextToken());
    ysize++;
     }
     else
     { double [] BigY = new double [3*y.length];
     file://copio tutti gli elementi da y a BigY
     System.arraycopy ( y,0,BigY, 0, y.length);
     y=BigY;  }
  }  }
       }
/* ??? non possiamo applicare il metodo System Array Copy
 perchè non dobbiamo copiare array "identici" */
        int[] xdraw=new int[xsize];
        for(int i=0; i<xsize; i++)
        xdraw[i]=(int)Math.round(x[i]);
         int[] ydraw=new int[ysize];
        for (int j=0; j<ysize; j++)
        ydraw[j]=(int)Math.round(y[j]);
        Polygon Rieti= new Polygon(xdraw, ydraw,xsize) ;
        Rectangle2D box = Rieti.getBounds2D();
        double xMax= box.getMaxX();
        System.out.println("La x massima del box è"+" "+ xMax);
        double xMin= box.getMinX();
        System.out.println("La x minima  del box è"+" "+ xMin);
        double yMax= box.getMaxY();
        System.out.println("La y massima del box è"+" "+ yMax);
        double  yMin= box.getMinY();
        System.out.println("La y minima del box è"+" "+ yMin);
    double altezza = box.getHeight();
    double larghezza = box.getWidth();
    System.out.println( "l'altezza è "+ " " +altezza);
     System.out.println( "la larghezza è "+ " " +larghezza);
     file:/ normalizzazione:  scalamento+traslazione
    AffineTransform a = new
AffineTransform(AffineTransform.getScaleInstance(0.001, 0.0001));
    AffineTransform b = new
AffineTransform(AffineTransform.getTranslateInstance( 1,-100));
   b.concatenate(a);
   g2.transform(b);
  // funziona con le coordinate normali ma con quelle di autocad no!!!!
 g2.draw(box);
  g2.draw(Rieti);
   }  }
Ecco invece una parte del file TXT:
          790239.63    4688699.50
          789078.31    4688924.00
          788240.88    4688657.50
          787531.44    4688970.50
          786415.69    4690878.50
          787620.56    4691343.00
          786965.25    4691916.50
          785941.44    4692154.00
          785313.56    4693204.50
          785341.81    4694110.50
          786276.19    4694938.50
          786261.38    4695446.00
          785301.56    4695133.50
          784601.88    4695440.00
          784648.31    4696471.50
          785325.63    4696920.50
          784432.88    4697262.50
          784653.38    4697434.50
          785310.31    4697236.50
          784585.31    4697645.50
          784816.38    4698150.50
          784240.06    4698071.50
          784083.38    4698396.50
          783630.25    4698166.50
          783132.06    4698330.00
          783086.81    4699015.00
          783624.81    4699428.00
          783045.56    4699641.50
          783457.44    4699899.00
          783538.38    4699819.50
          783781.88    4699779.00
          784011.69    4699763.50
          784242.56    4699722.00
          784356.63    4699733.50
          784471.19    4699732.00
          784596.63    4699775.50
          784709.13    4699824.50
          784796.13    4699873.00
          784905.81    4699986.00
          785020.81    4700124.50
          785127.44    4700161.00
          785223.00    4700159.00
          785284.81    4700053.00
          785363.19    4700005.50
          785460.38    4699965.00
          785592.44    4700002.50
          785890.25    4700180.50
          785995.50    4700249.00
          786145.25    4700319.00
          786239.19    4700354.50
          786396.38    4700400.00
          786574.25    4700407.50
          786688.56    4700412.00
          786828.88    4700405.50
          786957.31    4700379.00
          787074.38    4700320.50
          787190.63    4700280.50
          787245.00    4700200.00
          787318.94    4700108.00
          787398.75    4700028.50
          787451.69    4699980.00
          787509.69    4699963.00
          787597.81    4699986.00
          787701.19    4700099.00
          787802.88    4700249.50
          787861.81    4700360.00
          787926.81    4700477.50
          788063.81    4700547.50
          788208.31    4700592.00
          788342.50    4700578.50
          788451.88    4700551.00
          788558.69    4700434.50
          788756.88    4700265.00
          788837.19    4700173.00
          788968.06    4700089.50
          789028.25    4700022.00
          789114.69    4699936.50
          789188.38    4699850.50
          789242.69    4699770.00
          789293.19    4699632.00
          789292.00    4699511.00
          789284.19    4699396.00
          789274.69    4699173.00
          789224.00    4699018.00
          789159.63    4698887.50
          789144.31    4698798.00
          789094.00    4698636.50
          789074.31    4698501.50
          789023.94    4698340.50
          789097.06    4698267.00
          789169.44    4698213.00
          789275.13    4698122.00
          789392.50    4698057.00
          789530.81    4697948.00
          789643.44    4697845.00
          789710.19    4697771.50
          789778.63    4697660.00
          789834.06    4697554.00
          789884.00    4697428.50
          789883.13    4697301.00
          789849.88    4697185.00
          789932.38    4697042.50
          789937.25    4696928.00
          789967.31    4696820.50
          790036.00    4696702.50
          790147.00    4696637.00
          790271.25    4696559.50
          790406.56    4696521.00
          790521.75    4696506.50
          790649.88    4696486.50
          790789.69    4696492.50
          790859.50    4696496.00
          790941.25    4696518.50
          791034.94    4696560.50
          791114.81    4696627.50
          791185.88    4696752.00
          791242.56    4696913.50
          791243.19    4697047.00
          791166.25    4697209.50
          791098.13    4697315.00
          791029.38    4697433.00
          791025.06    4697534.50
          791053.81    4697605.50
          791114.63    4697672.00
          791233.13    4697728.00
          791384.56    4697760.00
          791517.94    4697766.00
          791638.94    4697764.50
          791721.25    4697774.00
          791796.69    4697796.50
          791906.13    4697915.50
          791970.56    4698046.00
          792004.56    4698143.00
          792049.38    4698285.00
          792140.88    4698378.00
          792220.75    4698445.00
          792340.13    4698482.00
          792472.44    4698513.00
          792677.38    4698483.50
          792754.44    4698467.50
          792883.13    4698435.00
          793004.63    4698421.00
          793129.50    4698477.50
          793240.88    4698552.00
          793350.81    4698659.00
          793437.06    4698726.00
          793543.44    4698768.50
          793677.13    4698768.00
          793779.88    4698747.50
          793986.50    4698826.00
          794320.88    4699044.00
          794726.81    4699373.50
          795128.44    4699804.00
          795492.38    4700074.50
          795676.69    4700228.50
          795926.31    4700494.00
          796087.38    4700597.00
          796260.94    4700706.00
          796487.13    4700773.00
          796663.69    4700812.00
          796850.75    4700903.00
          796955.50    4700983.50
          797029.31    4701191.00
          797010.63    4701330.00
          796959.88    4701474.50
          796936.19    4701581.50
          796919.44    4701676.50
          796944.38    4701836.50
          797017.63    4701910.00
          797133.38    4702029.50
          797268.56    4702143.50
          797315.31    4702241.00
          797407.44    4702467.50
          797502.31    4702777.50
          797526.44    4702957.00
          797559.13    4703086.00
          797508.38    4703230.00
          797414.63    4703487.00
          797316.94    4703686.50
          797283.00    4703883.00
          797275.44    4704061.00
          797272.75    4704271.00
          797209.88    4704402.00
          797111.81    4704461.00
          797078.13    4704504.50
          797047.81    4704617.50
          797087.38    4704734.00
          797164.81    4704858.50
          797254.38    4704996.00
          797362.75    4705140.50
          797426.94    4705277.00
          797496.56    4705432.50
          797566.88    4705722.50
          797635.00    4706063.00
          797675.44    4706306.50
          797723.63    4706518.50
          797766.00    4706718.50
          797806.19    4706968.00
          797778.13    4707177.00
          797709.13    4707301.50
          797605.69    4707488.00
          797535.25    4707644.50
          797447.25    4707768.00
          797380.44    4707841.50

          790239.63    4688699.50
[CUT]
Magari mandami in mail il file completo (prima zippalo), così mi
guardo il Lazio (!) e lo uso per qualche test di prestazioni.
Grazie e a presto.
-- 
Ciao
	Fabrizio C.

Devo disegnare su di un frame la regione lazio...
Sei sparito? Hai risolto? Hai rinunciato?
Facci sapere qualcosa.
-- 
Ciao
	Fabrizio C.

"Fabrizio Camera" <f.came...@Mtiscali.it> ha scritto nel messaggio
news:3bd07d8c...@news.libero.it...

Non sono sparito! ho risolto con la trasformazione affine dopo vari
tentativi
cercando di capire come era la figura, ma al prof non va bene perchè devo
applicare la matrice per la trasformazione affine, e la cosa si fà
difficile!.
Comunque almeno adesso ho visto la regione lazio .....ma per poco!
Ho messo la lettura dell'array nella paintcomponent...e appena iconizzo
ovviamente sparisce tutto! Ma se la metto fuori quando disegno non vede le
variabili ( che ovviamente sono di un'altra classe!
Ultimo problema......come faccio a separare il files con le coordinate e
memorizzare porzioni del files
in più array??? esempio... coordinate dellla provincia di roma di
latina..ecc...
Ho provato a mettere una sringa da riconoscere per cambiare array, ma il
prog si blocca.
Il prof  ha detto di fare due cicli e cambiare il riferimento
all'array!!!!!!!!!
Come vedi la situazione si fà sempre più tragica!!!!!!!!!!!!!!!
Grazie .
Donato
import javax.swing.JButton;
 import javax.swing.JFrame;
 import javax.swing.JPanel;
 import java.awt.Graphics;
 import java.awt.Graphics2D;
 import java.awt.Container;
 import java.util.StringTokenizer;
 import java.util.Arrays;
 import java.awt.Polygon;
 import java.awt.geom.AffineTransform;
 import java.awt.geom.Rectangle2D;
 import java.awt.Color;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.ActionEvent;
 public class LazioFrames
   {public static void main (String[]args )
 {LazioFrame frame = new LazioFrame ();
  frame.setTitle(" REGIONE LAZIO");
  frame.show();
 }
 }
 class LazioFrame extends JFrame
 {public LazioFrame ()
   {final int FRAME_WIDTH=700;
    final int FRAME_HEIGHT=500;
    setSize(FRAME_WIDTH,FRAME_HEIGHT);
 //aggiungo gli intercettatori
 //intercettatore finestra
 WindowCloser listener= new WindowCloser();
 addWindowListener(listener);
 //intercettatore per pulsanti
 ActionListener  ascolta= new DirectionListener();
 //costruisco i componenti
  //  pannello a zone per il Lazio
 panel =new LazioPanel();
    //pannello per pulsanti
 JPanel buttonPanel = new JPanel();
 //creo i pulsanti e aggiungo lo stesso intercettatore a tutti i puls.
 LatinaButton = new JButton("Latina");
 LatinaButton.addActionListener(ascolta);
    RomaButton = new JButton("Roma");
    RomaButton.addActionListener(ascolta);
 FrosinoneButton = new JButton("Frosinone");
 FrosinoneButton.addActionListener(ascolta);
    RietiButton = new JButton("Rieti");
    RietiButton.addActionListener(ascolta);
 ViterboButton = new JButton("Viterbo");
 ViterboButton.addActionListener(ascolta);
 //costruisco riferimento a lastra contenuti
 Container contentPane= getContentPane();
 //aggiungo i 2 pannelli alla lastra dei contenuti
 contentPane.add(panel, "Center");
 contentPane.add(buttonPanel, "South");
 buttonPanel.add(LatinaButton);
 buttonPanel.add(RomaButton);
 buttonPanel.add(FrosinoneButton);
 buttonPanel.add(ViterboButton);
 buttonPanel.add(RietiButton);
  }
 private LazioPanel panel;
 private JButton LatinaButton;
 private JButton RomaButton;
 private JButton FrosinoneButton;
 private JButton RietiButton;
 private JButton ViterboButton;
// definizione classe interna
    private class DirectionListener implements ActionListener
 {public void actionPerformed(ActionEvent event)
    {//trovo  pulsante sul quale si è cliccato con il metodo getSource
     Object sorgente= event.getSource();
      }
                 }
 private class WindowCloser extends WindowAdapter
   {public void windowClosing(WindowEvent event)
    {System.exit(0); }
  }

  class LazioPanel extends JPanel




 { linea= console.readLine();


     }

     //copio tutti gli elementi da x a BigX
     System.arraycopy ( x,0,BigX, 0, x.length);
      x=BigX;  }
    if(ysize<y.length)
 {
    y[ysize]= Double.parseDouble(tokenizer.nextToken());
    ysize++;
     }
     else
     { double [] BigY = new double [3*y.length];
     //copio tutti gli elementi da y a BigY
     System.arraycopy ( y,0,BigY, 0, y.length);
     y=BigY;  }
  }  }
       }
/* ??? non possiamo applicare il metodo System Array Copy
 perchè non dobbiamo copiare array "identici" */
        int[] xdraw=new int[xsize];
        for(int i=0; i<xsize; i++)
        xdraw[i]=(int)Math.round(x[i]);
         int[] ydraw=new int[ysize];
        for (int j=0; j<ysize; j++)
        ydraw[j]=(int)Math.round(y[j]);
        Polygon Lazio= new Polygon(xdraw, ydraw,xsize) ;
        Rectangle2D box = Lazio.getBounds2D();
        double xMax= box.getMaxX();
        System.out.println("La x massima del box è"+" "+ xMax);
        double xMin= box.getMinX();
        System.out.println("La x minima  del box è"+" "+ xMin);
        double yMax= box.getMaxY();
        System.out.println("La y massima del box è"+" "+ yMax);
        double  yMin= box.getMinY();
        System.out.println("La y minima del box è"+" "+ yMin);
    double altezza = box.getHeight();
    double larghezza = box.getWidth();
    System.out.println( "l'altezza è "+ " " +altezza);
     System.out.println( "la larghezza è "+ " " +larghezza);
     AffineTransform p= g2.getTransform();
      AffineTransform a = new
AffineTransform(AffineTransform.getScaleInstance(0.0001, 0.0001));
     AffineTransform b = new
AffineTransform(AffineTransform.getTranslateInstance(-120000, -4300000));
    AffineTransform c = new
AffineTransform(AffineTransform.getScaleInstance(2, 2));
   AffineTransform d = new
AffineTransform(AffineTransform.getTranslateInstance(-2500, -1600000));
   AffineTransform e = new
AffineTransform(AffineTransform.getScaleInstance(10, 10));
   AffineTransform f = new
AffineTransform(AffineTransform.getTranslateInstance(-600000, -4350000));
         AffineTransform u = new
AffineTransform(AffineTransform.getScaleInstance(1, -1));
    AffineTransform w = new
AffineTransform(AffineTransform.getTranslateInstance(0, (-4747215*2)));
      //normalizzazione:  scalamento+traslazione
 a.concatenate(b);
 a.concatenate(c);
a.concatenate(d);
 a.concatenate(e);
  a.concatenate(f);
  a.concatenate(u);
   a.concatenate(w);
  g2.transform(a);
g2.setColor(Color.blue);
   g2.fill(Lazio);
  g2.draw(Lazio);
     } }

AffineTransform(AffineTransform.getScaleInstance(0.0001, 0.0001));
Da dove vengono i valori numerici?!!??
Per il tuo problema ti servono 5 trasformazioni "semplici"
(traslazioni, rotazioni, scalamenti), anzi 4 perché l'ultima è proprio
per fare i "fini". Però i "numeri" devi ricavarteli dai dati della
figura. Altrimenti se ti cambiano i dati cosa fai? Modifichi il
programma?
Tanto per rassicurarti: le critiche non sono solo per il gusto di
farle (ci perdo anche del tempo, sai?), ma vogliono essere di
incitamento.
Fatti sentire.
-- 
Ciao
	Fabrizio C.

 Fabrizio C.
Ciao.
Donato

 Fatti sentire.
Lo sò ma considera che questo  è l'unico esame di programmazione che abbiamo


sulla AffineTransform?
Avrei dovuto farlo subito. :-\
Se non ricordo male, qualcosa c'è su
Foley, Van Dam, etc. "Computer Graphics, Principles and Practice"
Addison-Wesley
che dovresti trovare facilmente in biblioteca.
A presto.
-- 
Ciao
	Fabrizio C.

equazioni ma nulla!
Parliamo delle trasformazioni che ti servono, ok?
Non ti mando il codice perché non mi sembra "educativo": in fondo,
l'esercizio lo dovete fare voi :-)
Però provo a mettere giù qualche riga.
Cerco di essere sintetico e mi riferisco al tuo caso, perciò niente
finezze teoriche, ok? (le dovresti trovare sul libro).
Dati disponibili:
- il tuo Polygon (o un'altra Shape)
- il tuo Panel
Informazioni da ottenere:
- la trasformazione da applicare alla Shape per visualizzarla nel
panel, o da impostare al Graphics del panel prima di disegnare.
Prendi un foglio di carta e disegna il tuo panel: un rettangolo non
troppo grande con un sistema di assi cartesiani con l'origine in alto
a sinistra e le ordinate crescenti verso il basso.
Ora traccia la tua figura (uno sghiribizzo qualunque) fuori dal panel.
Il problema è che ti ritrovi con una figura che è "molto grande" e
"molto lontana" dall'origine almeno rispetto alle dimensioni del
panel.
Se vuoi zoomarla, la prima cosa da fare è avvicinarla, perciò fai una
traslazione (T1) che porti la figura "a contatto" con gli assi.
Ora è ancora troppo grande, perciò la scali (T2) portandola alla
dimensione del panel: attenzione a non deformarla (scalamento uguale
sui due assi).
Ora hai la tua bella figura visibile dentro il Panel, ma... è
capovolta perché i tuoi dati hanno le ordinate crescenti verso l'alto.
Allora ribaltala (T3) attorno all'asse x.
Ora non è più visibile perché hai ordinate negative, però
"virtualmente" è girata giusta: traslala in basso (T4) quanto serve.
Facendo riferimento alle regole dei prodotti tra matrici, devi
combinare le 4 trasformazioni in modo che siano applicate nell'ordine.
XNuovo = T4 * T3 * T2 * T1 * XVecchio	dove X è vettore delle
coordinate
Cioè la trsformazione che la tua funzione restituisce deve essere
Tcompleta = T4 * T3 * T2 * T1
Fatti sentire.
PS
T5 servirebbe solo a centrare la figura nello spazio del panel ;-)
-- 
Ciao
	Fabrizio C.