Une terre qui tourne (3d)

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

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.