Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - Satelliti con BufferedImage
Forum - Java - Satelliti con BufferedImage

Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
Allora.. ho un piccolo quesito da porvi come nuovo utente.. non so se potete darmi una mano..

allora.. io ho questo codice qui:

Codice sorgente - presumibilmente Java

  1. import java.util.*;
  2. import java.awt.*;
  3. import java.awt.event.*;
  4. import java.awt.geom.*;
  5. import javax.swing.*;
  6. import javax.swing.event.*;
  7.  
  8. public class SphereOrbit extends JPanel implements Runnable
  9. {
  10.         JFrame f;
  11.         Thread t = null;
  12.         ArrayList palle;
  13.         double angle = 0;
  14.        
  15.         public SphereOrbit()
  16.         {
  17.                 f = new JFrame();
  18.                 palle = new ArrayList();
  19.                 creaFinestra();
  20.                
  21.                 addMouseListener(new MouseAdapter()
  22.                 {
  23.                         public void mousePressed(MouseEvent e)
  24.                         {
  25.                                 palle.add(new OrbitElement(e.getX(), e.getY()));
  26.                         }
  27.                 });            
  28.                 avvia();
  29.         }
  30.        
  31.         public void creaFinestra()
  32.         {
  33.                 f.setSize(400, 400);
  34.                 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  35.                 f.getContentPane().add(this);
  36.                 f.setVisible(true);
  37.         }
  38.        
  39.         public void paint(Graphics _g)
  40.         {
  41.                 super.paintComponent(_g);
  42.                 Graphics2D g = (Graphics2D)_g;
  43.                 g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  44.                 disegnaPalle(g);
  45.         }
  46.        
  47.         public void disegnaPalle(Graphics2D g)
  48.         {
  49.                 setBackground(Color.BLACK);
  50.                 if (palle.size() > 0)
  51.                 {
  52.                         for (int i=0; i<palle.size(); i++)
  53.                         {
  54.                                 OrbitElement p = (OrbitElement)palle.get(i);
  55.                                 Ellipse2D pianeta = new Ellipse2D.Double(p.x-p.dimpianeta, p.y-p.dimpianeta, p.dimpianeta*2, p.dimpianeta*2);
  56.                                 g.setColor(p.pianeta);
  57.                                 g.fill(pianeta);
  58.                                 for (int W=0; W<p.numsatelliti; W++)
  59.                                 {
  60.                                         int x = (int)(Math.sin(Math.toRadians(angle*p.angle[W]*p.verso[W])) * p.ray[W]);
  61.                                         int y = (int)(Math.cos(Math.toRadians(angle*p.angle[W]*p.verso[W])) * p.ray[W]);
  62.                                         Ellipse2D satellite = new Ellipse2D.Double(p.x + x-p.dimsatellite[W]/2, p.y + y-p.dimsatellite[W]/2, p.dimsatellite[W], p.dimsatellite[W]);
  63.                                         g.setColor(p.satellite[W]);
  64.                                         g.fill(satellite);
  65.                                 }
  66.                         }
  67.                 }
  68.         }
  69.        
  70.         public void run()
  71.         {
  72.                 while( t != null)
  73.                 {
  74.                         try
  75.                         {
  76.                                 angle++;
  77.                                 t.sleep(10);
  78.                                 repaint();
  79.                         }
  80.                         catch (InterruptedException e) {}
  81.                 }
  82.         }
  83.        
  84.         public void avvia()
  85.         {
  86.                 if (t == null)
  87.                 {
  88.                         t = new Thread(this);
  89.                         t.start();
  90.                 }
  91.         }
  92.        
  93.         public static void main(String[] argv)
  94.         {
  95.                 SphereOrbit so = new SphereOrbit();
  96.         }
  97. }
  98.  
  99. class OrbitElement
  100. {
  101.         int numsatelliti = (int)(Math.random()*5)+1;
  102.         double dimpianeta;
  103.         double[] dimsatellite = new double[numsatelliti];
  104.         double[] ray = new double[numsatelliti];
  105.         double[] angle = new double[numsatelliti];
  106.         double[] verso = new double[numsatelliti];
  107.         int x, y;
  108.         Color pianeta;
  109.         Color[] satellite = new Color[numsatelliti];
  110.         public OrbitElement(int x, int y)
  111.         {
  112.                 this.x = x;
  113.                 this.y = y;
  114.                 dimpianeta = (Math.random() * 10) + 10;
  115.                 pianeta = new Color((int)(Math.random()*255) ,(int)(Math.random()*255) ,(int)(Math.random()*255));
  116.                 for (int i=0; i<numsatelliti; i++)
  117.                 {
  118.                         ray[i] = (Math.random() * 60) + dimpianeta;
  119.                         angle[i] = Math.random() * 2 + 1;
  120.                         verso[i] = 1;
  121.                         if (Math.random() > Math.random())
  122.                         {
  123.                                 verso[i]*=(-1);
  124.                         }
  125.                         //satellite[i] = new Color(255-pianeta.getGreen(), 255-pianeta.getBlue(), 255-pianeta.getRed());
  126.                         satellite[i] = new Color((int)(Math.random()*255), (int)(Math.random()*255), (int)(Math.random()*255));
  127.                         dimsatellite[i] = (Math.random() * 15) + 3;
  128.                 }
  129.         }
  130. }



