Une terre qui tourne (3d)

Soyez le premier à donner votre avis sur cette source.

Vue 19 309 fois - Téléchargée 925 fois

Description

une boule sur lakelle on colle une image
pas de java3D
proj esecutable soue jbuilder

Source / Exemple :


//1 suele classe

import java.applet.*;
import java.awt.*;
import java.lang.Math;
import java.awt.*;
import java.awt.image.*;

public class go extends Applet implements Runnable
{
 int ecranX[],ecranY[],Px[],triangleaire[],yMOINSy[],Px2[],
     xCoins[],yCoins[],x[],y[],rotation[][],bloc[],xMOINSx[],
     XmoinsX[],YmoinsY[],triangle[][],lesCouleurs[],
     i,ii,j,iii,k,largeurEcran,hauteurEcran,densitéeX = 20,
     densitéeY = 60,densitée,xx,yy,
     maxi,nbElements,nbSommets,milieux,milieuy,x2,debutx,debuty,finx,
     finy,point1x,point1y,point2x,point2y,point3x,point3y,
     signe,xmin,xmax,ymin,ymax,L,H,picsou,pixel,h,l,numero,
     X1,X2,X3,Y3,Y2,y1,y2,x3,y3,e,f,a,Y1,gg,lSUR2,hSUR2,m,n,
     maximum = 1000000000,xDplt,yDplt,sens = 1,
     b,c,d,hauteur,largeur,nbObjets,
     x11,y11,x12,y12,x21,y21,x22,y22,xGravite,yGravite,zGravite,
     densiteex,densiteey,iiii,ao,bo,co;
 double xBarycentre[],
        yBarycentre[],zBarycentre[],xNormale[],yNormale[],zNormale[],
        xSommet3D[],xSommet2D[],ySommet2D[],ySommet3D[],zSommet3D[],
        distance1,distance2,distance3,pas,x1,poids1,poids2,poids3,
        u1,u2,u3,v1,v2,v3,
        xVux,yVux,zVux,xVuy,yVuy,zVuy,xVuz,longueur,
        yVuz,zVuz,xCam,yCam,zCam,distance,largeurplanvu,hauteurplanvu,
        rapport1,rapport2,e00,e01,e02,e03,e10,e11,e12,e13,e20,e21,e22,
        e23,e30,e31,e32,e33,ix1,igrek1,zed1,ix2,igrek2,zed2,ix3,igrek3,zed3,
        xPoint1,xPoint2,xPoint3,yPoint1,yPoint2,yPoint3,zPoint1,zPoint2,zPoint3,
        xCentre,yCentre,zCentre,xNormal,yNormal,zNormal,poids11,
        poids21,poids31,dist,tre,
        toutPetit = 0.00001,ix,igrek,zed,un,deux,cosPhy,sinPhy,cosTheta,
        sinTheta,theta,phy;
 PixelGrabber grosPx;
 Graphics g3,g2;
 Image Imagecachee3,saphir,Imagecachée;
 boolean tournerTerre,visible;
 MediaTracker myTracker=new MediaTracker(this);
 Font F = new Font("TimesRoman",1,14);

