/*
Ho ripreso il programma salvaschermo spedito tempo fa cercando di usare classi e metodi.
Se volete dare un'occhiata, i consigli sono sempre ben accetti.
Sto sempre alle prime armi e molto di quello che è la struttura principale del programma l'ho copiato e per essere sincero il suo funzionamento rimane per me ancora un mistero.
Se devo far interagire diversi oggetti dello stesso tipo conviene creare un metodo nella classe principale? ( Es:. Public boolean Collisione(Oggetto Oggetto1, Oggetto oggetto2){}) oppure un thread?
*/
//package provajava;
/**
* prova figure dentro l'immagine del desktop
* @author (Paolo P.)
* @version (1.1.2016)
*/
import java.awt.*;
import java.awt.Robot;
import javax.swing.*;
class FiguraNelloSpazio{
public int nPunti;
public double raggio;
public double velocitaBaricentroX;
public double velocitaBaricentroY;
public double velocitaBaricentroZ;
public double velocitaBaricentroModulo;
public double[][] punti=new double[15][3];
public double momentoRotazioneSolidoX;
public double momentoRotazioneSolidoY;
public double momentoRotazioneSolidoZ;
public double momentoRotazioneModulo;
public void ScalaPunti(double fattoreDiScala){
for(int i=1;i<this.nPunti+1;i++){
this.punti[0]=this.punti[0]*fattoreDiScala;
this.punti[1]=this.punti[1]*fattoreDiScala;
this.punti[2]=this.punti[2]*fattoreDiScala;
}
this.raggio=this.raggio*fattoreDiScala;
}
public void CalcolaRaggio(){
this.raggio=0;
for(int i=1;i<this.nPunti+1;i++){
if(this.raggio<Math.sqrt((this.punti[0][0]-this.punti[0])*(this.punti[0][0]-this.punti[0])+(this.punti[0][1]-this.punti[1])*(this.punti[0][1]-this.punti[1])+(this.punti[0][2]-this.punti[i][2])*(this.punti[0][2]-this.punti[i][2]))){
this.raggio=Math.sqrt((this.punti[0][0]-this.punti[i][0])*(this.punti[0][0]-this.punti[i][0])+(this.punti[0][1]-this.punti[i][1])*(this.punti[0][1]-this.punti[i][1])+(this.punti[0][2]-this.punti[i][2])*(this.punti[0][2]-this.punti[i][2]));
}
}
}
public void CalcolaBaricentro(){
this.punti[0][0]=0;
this.punti[0][1]=0;
this.punti[0][2]=0;
for(int i=1;i<this.nPunti+1;i++){
this.punti[0][0]=this.punti[0][0]+this.punti[i][0]/(this.nPunti);
this.punti[0][1]=this.punti[0][1]+this.punti[i][1]/(this.nPunti);
this.punti[0][2]=this.punti[0][2]+this.punti[i][2]/(this.nPunti);
}
}
public void aggiornaPosizione(){
for(int i=0;i<this.nPunti+1;i++)
{
this.punti[i][0]=this.punti[i][0]+this.velocitaBaricentroX*this.velocitaBaricentroModulo+((this.punti[0][1]-this.punti[i][1])*this.momentoRotazioneSolidoZ-(this.punti[0][2]-this.punti[i][2])*this.momentoRotazioneSolidoY)*this.momentoRotazioneModulo;
this.punti[i][1]=this.punti[i][1]+this.velocitaBaricentroY*this.velocitaBaricentroModulo+((this.punti[0][2]-this.punti[i][2])*this.momentoRotazioneSolidoX-(this.punti[0][0]-this.punti[i][0])*this.momentoRotazioneSolidoZ)*this.momentoRotazioneModulo;
this.punti[i][2]=this.punti[i][2]+this.velocitaBaricentroZ*this.velocitaBaricentroModulo+((this.punti[0][0]-this.punti[i][0])*this.momentoRotazioneSolidoY-(this.punti[0][1]-this.punti[i][1])*this.momentoRotazioneSolidoX)*this.momentoRotazioneModulo;
}
}
public void rimbalzoAiBordi(int maxx,int maxy,int maxz){
if(((this.punti[0][0]>maxx-this.raggio)&&(this.velocitaBaricentroX>0))||((this.punti[0][0]<this.raggio)&&(this.velocitaBaricentroX<0)))
{
this.velocitaBaricentroX=-this.velocitaBaricentroX;
this.momentoRotazioneSolidoX=-this.momentoRotazioneSolidoX;
this.momentoRotazioneSolidoY=-this.momentoRotazioneSolidoY;
this.momentoRotazioneSolidoZ=-this.momentoRotazioneSolidoZ;
}
if(((this.punti[0][1]>maxy-this.raggio)&&(velocitaBaricentroY>0))||((this.punti[0][1]<this.raggio)&&(this.velocitaBaricentroY<0)))
{
this.velocitaBaricentroY=-this.velocitaBaricentroY;
this.momentoRotazioneSolidoX=-this.momentoRotazioneSolidoX;
this.momentoRotazioneSolidoY=-this.momentoRotazioneSolidoY;
this.momentoRotazioneSolidoZ=-this.momentoRotazioneSolidoZ;
}
if(((this.punti[0][2]>maxz-this.raggio)&&(velocitaBaricentroZ>0))||((this.punti[0][2]<this.raggio)&&(this.velocitaBaricentroZ<0)))
{
this.velocitaBaricentroZ=-this.velocitaBaricentroZ;
this.momentoRotazioneSolidoX=-this.momentoRotazioneSolidoX;
this.momentoRotazioneSolidoY=-this.momentoRotazioneSolidoY;
this.momentoRotazioneSolidoZ=-this.momentoRotazioneSolidoZ;
}
}
}
class FiguraPianaNelloSpazio extends FiguraNelloSpazio{
public Color coloreSpigoli;
public int nPoligoni;
public int nPuntiPoligono;
public int[] ordinaPoligoni =new int[24];
public double[] ordinaDistanze =new double[24];
public Color[] colorePoligono=new Color[24];
public int[][] poligono=new int[24][4];
public double[][] baricentroPoligono = new double[24][3];
public void CalcolaBaricentroPoligono(){
for(int i=0;i<this.nPoligoni;i++){
this.baricentroPoligono[i][0]=0;
this.baricentroPoligono[i][1]=0;
this.baricentroPoligono[i][2]=0;
for(int k=0;k<this.nPuntiPoligono;k++){
this.baricentroPoligono[i][0]=this.baricentroPoligono[i][0]+this.punti[this.poligono[i][k]][0]/this.nPuntiPoligono;
this.baricentroPoligono[i][1]=this.baricentroPoligono[i][1]+this.punti[this.poligono[i][k]][1]/this.nPuntiPoligono;
this.baricentroPoligono[i][2]=this.baricentroPoligono[i][2]+this.punti[this.poligono[i][k]][2]/this.nPuntiPoligono;
}
}
}
public double CalcolaDistanza(double x1,double y1,double z1,double x2,double y2,double z2){
return Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2));
}
// Ordino i le facce del solido a seconda della distanza dei baricentri dei poligoni dall'osservatore
public void OrdinaPoligono(double puntoOsservazioneX,double puntoOsservazioneY,double puntoOsservazioneZ){
int x;
double y;
for(int i=0;i<this.nPoligoni;i++) {
this.ordinaDistanze[i]=CalcolaDistanza(this.baricentroPoligono[i][0], this.baricentroPoligono[i][1],this.baricentroPoligono[i][2], puntoOsservazioneX, puntoOsservazioneY, puntoOsservazioneZ);
this.ordinaPoligoni[i]=i;
}
for(int i=0;i<this.nPoligoni-1;i++) for(int j=i+1;j<this.nPoligoni;j++) if(this.ordinaDistanze[i]<this.ordinaDistanze[j]){
y=this.ordinaDistanze[i];
this.ordinaDistanze[i]=this.ordinaDistanze[j];
this.ordinaDistanze[j]=y;
x=this.ordinaPoligoni[i];
this.ordinaPoligoni[i]=this.ordinaPoligoni[j];
this.ordinaPoligoni[j]=x;
}
}
}
class FiguraSolidaNelloSpazio extends FiguraPianaNelloSpazio{
public int nTetraedri;
public int[][] tetraedro =new int[5][4];
}
/** Rimbalzo Lastre(Animation) via custom thread */
@SuppressWarnings("serial")
class ProvaJava extends JFrame {
final int SFERA=0;
final int TETRAEDRO=1;
final int CUBO=2;
final int FIGURADIPROVA=3;
final int NUMEROTIPISOLIDO=4;
protected static Image img;
public int maxx=1000;
public int maxy=500;
public int maxz=500;
public int colorePoligonoR;
public int colorePoligonoG;
public int colorePoligonoB;
final double puntoOsservazioneX=maxx/2;
final double puntoOsservazioneY=maxy/2;
final double puntoOsservazioneZ=10000;
public final int[] numeroOggetti={12,10,7,3};
public FiguraSolidaNelloSpazio[][] solido=new FiguraSolidaNelloSpazio[4][20];
/** Constructor to setup the GUI components */
/*public void RimbalzoTraDueSolidi(int tipoSolido1,int i,int tipoSolido2,int k){
}
public boolean VerificaCondizioneRimbalzo(int tipoSolido1,int i,int tipoSolido2,int k){
return false;
}
public void rimbalzoTraSolidi(){
if(this.VerificaCondizioneRimbalzo(SFERA,0,SFERA,1)) RimbalzoTraDueSolidi(SFERA,0,SFERA,1);
}*/
ProvaJava() {
// Define named-constants
final int LARGHEZZA = 1440;
final int ALTEZZA = 900;
final int INTERVALLO = 50; // milliseconds
final Disegna disegna; // the drawing canvas (extends JPanel)
// Inizializza sfere
for(int i=0;i<numeroOggetti[0];i++){
solido[SFERA][i]=new FiguraSolidaNelloSpazio();
solido[SFERA][i].nPunti=0;
solido[SFERA][i].nPuntiPoligono=0;
solido[SFERA][i].nPoligoni=0;
solido[SFERA][i].punti[0][0]=30;
solido[SFERA][i].punti[0][1]=30;
solido[SFERA][i].punti[0][2]=30;
solido[SFERA][i].raggio=30;
solido[SFERA][i].velocitaBaricentroX=Math.random()*1200/1000.001-0.6;
solido[SFERA][i].velocitaBaricentroY=Math.random()*1200/1000.001-0.6;
solido[SFERA][i].velocitaBaricentroZ=Math.sqrt(1-solido[SFERA][i].velocitaBaricentroX*solido[SFERA][i].velocitaBaricentroX-solido[SFERA][i].velocitaBaricentroY*solido[SFERA][i].velocitaBaricentroY);
solido[SFERA][i].velocitaBaricentroModulo=(Math.random()*100+30.01)/60.001;
solido[SFERA][i].ScalaPunti(Math.random()*1.5+0.2);
// Imposto il colore della sfera usando "coloreSpigoli"
solido[SFERA][i].coloreSpigoli=new Color((int)(Math.random()*256),(int)(Math.random()*256),(int)(Math.random()*256));
}
// Inizializza tetraedri
for(int j=0;j<numeroOggetti[1];j++){
solido[TETRAEDRO][j]=new FiguraSolidaNelloSpazio();
solido[TETRAEDRO][j].nPunti=4;
solido[TETRAEDRO][j].nPoligoni=4;
solido[TETRAEDRO][j].nPuntiPoligono=3;
solido[TETRAEDRO][j].punti[1][0]=30;
solido[TETRAEDRO][j].punti[1][1]=0;
solido[TETRAEDRO][j].punti[1][2]=0;
solido[TETRAEDRO][j].punti[2][0]=0;
solido[TETRAEDRO][j].punti[2][1]=0;
solido[TETRAEDRO][j].punti[2][2]=30;
solido[TETRAEDRO][j].punti[3][0]=0;
solido[TETRAEDRO][j].punti[3][1]=30;
solido[TETRAEDRO][j].punti[3][2]=0;
solido[TETRAEDRO][j].punti[4][0]=-15;
solido[TETRAEDRO][j].punti[4][1]=-15;
solido[TETRAEDRO][j].punti[4][2]=-15;
solido[TETRAEDRO][j].ScalaPunti(Math.random()*2.0+0.4);
solido[TETRAEDRO][j].CalcolaBaricentro();
solido[TETRAEDRO][j].CalcolaRaggio();
solido[TETRAEDRO][j].CalcolaBaricentroPoligono();
solido[TETRAEDRO][j].velocitaBaricentroX=Math.random()*1200/1000.001-0.6;
solido[TETRAEDRO][j].velocitaBaricentroY=Math.random()*1200/1000.001-0.6;
solido[TETRAEDRO][j].velocitaBaricentroZ=Math.sqrt(1-solido[TETRAEDRO][j].velocitaBaricentroX*solido[TETRAEDRO][j].velocitaBaricentroX-solido[TETRAEDRO][j].velocitaBaricentroY*solido[TETRAEDRO][j].velocitaBaricentroY);
solido[TETRAEDRO][j].velocitaBaricentroModulo=(Math.random()*100+30.01)/60.001;
solido[TETRAEDRO][j].momentoRotazioneSolidoX=Math.random()*1200/1000.001-0.6;
solido[TETRAEDRO][j].momentoRotazioneSolidoY=Math.random()*1200/1000.001-0.6;
solido[TETRAEDRO][j].momentoRotazioneSolidoZ=Math.sqrt(1-solido[TETRAEDRO][j].momentoRotazioneSolidoX*solido[TETRAEDRO][j].momentoRotazioneSolidoX-solido[TETRAEDRO][j].momentoRotazioneSolidoY*solido[TETRAEDRO][j].momentoRotazioneSolidoY);
solido[TETRAEDRO][j].momentoRotazioneModulo=(Math.random()*100+30.01)/2000.001;
// Inizializza le facce del tetraedro
solido[TETRAEDRO][j].poligono[0][0]=1;
solido[TETRAEDRO][j].poligono[0][1]=2;
solido[TETRAEDRO][j].poligono[0][2]=3;
solido[TETRAEDRO][j].poligono[1][0]=1;
solido[TETRAEDRO][j].poligono[1][1]=4;
solido[TETRAEDRO][j].poligono[1][2]=3;
solido[TETRAEDRO][j].poligono[2][0]=1;
solido[TETRAEDRO][j].poligono[2][1]=2;
solido[TETRAEDRO][j].poligono[2][2]=4;
solido[TETRAEDRO][j].poligono[3][0]=2;
solido[TETRAEDRO][j].poligono[3][1]=4;
solido[TETRAEDRO][j].poligono[3][2]=3;
// Definizione dei colori delle facce e degli spigoli
for(int i=0;i<4;i++){
solido[TETRAEDRO][j].colorePoligono[i]=new Color((int)(Math.random()*256),(int)(Math.random()*256),(int)(Math.random()*256));
}
solido[TETRAEDRO][j].coloreSpigoli=new Color((int)(Math.random()*256),(int)(Math.random()*256),(int)(Math.random()*256));
}
// Inizializza cubi
for(int i=0;i<numeroOggetti[2];i++){
solido[CUBO][i]=new FiguraSolidaNelloSpazio();
solido[CUBO][i].nPunti=8;
solido[CUBO][i].nPoligoni=6;
solido[CUBO][i].nPuntiPoligono=4;
solido[CUBO][i].punti[1][0]=0;
solido[CUBO][i].punti[1][1]=0;
solido[CUBO][i].punti[1][2]=0;
solido[CUBO][i].punti[2][0]=30;
solido[CUBO][i].punti[2][1]=0;
solido[CUBO][i].punti[2][2]=0;
solido[CUBO][i].punti[3][0]=30;
solido[CUBO][i].punti[3][1]=30;
solido[CUBO][i].punti[3][2]=0;
solido[CUBO][i].punti[4][0]=0;
solido[CUBO][i].punti[4][1]=30;
solido[CUBO][i].punti[4][2]=0;
solido[CUBO][i].punti[5][0]=0;
solido[CUBO][i].punti[5][1]=0;
solido[CUBO][i].punti[5][2]=30;
solido[CUBO][i].punti[6][0]=30;
solido[CUBO][i].punti[6][1]=0;
solido[CUBO][i].punti[6][2]=30;
solido[CUBO][i].punti[7][0]=30;
solido[CUBO][i].punti[7][1]=30;
solido[CUBO][i].punti[7][2]=30;
solido[CUBO][i].punti[8][0]=0;
solido[CUBO][i].punti[8][1]=30;
solido[CUBO][i].punti[8][2]=30;
solido[CUBO][i].ScalaPunti(Math.random()*2.0+0.4);
solido[CUBO][i].CalcolaBaricentro();
solido[CUBO][i].CalcolaRaggio();
solido[CUBO][i].CalcolaBaricentroPoligono();
solido[CUBO][i].velocitaBaricentroX=Math.random()*1200/1000.001-0.6;
solido[CUBO][i].velocitaBaricentroY=Math.random()*1200/1000.001-0.6;
solido[CUBO][i].velocitaBaricentroZ=Math.sqrt(1-solido[CUBO][i].velocitaBaricentroX*solido[CUBO][i].velocitaBaricentroX-solido[CUBO][i].velocitaBaricentroY*solido[CUBO][i].velocitaBaricentroY);
solido[CUBO][i].velocitaBaricentroModulo=(Math.random()*100+30.01)/60.001;
solido[CUBO][i].momentoRotazioneSolidoX=Math.random()*1200/1000.001-0.6;
solido[CUBO][i].momentoRotazioneSolidoY=Math.random()*1200/1000.001-0.6;
solido[CUBO][i].momentoRotazioneSolidoZ=Math.sqrt(1-solido[CUBO][i].momentoRotazioneSolidoX*solido[CUBO][i].momentoRotazioneSolidoX-solido[CUBO][i].momentoRotazioneSolidoY*solido[CUBO][i].momentoRotazioneSolidoY);
solido[CUBO][i].momentoRotazioneModulo=(Math.random()*100+30.01)/2000.001;
// Inizializza le facce del cubo
solido[CUBO][i].poligono[0][0]=1;
solido[CUBO][i].poligono[0][1]=2;
solido[CUBO][i].poligono[0][2]=3;
solido[CUBO][i].poligono[0][3]=4;
solido[CUBO][i].poligono[1][0]=5;
solido[CUBO][i].poligono[1][1]=6;
solido[CUBO][i].poligono[1][2]=7;
solido[CUBO][i].poligono[1][3]=8;
solido[CUBO][i].poligono[2][0]=1;
solido[CUBO][i].poligono[2][1]=2;
solido[CUBO][i].poligono[2][2]=6;
solido[CUBO][i].poligono[2][3]=5;
solido[CUBO][i].poligono[3][0]=2;
solido[CUBO][i].poligono[3][1]=3;
solido[CUBO][i].poligono[3][2]=7;
solido[CUBO][i].poligono[3][3]=6;
solido[CUBO][i].poligono[4][0]=3;
solido[CUBO][i].poligono[4][1]=4;
solido[CUBO][i].poligono[4][2]=8;
solido[CUBO][i].poligono[4][3]=7;
solido[CUBO][i].poligono[5][0]=1;
solido[CUBO][i].poligono[5][1]=4;
solido[CUBO][i].poligono[5][2]=8;
solido[CUBO][i].poligono[5][3]=5;
// Definizione dei colori delle facce e degli spigoli
colorePoligonoR=(int)(Math.random()*200);
colorePoligonoG=(int)(Math.random()*200);
colorePoligonoB=(int)(Math.random()*200);
for(int j=0;j<6;j++){
solido[CUBO][i].colorePoligono[j]=new Color(colorePoligonoR+(int)(Math.random()*56),colorePoligonoG+(int)(Math.random()*56),colorePoligonoB+(int)(Math.random()*56));
}
solido[CUBO][i].coloreSpigoli=new Color((int)(Math.random()*256),(int)(Math.random()*256),(int)(Math.random()*256));
}
// Inizializza FIGURADIPROVA
for(int i=0;i<numeroOggetti[3];i++){
solido[FIGURADIPROVA][i]=new FiguraSolidaNelloSpazio();
solido[FIGURADIPROVA][i].nPunti=14;
solido[FIGURADIPROVA][i].nPoligoni=24;
solido[FIGURADIPROVA][i].nPuntiPoligono=3;
solido[FIGURADIPROVA][i].punti[1][0]=-30.0/Math.sqrt(3);
solido[FIGURADIPROVA][i].punti[1][1]=-30.0/Math.sqrt(3);
solido[FIGURADIPROVA][i].punti[1][2]=-30.0/Math.sqrt(3);
solido[FIGURADIPROVA][i].punti[2][0]=-30.0/Math.sqrt(3);
solido[FIGURADIPROVA][i].punti[2][1]=-30.0/Math.sqrt(3);
solido[FIGURADIPROVA][i].punti[2][2]=30.0/Math.sqrt(3);
solido[FIGURADIPROVA][i].punti[3][0]=-30.0/Math.sqrt(3);
solido[FIGURADIPROVA][i].punti[3][1]=30.0/Math.sqrt(3);
solido[FIGURADIPROVA][i].punti[3][2]=-30.0/Math.sqrt(3);
solido[FIGURADIPROVA][i].punti[4][0]=-30.0/Math.sqrt(3);
solido[FIGURADIPROVA][i].punti[4][1]=30.0/Math.sqrt(3);
solido[FIGURADIPROVA][i].punti[4][2]=30.0/Math.sqrt(3);
solido[FIGURADIPROVA][i].punti[5][0]=30.0/Math.sqrt(3);
solido[FIGURADIPROVA][i].punti[5][1]=-30.0/Math.sqrt(3);
solido[FIGURADIPROVA][i].punti[5][2]=-30.0/Math.sqrt(3);
solido[FIGURADIPROVA][i].punti[6][0]=30.0/Math.sqrt(3);
solido[FIGURADIPROVA][i].punti[6][1]=-30.0/Math.sqrt(3);
solido[FIGURADIPROVA][i].punti[6][2]=30.0/Math.sqrt(3);
solido[FIGURADIPROVA][i].punti[7][0]=30.0/Math.sqrt(3);
solido[FIGURADIPROVA][i].punti[7][1]=30.0/Math.sqrt(3);
solido[FIGURADIPROVA][i].punti[7][2]=-30.0/Math.sqrt(3);
solido[FIGURADIPROVA][i].punti[8][0]=30.0/Math.sqrt(3);
solido[FIGURADIPROVA][i].punti[8][1]=30.0/Math.sqrt(3);
solido[FIGURADIPROVA][i].punti[8][2]=30.0/Math.sqrt(3);
solido[FIGURADIPROVA][i].punti[9][0]=30.0;
solido[FIGURADIPROVA][i].punti[9][1]=0;
solido[FIGURADIPROVA][i].punti[9][2]=0;
solido[FIGURADIPROVA][i].punti[10][0]=0;
solido[FIGURADIPROVA][i].punti[10][1]=30.0;
solido[FIGURADIPROVA][i].punti[10][2]=0;
solido[FIGURADIPROVA][i].punti[11][0]=0;
solido[FIGURADIPROVA][i].punti[11][1]=0;
solido[FIGURADIPROVA][i].punti[11][2]=30.0;
solido[FIGURADIPROVA][i].punti[12][0]=-30.0;
solido[FIGURADIPROVA][i].punti[12][1]=0;
solido[FIGURADIPROVA][i].punti[12][2]=0;
solido[FIGURADIPROVA][i].punti[13][0]=0;
solido[FIGURADIPROVA][i].punti[13][1]=-30.0;
solido[FIGURADIPROVA][i].punti[13][2]=0;
solido[FIGURADIPROVA][i].punti[14][0]=0;
solido[FIGURADIPROVA][i].punti[14][1]=0;
solido[FIGURADIPROVA][i].punti[14][2]=-30.0;
solido[FIGURADIPROVA][i].ScalaPunti(Math.random()*2.0+0.;
solido[FIGURADIPROVA][i].CalcolaBaricentro();
solido[FIGURADIPROVA][i].CalcolaRaggio();
solido[FIGURADIPROVA][i].CalcolaBaricentroPoligono();
solido[FIGURADIPROVA][i].velocitaBaricentroX=Math.random()*1200/1000.001-0.6;
solido[FIGURADIPROVA][i].velocitaBaricentroY=Math.random()*1200/1000.001-0.6;
solido[FIGURADIPROVA][i].velocitaBaricentroZ=Math.sqrt(1-solido[CUBO][i].velocitaBaricentroX*solido[CUBO][i].velocitaBaricentroX-solido[CUBO][i].velocitaBaricentroY*solido[CUBO][i].velocitaBaricentroY);
solido[FIGURADIPROVA][i].velocitaBaricentroModulo=(Math.random()*100+30.01)/60.001;
solido[FIGURADIPROVA][i].momentoRotazioneSolidoX=Math.random()*1200/1000.001-0.6;
solido[FIGURADIPROVA][i].momentoRotazioneSolidoY=Math.random()*1200/1000.001-0.6;
solido[FIGURADIPROVA][i].momentoRotazioneSolidoZ=Math.sqrt(1-solido[CUBO][i].momentoRotazioneSolidoX*solido[CUBO][i].momentoRotazioneSolidoX-solido[CUBO][i].momentoRotazioneSolidoY*solido[CUBO][i].momentoRotazioneSolidoY);
solido[FIGURADIPROVA][i].momentoRotazioneModulo=(Math.random()*100+30.01)/2000.001;
// Inizializza poligoni
solido[FIGURADIPROVA][i].poligono[0][0]=1;
solido[FIGURADIPROVA][i].poligono[0][1]=12;
solido[FIGURADIPROVA][i].poligono[0][2]=13;
solido[FIGURADIPROVA][i].poligono[1][0]=1;
solido[FIGURADIPROVA][i].poligono[1][1]=14;
solido[FIGURADIPROVA][i].poligono[1][2]=13;
solido[FIGURADIPROVA][i].poligono[2][0]=1;
solido[FIGURADIPROVA][i].poligono[2][1]=12;
solido[FIGURADIPROVA][i].poligono[2][2]=14;
solido[FIGURADIPROVA][i].poligono[3][0]=2;
solido[FIGURADIPROVA][i].poligono[3][1]=12;
solido[FIGURADIPROVA][i].poligono[3][2]=13;
solido[FIGURADIPROVA][i].poligono[4][0]=2;
solido[FIGURADIPROVA][i].poligono[4][1]=12;
solido[FIGURADIPROVA][i].poligono[4][2]=11;
solido[FIGURADIPROVA][i].poligono[5][0]=2;
solido[FIGURADIPROVA][i].poligono[5][1]=11;
solido[FIGURADIPROVA][i].poligono[5][2]=13;
solido[FIGURADIPROVA][i].poligono[6][0]=3;
solido[FIGURADIPROVA][i].poligono[6][1]=10;
solido[FIGURADIPROVA][i].poligono[6][2]=12;
solido[FIGURADIPROVA][i].poligono[7][0]=3;
solido[FIGURADIPROVA][i].poligono[7][1]=10;
solido[FIGURADIPROVA][i].poligono[7][2]=14;
solido[FIGURADIPROVA][i].poligono[8][0]=3;
solido[FIGURADIPROVA][i].poligono[8][1]=12;
solido[FIGURADIPROVA][i].poligono[8][2]=14;
solido[FIGURADIPROVA][i].poligono[9][0]=4;
solido[FIGURADIPROVA][i].poligono[9][1]=12;
solido[FIGURADIPROVA][i].poligono[9][2]=11;
solido[FIGURADIPROVA][i].poligono[10][0]=4;
solido[FIGURADIPROVA][i].poligono[10][1]=12;
solido[FIGURADIPROVA][i].poligono[10][2]=10;
solido[FIGURADIPROVA][i].poligono[11][0]=4;
solido[FIGURADIPROVA][i].poligono[11][1]=10;
solido[FIGURADIPROVA][i].poligono[11][2]=11;
solido[FIGURADIPROVA][i].poligono[12][0]=5;
solido[FIGURADIPROVA][i].poligono[12][1]=9;
solido[FIGURADIPROVA][i].poligono[12][2]=13;
solido[FIGURADIPROVA][i].poligono[13][0]=5;
solido[FIGURADIPROVA][i].poligono[13][1]=9;
solido[FIGURADIPROVA][i].poligono[13][2]=14;
solido[FIGURADIPROVA][i].poligono[14][0]=5;
solido[FIGURADIPROVA][i].poligono[14][1]=13;
solido[FIGURADIPROVA][i].poligono[14][2]=14;
solido[FIGURADIPROVA][i].poligono[15][0]=6;
solido[FIGURADIPROVA][i].poligono[15][1]=9;
solido[FIGURADIPROVA][i].poligono[15][2]=13;
solido[FIGURADIPROVA][i].poligono[16][0]=6;
solido[FIGURADIPROVA][i].poligono[16][1]=9;
solido[FIGURADIPROVA][i].poligono[16][2]=11;
solido[FIGURADIPROVA][i].poligono[17][0]=6;
solido[FIGURADIPROVA][i].poligono[17][1]=11;
solido[FIGURADIPROVA][i].poligono[17][2]=13;
solido[FIGURADIPROVA][i].poligono[18][0]=7;
solido[FIGURADIPROVA][i].poligono[18][1]=9;
solido[FIGURADIPROVA][i].poligono[18][2]=10;
solido[FIGURADIPROVA][i].poligono[19][0]=7;
solido[FIGURADIPROVA][i].poligono[19][1]=10;
solido[FIGURADIPROVA][i].poligono[19][2]=14;
solido[FIGURADIPROVA][i].poligono[20][0]=7;
solido[FIGURADIPROVA][i].poligono[20][1]=9;
solido[FIGURADIPROVA][i].poligono[20][2]=14;
solido[FIGURADIPROVA][i].poligono[21][0]=8;
solido[FIGURADIPROVA][i].poligono[21][1]=9;
solido[FIGURADIPROVA][i].poligono[21][2]=10;
solido[FIGURADIPROVA][i].poligono[22][0]=8;
solido[FIGURADIPROVA][i].poligono[22][1]=9;
solido[FIGURADIPROVA][i].poligono[22][2]=11;
solido[FIGURADIPROVA][i].poligono[23][0]=8;
solido[FIGURADIPROVA][i].poligono[23][1]=10;
solido[FIGURADIPROVA][i].poligono[23][2]=11;
// Definizione dei colori delle facce e degli spigoli
colorePoligonoR=(int)(Math.random()*200);
colorePoligonoG=(int)(Math.random()*200);
colorePoligonoB=(int)(Math.random()*200);
for(int j=0;j<solido[FIGURADIPROVA][i].nPoligoni;j++){
solido[FIGURADIPROVA][i].colorePoligono[j]=new Color(colorePoligonoR+(int)(Math.random()*56),colorePoligonoG+(int)(Math.random()*56),colorePoligonoB+(int)(Math.random()*56));
}
solido[FIGURADIPROVA][i].coloreSpigoli=new Color((int)(Math.random()*256),(int)(Math.random()*256),(int)(Math.random()*256));
}
disegna = new Disegna();
disegna.setPreferredSize(new Dimension(LARGHEZZA,ALTEZZA));
this.setContentPane(disegna);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.pack();
this.setTitle("ProvaJava");
this.setVisible(true);
// Create a new thread to run update at regular interval
Thread updateThread;
updateThread = new Thread() {
@Override
// @SuppressWarnings("SleepWhileInLoop")
public void run() {
while (true) {
update(); // update the (x, y) position
repaint(); // Refresh the JFrame. Called back paintComponent()
try {
// Delay and give other thread a chance to run
Thread.sleep(INTERVALLO); // milliseconds
} catch (InterruptedException ignore) {}
}
}
};
updateThread.start(); // called back run()
}
/** Update the (x, y) position of the moving object */
void update() {
/*---------------------------------------------Rimbalzo tra solidi------------------------------------------------------------------*/
for(int i=0;i<4;i++){
for(int j=0;j<numeroOggetti[i];j++){
solido[i][j].aggiornaPosizione();
solido[i][j].rimbalzoAiBordi(maxx,maxy,maxz);
solido[i][j].CalcolaBaricentroPoligono();
solido[i][j].OrdinaPoligono(puntoOsservazioneX,puntoOsservazioneY,puntoOsservazioneZ);
}
}
}
/** DrawCanvas (inner class) is a JPanel used for custom drawing */
class Disegna extends JPanel {
private final int[] x=new int[5];
private final int[] xpoints=new int[5];
private final int[] ypoints=new int[5];
private int npoints;
@Override
protected
void paintComponent(Graphics g) {
super.paintComponent(g); // paint parent's background
g.drawImage(img,0,0,1440,900,null);
// Disegno le sfere
for(int z=0;z<numeroOggetti[0];z++) {
g.setColor(solido[SFERA][z].coloreSpigoli);
g.fillOval((int) solido[SFERA][z].punti[0][0],(int) solido[SFERA][z].punti[0][1],(int) solido[SFERA][z].raggio,(int) solido[SFERA][z].raggio);
g.setColor(Color.BLACK);
g.drawOval((int) solido[SFERA][z].punti[0][0],(int) solido[SFERA][z].punti[0][1],(int) solido[SFERA][z].raggio,(int) solido[SFERA][z].raggio);
}
// Disegno gli altri solidi
for(int n=0;n<NUMEROTIPISOLIDO;n++){
for(int i=0;i<numeroOggetti[n];i++){
for(int j=0;j<solido[n][i].nPoligoni;j++){
int p=solido[n][i].ordinaPoligoni[j];
npoints=solido[n][i].nPuntiPoligono+1;
for(int k=0;k<solido[n][i].nPuntiPoligono;k++){
x[k]=solido[n][i].poligono[p][k];
xpoints[k]=(int) solido[n][i].punti[x[k]][0];
ypoints[k]=(int) solido[n][i].punti[x[k]][1];
}
xpoints[solido[n][i].nPuntiPoligono]=xpoints[0];
ypoints[solido[n][i].nPuntiPoligono]=ypoints[0];
g.setColor(solido[n][i].colorePoligono[p]);
g.fillPolygon(xpoints, ypoints,npoints);
g.setColor(solido[n][i].coloreSpigoli);
for(int k=0;k<solido[n][i].nPuntiPoligono;k++){
g.drawLine(xpoints[k],ypoints[k],xpoints[k+1],ypoints[k+1]);
}
}
}
}
}
}
/** The entry main method */
// @SuppressWarnings("Convert2Lambda")
public static void main(String[] args) throws AWTException {
// capture the whole screen
final Image salvaschermo;
salvaschermo = new Robot().createScreenCapture(
new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()) );
// Run GUI codes in Event-Dispatching thread for thread safety
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new ProvaJava(); // Let the constructor do the job
ProvaJava.img=salvaschermo;
}
});
}
}/*
Ho ripreso il programma salvaschermo che avevo fatto cercando di usare classi e metodi.
Se volete dare un'occhiata, i consigli sono sempre ben accetti.
Sto sempre alle prime armi e molto di quello che è la struttura principale del programma l'ho copiato e per essere sincero il suo funzionamento rimane per me ancora un mistero.
Se devo far interagire diversi oggetti dello stesso tipo conviene creare un metodo nella classe principale? ( Es:. Public boolean Collisione(Oggetto Oggetto1, Oggetto oggetto2){}) oppure un thread?
*/