senza che copiate e incolliate, vi dico sin da ora che al click del mouse viene creato una specie di pianeta con dei satelliti a distanza, dimensione, velocità di rotazione e verso casuali..
ora.. come potete notare, il programma è semplice, non utilizzo niente di particolarmente comlicato..
ma mi servirebbe di modificarne l'aspetto grafico finale, inserendo in una finestra che posso far apparire a scelta, un'anteprima di dimensioni ridotte di ciò che succede nella finestra dell'applicazione..

mi hanno detto che posso utilizzare la classe BufferedImage e le trasformazioni affini (AffineTransform) per applicare il ridimensionamento dell'elemento passato come BufferedImage..

se potete darmi una mano.. ve ne sarei grato..

io non ho idea di come fare (soprattutto xké nelle API della java-documentation non sono riuscito a trovare le funzioni che avrei potuto usare in nessuno dei due casi -AffineTransform e BufferedImage-).

bye.. W3B

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 20:59
Martedì, 10/07/2007
c'è un tip su ioProgrammo (numero 116) che ingrandisce un'immagine:

Codice sorgente - presumibilmente Java

  1. public static BufferedImage enlarge(BufferedImage image, int n) {
  2. int w = n * image.getWidth();
  3. int h = n * image.getHeight();
  4. BufferedImage enlargedImage = new BufferedImage(w, h, image.getType());
  5.  
  6. for(int y = 0; y < h; ++y)
  7.    for(int x = 0; x < w; ++x)
  8.       enlargedImage.setRGB(x, y, image.getRGB(x/n, y/n));
  9.  
  10. return enlargedImage;
  11. }



con qualche modifica si può fare il lavoro inverso.

Ultima modifica effettuata da netarrow il 10/07/2007 alle 21:03
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 10:31
Mercoledì, 11/07/2007
e credi sia adatto anche alle immagini in movimento come accade per il programma che ho postato su?
non so bene come funzionano le BufferedImage class... ma da come vedo nei vari programmi che si trovano sparsi in varie guide sulla rete.. è una classe che viene utilizzata per il disegno o per la trasformazione di immagini "fisse" o "statiche".. io ho dei satelliti orbitanti in continuo movimento.. non so se l'utilizzo in quel modo della BufferedImage sia adatto... da come leggo è soprattutto un'approssimazione pixel per pixel... e non una vera e propria operaizone di scalatura dell'immagine..
e pixel per pixel, con l'antialias attivo... ho il terrore che si possa scazzare notevolmente il programma...
cmq farò alcune prove.. ma ho serissimi dubbi che funzioni :-|

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 21:56
Mercoledì, 11/07/2007
invece di disegnare direttamente nel Graphics2D del pannello potresti lavorare in double buffering, quindi disegnare un in Image che farà appunto da buffer (farai quindi il getGraphics su questa immagine) e disegnerai li tutte le varie fasi, a questo punto per ogni iterazione travaresai il BufferedImage di quella immagine così come sta al pannello principale, e al pannello miniatura il BufferedImage modificato.

Ultima modifica effettuata da netarrow il 11/07/2007 alle 22:00
PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 23:52
Mercoledì, 11/07/2007
ho fatto alcune ricerche, usando AffineTransform devi usare questo:

Codice sorgente - presumibilmente Java

  1. af.translate(5, 5);
  2. af.scale(0.25, 0.25);
  3. g.setTransform(af);



ho provato ad aggiungerlo nel tuo codice (che non so perchè ma il forum lo fa diventare sbagliato togliendo gli indici di alcuni array) e funziona(vedo tutto ridotto).

Quindi basta che crei un secondo Graphics filtrato da un AffineTransform che riproduca l'immagine grande scalata di metà, di un quarto o come preferito, per aumentare si mette maggiore di 0.

Cmq credo sia possibile risolvere anche col BufferedImage, solo che c'è molto più lavoro da fare visto che si deve fare il lavoro sporco a mano lavorando sui pixel.