 public void init()
 {
  largeurEcran = new Integer(getParameter("largeurEcran")).intValue();
  hauteurEcran = new Integer(getParameter("hauteurEcran")).intValue();
  setBackground(Color.black);// new Color(125,125,152));
  Imagecachée = createImage(largeurEcran,hauteurEcran);
  g2 = Imagecachée.getGraphics();
  saphir = getImage(getDocumentBase(),"terre.gif");
  myTracker.addImage(saphir,0);
  try
   {
     myTracker.waitForID(0);
   }
  catch (InterruptedException e){System.err.println ("Erreur : " + e);}

  nbSommets = densitée = (densitéeX+1)*(densitéeY+1);
  xSommet3D = new double[densitée];
  ySommet3D = new double[densitée];
  zSommet3D = new double[densitée];
  xSommet2D = new double[densitée];
  ySommet2D = new double[densitée];
  ecranX = new int[densitée];
  ecranY = new int[densitée];
  k = 0;
  for(int j=0;j<=densitéeY;j++)
  {
   deux = (double)j/densitéeY;
   phy = 2*Math.PI*deux;
   cosPhy = Math.cos(phy);
   sinPhy = Math.sin(phy);
   for(int i=0;i<=densitéeX;i++)
   {
    un = (double)i/densitéeX;
    xSommet2D[k] = deux;
    ySommet2D[k] = un;
    theta = Math.PI*un;
    sinTheta = Math.sin(theta);
    xSommet3D[k] = cosPhy*sinTheta;
    ySommet3D[k] = Math.cos(theta);
    zSommet3D[k] = sinTheta*sinPhy;
    k++;
   }
  }
  k = 0;
  nbElements = densitéeX*densitéeY;
  triangle = new int[nbElements][4];
  for(int j=0;j<densitéeY;j++)
   for(int i=0;i<densitéeX;i++)
   {
   triangle[k] = new int[]{(densitéeX+1)*(j)+i,
                           (densitéeX+1)*(j)+i+1,
                           (densitéeX+1)*(1+j)+i+1,
                           (densitéeX+1)*(1+j)+i};
   k++;
  }
  for(int i=0;i<densitée;i++)
  {
   xSommet3D[i] *= 10;
   ySommet3D[i] *= 10;
   zSommet3D[i] *= 10;
  }
  lesCouleurs = new int[saphir.getHeight(this)*saphir.getWidth(this)];
  grosPx = new PixelGrabber(saphir,0,0,saphir.getWidth(this),saphir.getHeight(this),lesCouleurs,0,saphir.getWidth(this));
  try
  {
   grosPx.grabPixels();
  }
  catch(InterruptedException ee){}
  largeur = saphir.getWidth(this);
  hauteur = saphir.getHeight(this);
  xBarycentre = new double[nbElements];
  yBarycentre = new double[nbElements];
  zBarycentre = new double[nbElements];
  xNormale = new double[nbElements];
  yNormale = new double[nbElements];
  zNormale = new double[nbElements];
  for(int i=0;i<nbElements;i++)
  {
   xBarycentre[i] = (xSommet3D[triangle[i][0]]+xSommet3D[triangle[i][1]]+xSommet3D[triangle[i][2]]+xSommet3D[triangle[i][3]])/4;
   yBarycentre[i] = (ySommet3D[triangle[i][0]]+ySommet3D[triangle[i][1]]+ySommet3D[triangle[i][2]]+ySommet3D[triangle[i][3]])/4;
   zBarycentre[i] = (zSommet3D[triangle[i][0]]+zSommet3D[triangle[i][1]]+zSommet3D[triangle[i][2]]+zSommet3D[triangle[i][3]])/4;
   ix = xNormale[i] = (ySommet3D[triangle[i][2]]-ySommet3D[triangle[i][0]])*(zSommet3D[triangle[i][1]]-zSommet3D[triangle[i][3]])-
                      (zSommet3D[triangle[i][2]]-zSommet3D[triangle[i][0]])*(ySommet3D[triangle[i][1]]-ySommet3D[triangle[i][3]]);
   igrek = yNormale[i] = (zSommet3D[triangle[i][2]]-zSommet3D[triangle[i][0]])*(xSommet3D[triangle[i][1]]-xSommet3D[triangle[i][3]])-
                         (xSommet3D[triangle[i][2]]-xSommet3D[triangle[i][0]])*(zSommet3D[triangle[i][1]]-zSommet3D[triangle[i][3]]);
   zed = zNormale[i] = (xSommet3D[triangle[i][2]]-xSommet3D[triangle[i][0]])*(ySommet3D[triangle[i][1]]-ySommet3D[triangle[i][3]])-
                       (ySommet3D[triangle[i][2]]-ySommet3D[triangle[i][0]])*(xSommet3D[triangle[i][1]]-xSommet3D[triangle[i][3]]);
   longueur = Math.sqrt(ix*ix+igrek*igrek+zed*zed);
   xNormale[i] /= longueur;
   yNormale[i] /= longueur;
   zNormale[i] /= longueur;
  }
  Imagecachee3 = createImage(largeurEcran,hauteurEcran);
  g3 = Imagecachee3.getGraphics();
  lSUR2 = largeurEcran/2;hSUR2 = hauteurEcran/2;
  xVux = 1;yVux = 0;zVux = 0;xVuy = 0;yVuy = 1;zVuy = 0;
  xVuz = 0;yVuz = 0;zVuz = 1;xCam = 0;yCam = 0;zCam = 70;
  dist = distance = Math.sqrt(xCam*xCam+yCam*yCam+zCam*zCam);
  largeurplanvu = distance;
  hauteurplanvu = distance*hauteurEcran/largeurEcran;
  rapport1 = (double)largeurEcran/largeurplanvu;
  rapport2 = (double)hauteurEcran/hauteurplanvu;
  distance = 100000;
  x = new int[3];
  y = new int[3];
  xCoins = new int[4];
  yCoins = new int[4];
  xCoins[0] = 0;
  xCoins[1] = largeurEcran;
  xCoins[2] = largeurEcran;
  xCoins[3] = 0;
  yCoins[0] = 0;
  yCoins[1] = 0;
  yCoins[2] = hauteurEcran;
  yCoins[3] = hauteurEcran;
  rotation = new int[][]{{0,1},{0,2},{1,2}};
  xMOINSx = new int[3];
  yMOINSy = new int[3];
  XmoinsX = new int[4];
  YmoinsY = new int[4];
  XmoinsX[0] = largeurEcran;
  XmoinsX[1] = 0;
  XmoinsX[2] = -largeurEcran;
  XmoinsX[3] = 0;
  YmoinsY[0] = 0;
  YmoinsY[1] = hauteurEcran;
  YmoinsY[2] = 0;
  YmoinsY[3] = -hauteurEcran;
  xDplt =5;
  yDplt = -9;
  Px = new int[largeurEcran*hauteurEcran];
  a=0;
 }