Ultima modifica effettuata da netarrow il 11/07/2007 alle 23:53
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 19:30
Giovedì, 12/07/2007
oggi, durante l'esame, ho risolto il problema...
esiste il pixelGrabber.. e mediante quello ho apportato le modifiche opportune... ora non ho tempo, ma appena posso ti spiego meglio cosa ho fatto..

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 18:02
Venerdì, 13/07/2007
si ho presente PixelGrabber, però mi sa che è cmq un lavoraccio lavorare a mano sui pixel.

Io ho risolto con AffineTransform, ho creato una seconda finestra più piccola chiamata Dettaglio che mostra tutto ciò che succede nella grande rimpicciolito in scala 1/4, la finestra piccola sfarfalla un pò ma con un doppio buffering si risolve:
(purtroppo il forum fa ancora bizze con gli indici, credo che lo confondano col BbCode, se metti dentro eclipse ti risole tutto da solo)

Dettaglio.java
Codice sorgente - presumibilmente Java

  1. import java.awt.Canvas;
  2. import java.awt.Color;
  3. import java.awt.Graphics;
  4. import java.awt.Graphics2D;
  5. import java.awt.Image;
  6. import java.awt.RenderingHints;
  7. import java.awt.geom.AffineTransform;
  8. import java.awt.geom.Ellipse2D;
  9. import java.util.ArrayList;
  10.  
  11. import javax.swing.JFrame;
  12.  
  13. class Lavagna extends Canvas {
  14.         ArrayList palle;
  15.         AffineTransform af = new AffineTransform();
  16.         public double angle;
  17.        
  18.         Lavagna() {
  19.                 super();
  20.                 this.angle = angle;
  21.                 af.scale(0.25, 0.25);
  22.                 palle = Dettaglio.palle;
  23.         }
  24.        
  25.         public void paint(Graphics g) {
  26.                 Graphics2D g2d = (Graphics2D) g;
  27.                 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  28.                 g2d.setTransform(af);
  29.                 disegnaPalle(g2d);
  30.         }
  31.        
  32.         public void disegnaPalle(Graphics2D g)
  33.         {
  34.         setBackground(Color.BLACK);
  35.         if (palle.size() > 0)
  36.         {
  37.         for (int i=0; i<palle.size(); i++)
  38.         {
  39.         OrbitElement p = (OrbitElement)palle.get(i);
  40.         Ellipse2D pianeta = new Ellipse2D.Double(p.x-p.dimpianeta, p.y-p.dimpianeta, p.dimpianeta*2, p.dimpianeta*2);
  41.         g.setColor(p.pianeta);
  42.         g.fill(pianeta);
  43.         for (int W=0; W<p.numsatelliti; W++)
  44.         {
  45.         int x = (int)(Math.sin(Math.toRadians(angle*p.angle[W]*p.verso[W])) * p.ray[W]);
  46.         int y = (int)(Math.cos(Math.toRadians(angle*p.angle[W]*p.verso[W])) * p.ray[W]);
  47.         Ellipse2D satellite = new Ellipse2D.Double(p.x + x-p.dimsatellite[W]/2, p.y + y-p.dimsatellite[W]/2, p.dimsatellite[W], p.dimsatellite[W]);
  48.         g.setColor(p.satellite[W]);
  49.         g.fill(satellite);
  50.         }
  51.         }
  52.         }
  53.         }
  54.        
  55. }
  56.  
  57. public class Dettaglio extends JFrame {
  58.         public Lavagna lavagna;
  59.         static ArrayList palle;
  60.        
  61.         Dettaglio(ArrayList palle) {
  62.                 super();
  63.                 setVisible(true);
  64.                 setSize(200, 200);
  65.                 Dettaglio.palle = palle;
  66.                 lavagna = new Lavagna();
  67.                 this.getContentPane().add(lavagna);
  68.         }
  69.        
  70. }



SphereOrbit.java
Codice sorgente - presumibilmente Java

  1. import java.awt.Color;
  2. import java.awt.Graphics;
  3. import java.awt.Graphics2D;
  4. import java.awt.RenderingHints;
  5. import java.awt.event.MouseAdapter;
  6. import java.awt.event.MouseEvent;
  7. import java.awt.geom.Ellipse2D;
  8. import java.util.ArrayList;
  9.  
  10. import javax.swing.JFrame;
  11. import javax.swing.JPanel;
  12.  
  13.  
  14.  
  15. public class SphereOrbit extends JPanel implements Runnable
  16. {
  17. Thread t = null;
  18. ArrayList palle;
  19. Dettaglio d;
  20. double angle = 0.0;
  21.  
  22. public SphereOrbit()
  23. {
  24. f = new JFrame();
  25. palle = new ArrayList();
  26. d = new Dettaglio(palle);
  27. creaFinestra();
  28.  
  29. addMouseListener(new MouseAdapter()
  30. {
  31. public void mousePressed(MouseEvent e)
  32. {
  33. palle.add(new OrbitElement(e.getX(), e.getY()));
  34. }
  35. });
  36. avvia();
  37. }
  38.  
  39. public void creaFinestra()
  40. {
  41. f.setSize(400, 400);
  42. f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  43. f.getContentPane().add(this);
  44. f.setVisible(true);
  45. }
  46.  
  47. public void paint(Graphics _g)
  48. {
  49. super.paintComponent(_g);
  50. g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  51. disegnaPalle(g);
  52. }
  53.  
  54. public void disegnaPalle(Graphics2D g)
  55. {
  56. setBackground(Color.BLACK);
  57. if (palle.size() > 0)
  58. {
  59. for (int i=0; i<palle.size(); i++)
  60. {
  61. OrbitElement p = (OrbitElement)palle.get(i);
  62. Ellipse2D pianeta = new Ellipse2D.Double(p.x-p.dimpianeta, p.y-p.dimpianeta, p.dimpianeta*2, p.dimpianeta*2);
  63. g.setColor(p.pianeta);
  64. g.fill(pianeta);
  65. for (int W=0; W<p.numsatelliti; W++)
  66. {
  67. int x = (int)(Math.sin(Math.toRadians(angle*p.angle[W]*p.verso[W])) * p.ray[W]);
  68. int y = (int)(Math.cos(Math.toRadians(angle*p.angle[W]*p.verso[W])) * p.ray[W]);
  69. Ellipse2D satellite = new Ellipse2D.Double(p.x + x-p.dimsatellite[W]/2, p.y + y-p.dimsatellite[W]/2, p.dimsatellite[W], p.dimsatellite[W]);
  70. g.setColor(p.satellite[W]);
  71. g.fill(satellite);
  72. }
  73. }
  74. }
  75. }
  76.  
  77. public void run()
  78. {
  79. while( t != null)
  80. {
  81. try
  82. {
  83. angle++;
  84. d.lavagna.angle++;
  85. t.sleep(10);
  86. repaint();
  87. d.lavagna.repaint();
  88. }
  89. }
  90. }
  91.  
  92. public void avvia()
  93. {
  94. if (t == null)
  95. {
  96. t = new Thread(this);
  97. t.start();
  98. }
  99. }
  100.  
  101. public static void main(String[] argv)
  102. {
  103. SphereOrbit so = new SphereOrbit();
  104. }
  105. }
  106.  
  107. class OrbitElement
  108. {
  109. int numsatelliti = (int)(Math.random()*5)+1;
  110. double dimpianeta;
  111. double[] dimsatellite = new double[numsatelliti];
  112. double[] ray = new double[numsatelliti];
  113. double[] angle = new double[numsatelliti];
  114. double[] verso = new double[numsatelliti];
  115. int x, y;
  116. Color pianeta;
  117. Color[] satellite = new Color[numsatelliti];
  118. public OrbitElement(int x, int y)
  119. {
  120. this.x = x;
  121. this.y = y;
  122. dimpianeta = (Math.random() * 10) + 10;
  123. pianeta = new Color((int)(Math.random()*255) ,(int)(Math.random()*255) ,(int)(Math.random()*255));
  124. for (int i=0; i<numsatelliti; i++)
  125. {
  126. ray[i] = (Math.random() * 60) + dimpianeta;
  127. angle[i] = Math.random() * 2 + 1;
  128. verso[i] = 1;
  129. if (Math.random() > Math.random())
  130. {
  131. verso[i]*=(-1);
  132. }
  133. //satellite = new Color(255-pianeta.getGreen(), 255-pianeta.getBlue(), 255-pianeta.getRed());
  134. satellite[i] = new Color((int)(Math.random()*255), (int)(Math.random()*255), (int)(Math.random()*255));
  135. dimsatellite[i] = (Math.random() * 15) + 3;
  136. }
  137. }
  138. }



casomai dopo ti posto un'immagine di come viene, ora devo scappare a scula guida.

Ultima modifica effettuata da netarrow il 13/07/2007 alle 18:04
PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 19:52
Venerdì, 13/07/2007
ah, ho sbagliato nome alla classe Dettaglio, non è appropriato visto che allontanta, vabbè cambia niente.

Cmq, senza che copi e incolli e correggi ecco cosa ottengo:

http://www.pierotofy.it/pages/recensioni/Software/SphereOr ...


PM Quote