 public void run(){}

 public void tourner()
 {
  int secondes=24*60*60;
  boolean aaaa=false;
 }

 public void paint(Graphics g)
 {
  for(i=0;i<100;i--)
  {
  g2.clearRect(0,0,largeurEcran,hauteurEcran);
  dist += yDplt*0.05*sens;
  if(dist>0.001 && dist<200)
  {
   largeurplanvu = dist;
   hauteurplanvu = (dist*hauteurEcran)/largeurEcran;
   rapport1 = largeurEcran/largeurplanvu;
   rapport2 = hauteurEcran/hauteurplanvu;
  }
  else
   sens *= -1;
  ix1 = xDplt*0.005;xVux = xVux+xVuz*ix1;yVux = yVux+yVuz*ix1;
  zVux = zVux+zVuz*ix1;ix1 = Math.sqrt(xVux*xVux+yVux*yVux+zVux*zVux);
  xVux /= ix1;yVux /= ix1;zVux /= ix1;xVuz = yVux*zVuy-zVux*yVuy;
  yVuz = xVuy*zVux-zVuy*xVux;zVuz = xVux*yVuy-yVux*xVuy;
  xCam = xVuz*distance;yCam = yVuz*distance;zCam = zVuz*distance;
  ix1 = -(xCam*xCam+yCam*yCam+zCam*zCam);
  e00 = xCam*xCam+ix1;e01 = xCam*yCam;e02 = xCam*zCam;e10 = yCam*xCam;
  e11 = yCam*yCam+ix1;e12 = yCam*zCam;e20 = zCam*xCam;e21 = zCam*yCam;
  e22 = zCam*zCam+ix1;e33 = ix1;
  xmin = maximum;
  ymin = maximum;
  xmax = -maximum;
  ymax = -maximum;
  visible = true;
  for(ii=0;ii<nbSommets;ii++)
  {
   ix2 = xSommet3D[ii];igrek2 = ySommet3D[ii];zed2 = zSommet3D[ii];
   ix3 = xCam*ix2+yCam*igrek2+zCam*zed2+e33;
   ix1 = (e00*ix2+e01*igrek2+e02*zed2)/ix3;
   igrek1 = (e10*ix2+e11*igrek2+e12*zed2)/ix3;
   zed1 = (e20*ix2+e21*igrek2+e22*zed2)/ix3;
   a = ecranX[ii] = lSUR2+(int)((ix1*xVux+igrek1*yVux+zed1*zVux)*rapport1+0.5);
   b = ecranY[ii] = hSUR2-(int)((ix1*xVuy+igrek1*yVuy+zed1*zVuy)*rapport2+0.5);
   if(a<0 && b<0)
    visible = false;
   xmin = Math.min(a,xmin);
   ymin = Math.min(b,ymin);
   xmax = Math.max(a,xmax);
   ymax = Math.max(b,ymax);
  }
  xmin =  Math.max(0,xmin);
  ymin =  Math.max(0,ymin);
  L = Math.min(largeurEcran-xmin,xmax-xmin);
  H = Math.min(hauteurEcran-ymin,ymax-ymin);
  if(visible)
  for(iii=0;iii<L*H;iii++)
    Px[iii] = 0;
  for(numero = 0;numero<nbElements;numero++)
  {
   triangleaire = triangle[numero];
   a = triangleaire[0];
   b = triangleaire[1];
   c = triangleaire[2];
   d = triangleaire[3];
   yPoint1 = ySommet3D[a];
   zPoint1 = zSommet3D[a];
   xPoint2 = xSommet3D[b];
   yPoint2 = ySommet3D[b];
   zPoint2 = zSommet3D[b];
   xPoint3 = xSommet3D[c];
   yPoint3 = ySommet3D[c];
   zPoint3 = zSommet3D[c];
   xCentre = xBarycentre[numero];
   yCentre = yBarycentre[numero];
   zCentre = zBarycentre[numero];
   xNormal = xNormale[numero];
   yNormal = yNormale[numero];
   zNormal = zNormale[numero];
   x[0] = X1 = ecranX[a];
   y[0] = Y1 = ecranY[a];
   x[1] = X2 = ecranX[b];
   y[1] = Y2 = ecranY[b];
   x[2] = X3 = ecranX[c];
   y[2] = Y3 = ecranY[c];
   xMOINSx[0] = X1-X2;
   yMOINSy[0] = Y1-Y2;
   xMOINSx[1] = X1-X3;
   yMOINSy[1] = Y1-Y3;
   xMOINSx[2] = X2-X3;
   yMOINSy[2] = Y2-Y3;
   ix1 = xCam-xCentre;
   igrek1 = yCam-yCentre;
   zed1 = zCam-zCentre;
   if((1-(xNormal*ix1+yNormal*igrek1+zNormal*zed1)/
    Math.sqrt(ix1*ix1+igrek1*igrek1+zed1*zed1)/
    Math.sqrt(xNormal*xNormal+yNormal*yNormal+zNormal*zNormal))/2>0.5)
   {
    for(int tt=0;tt<2;tt++)
    {
     visible = X1 >= 0 && X1 <= largeurEcran &&
               Y1 >= 0 && Y1 <= hauteurEcran ||
               X2 >= 0 && X2 <= largeurEcran &&
               Y2 >= 0 && Y2 <= hauteurEcran ||
               X3 >= 0 && X3 <= largeurEcran &&
               Y3 >= 0 && Y3 <= hauteurEcran;
     if(!visible)
     {
      for(ii=0;ii<4;ii++)
       for(iii=0;iii<3;iii++)
       {
        bloc = rotation[iii];
        point1x = bloc[0];
        point1y = bloc[1];
        point2x = xCoins[ii];
        point2y = yCoins[ii];
        e = xCoins[(ii+1)%4];
        f = yCoins[(ii+1)%4];
        x11 = x[point1x]-point2x;
        y11 = y[point1x]-point2y;
        x12 = x[point1x]-e;
        y12 = y[point1x]-f;
        x21 = x[point1y]-point2x;
        y21 = y[point1y]-point2y;
        x22 = x[point1y]-e;
        y22 = y[point1y]-f;
        e = xMOINSx[iii];
        f = yMOINSy[iii];
        gg = x11*f-y11*e;
        h = x12*f-y12*e;
        gg = (gg>=0)?1:-1;
        h = (h>0)?1:-1;
        if(h == -gg)
        {
         e = XmoinsX[ii];
         f = YmoinsY[ii];
         gg = x11*f-y11*e;
         h = x21*f-y21*e;
         gg = (gg>=0)?1:-1;
         h = (h>0)?1:-1;
         if(h == -gg)
         {
          visible = true;
          iii = ii = 4;
         }
        }
      }
     }
     if(visible)
     {
  if(Y1<Y2)
  {
   if(Y1<Y3)
   {
    if(Y2<Y3)
    {
     ao = a;bo = b;co = c;
    }
    else
    {
     ao = a;bo = c;co = b;
    }
   }
   else
   {
    ao = c;bo = a;co = b;
   }
  }
  else
  {
   if(Y2<Y3)
   {
    if(Y1<Y3)
    {
     ao = b;bo = a;co = c;
    }
    else
    {
     ao = b;bo = c;co = a;
    }
   }
   else
   {
    ao = c;bo = b;co = a;
   }
  }
  debutx = ecranX[ao]-xmin;
  debuty = ecranY[ao]-ymin;
  milieux = ecranX[bo]-xmin;
  milieuy = ecranY[bo]-ymin;
  finx = ecranX[co]-xmin;
  finy = ecranY[co]-ymin;
  u2 = xSommet2D[bo];
  v2 = ySommet2D[bo];
  u1 = xSommet2D[ao]-u2;
  v1 = ySommet2D[ao]-v2;
  u3 = xSommet2D[co]-u2;
  v3 = ySommet2D[co]-v2;
  maxi = hauteur*largeur-1;
  point2y = finy-debuty;
  if(point2y != 0)
  {
   point2x = finx-debutx;
   pas = (double)point2x/point2y;
   point3y = milieuy-debuty;
   point3x = milieux-debutx;
   signe = point3y*point2x-point3x*point2y;
   tre = Math.abs((double)signe);
   if(signe != 0)
   {
    signe = signe>0?1:-1;
    x1 = debutx;
    point1y = finy-milieuy;
    point1x = finx-milieux;
    distance1 = milieuy*point1x-milieux*point1y;
    distance3 = debuty*point3x-debutx*point3y;
    for(int y1=debuty;y1<finy;y1++)
    {
     if(y1>=0 && y1<H)
     {
      x2 = (int)x1;
      do
      {
       poids1 = x2*point1y-y1*point1x+distance1;
       poids3 = x2*point3y-y1*point3x+distance3;
       if(x2>=0 && x2<L)
       {
        poids11 = Math.abs(poids1/tre);
        poids31 = Math.abs(poids3/tre);
        pixel = lesCouleurs[(int)((poids11*u1+u2+poids31*u3+0.5)*largeur)+(int)((poids11*v1+v2+poids31*v3)*hauteur+0.5)*largeur];
        Px[x2+L*y1] = (0xff000000 | ((0xff & pixel>>16 )<< 16 | (0xff & pixel>>8) << 8 | 0xff & pixel));
       }
       x2 -= signe;
      }
      while(y1<milieuy && signe*poids3>=0 ||
            y1>=milieuy && signe*poids1>=0);
     }
     x1 += pas;
    }
   }
  }
  }

     x[1] = X2 = ecranX[d];
     y[1] = Y2 = ecranY[d];
     xPoint2 = xSommet3D[d];
     yPoint2 = ySommet3D[d];
     zPoint2 = zSommet3D[d];
     xMOINSx[0] = X1-X2;
     yMOINSy[0] = Y1-Y2;
     xMOINSx[2] = X2-X3;
     yMOINSy[2] = Y2-Y3;
     b = d;
    }
   }
  }
  g2.drawImage(createImage(new MemoryImageSource(L,H,Px,0,L)),xmin,ymin,L,H,this);
  g.drawImage(Imagecachée,0,0,this);
 }
}

}

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
36
Date d'inscription
vendredi 25 juillet 2003
Statut
Membre
Dernière intervention
2 février 2010
1
ben ui tu débutes un pneu for (à moins que tu fasses un pneu de math...)
et ben sache ke, en Java, il y a 2 types d'executables: les appli (où il y a effectivement un main()) et les applets. Pas de pots pour toi, ici, c'est une applet. elle doit être exécutée avec du code HTML... (5lignes) du genre

<HTML>


// si tu as un 19", tu changes ces dimensions


</HTML>

dans un fichier du type .HTML

OU (pour avoir du plein écran)

<HTML>


<script language="javascript">
fen1=window.open("'","","left=0,top=0,width=810,height=1500");
fen1.document.write('<META HTTP-EQUIV="REFRESH" CONTENT="1; URL=go!.html">');
fen1.document.close();
</script>


</HTML>

dans un fichier HTML et dans le fichier ke j'ai appelé go!.html:

<HTML>

<script language=javascript>
parent.window.moveBy(-15,-45);
</script>

// si tu as un 19", tu changes ces dimensions


</HTML>

ca devrait marcher

mais tu auras remarque ke l'applet est un .class et non un .java (le fichier dans lekel doit être écrit le code source). Le .class est la compilation du .java, obtenu grâce à un compilateur. Bref, là il faut ke tu te débrouilles. Je te conseille Jbuilder chez Borland (version personnelle gratuite) pour avoir un joli compilateur, ou chez Sun pour avoir le compilateur de base (utilisable exclusivement via le dos. Pour être plus rapide et pas se faire chier avec du dos, il faut passer par des raccourcis .bat qui tapent tes commandes automatiquement. mais c'est toujours plus chiant qu'utiliser un joli compilateur du genre JBuilder). bref tu tapes compilateur java dans un moteur et vamos!

si tu comptes te limiter à des appli, fait du c++ (CBuilder ou VisualC++)

en fait c nul de demander des conseils, c plu marran de se débrouiller!!!!!!
Messages postés
36
Date d'inscription
vendredi 25 juillet 2003
Statut
Membre
Dernière intervention
2 février 2010
1
ben ui tu débutes un pneu for (à moins que tu fasses un pneu de math...)
et ben sache ke, en Java, il y a 2 types d'executables: les appli (où il y a effectivement un main()) et les applets. Pas de pots pour toi, ici, c'est une applet. elle doit être exécutée avec du code HTML... (5lignes) du genre

<HTML>


// si tu as un 19", tu changes ces dimensions


</HTML>

dans un fichier du type .HTML

OU (pour avoir du plein écran)

<HTML>


<script language="javascript">
fen1=window.open("'","","left=0,top=0,width=810,height=1500");
fen1.document.write('<META HTTP-EQUIV="REFRESH" CONTENT="1; URL=go!.html">');
fen1.document.close();
</script>


</HTML>

dans un fichier HTML et dans le fichier ke j'ai appelé go!.html:

<HTML>

<script language=javascript>
parent.window.moveBy(-15,-45);
</script>

// si tu as un 19", tu changes ces dimensions


</HTML>

ca devrait marcher

mais tu auras remarque ke l'applet est un .class et non un .java (le fichier dans lekel doit être écrit le code source). Le .class est la compilation du .java, obtenu grâce à un compilateur. Bref, là il faut ke tu te débrouilles. Je te conseille Jbuilder chez Borland (version personnelle gratuite) pour avoir un joli compilateur, ou chez Sun pour avoir le compilateur de base (utilisable exclusivement via le dos. Pour être plus rapide et pas se faire chier avec du dos, il faut passer par des raccourcis .bat qui tapent tes commandes automatiquement. mais c'est toujours plus chiant qu'utiliser un joli compilateur du genre JBuilder). bref tu tapes compilateur java dans un moteur et vamos!

si tu comptes te limiter à des appli, fait du c++ (CBuilder ou VisualC++)

en fait c nul de demander des conseils, c plu marran de se débrouiller!!!!!!
Messages postés
1
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
7 décembre 2004

Je débute en java, je démarre peut être un peu fort en voulant voir ce que donne cette exempl, mais comment on fait pour lancer ce programme il n'y a pas de methode main?
Messages postés
2835
Date d'inscription
lundi 11 août 2003
Statut
Modérateur
Dernière intervention
16 décembre 2006
10
Egalement juste un conseil comme ça : quand le code excède 30 lignes ne le met pas sur la page web mais uniquement dans le ZIP ... ca notera surement moins sévère ...
@+
Messages postés
351
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
9 décembre 2004

Non, je pense que c'est parce que c'est un peu le bordel. Faut penser à ceux qui lisent le code après. Allez je remonte avec un 7 ;p
Afficher les 7 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.