// // representation en perspective d'un cube // on projete sur le plan z=D import java.awt.*; public class cube2D extends Frame { // définition de la police d'affichage des textes private Font font = new Font("serif", Font.ITALIC + Font.BOLD, 16); // les points du cube en 3D centre en 0, de coté 2 // x du point i: point[i][0] // y du point i: point[i][1] // z du point i: point[i][2] int[][] point = new int[8][3]; // points du cube dans l'espace int[][] projete = new int[8][2]; // points du cube dans le plan projeté // coordonnées min/max du repère du plan de projection dans la fenêtre int minx=-300,maxx=300; int miny =-300,maxy=300; // décalage pour l'afficher le centre du repère au centre de la fenêtre int shiftx=-minx,shifty=-miny; int D = 40; // distance du point de fuite au plan de projection public void initCube() /* initialisation des points du cube Points: {-1,-1,-1},{-1,-1, 1},{-1, 1, 1},{-1, 1,-1}, { 1, 1,-1},{ 1,-1,-1},{ 1,-1, 1},{ 1, 1, 1} */ { point[0][0]=-1; point[0][1]=-1; point[0][2]=-1; point[1][0]=-1; point[1][1]=-1; point[1][2]= 1; point[2][0]=-1; point[2][1]= 1; point[2][2]= 1; point[3][0]=-1; point[3][1]= 1; point[3][2]=-1; point[4][0]= 1; point[4][1]= 1; point[4][2]=-1; point[5][0]= 1; point[5][1]=-1; point[5][2]=-1; point[6][0]= 1; point[6][1]=-1; point[6][2]= 1; point[7][0]= 1; point[7][1]= 1; point[7][2]= 1; } public void etirementCube(int facteur) /* modifie les coordonnées des points du cube pour obtenir un étirement de facteur (facteur,facteur,facteur) */ { A IMPLEMENTER } public void rotationCubeOx(double angle /* radian */) /* modifie les coordonnées des points du cube pour obtenir une rotation d'angle "angle" (en radian) des points du cube autour de l'axe Ox */ { A IMPLEMENTER } public void rotationCubeOy(double angle /* radian */) /* modifie les coordonnées des points du cube pour obtenir une rotation d'angle "angle" (en radian) des points du cube autour de l'axe Oy */ { A IMPLEMENTER } public void rotationCubeOz(double angle /* radian */) /* modifie les coordonnées des points du cube pour obtenir une rotation d'angle "angle" (en radian) des points du cube autour de l'axe Oz */ { A IMPLEMENTER } public void translationCube(int tx,int ty, int tz) /* modifie les coordonnées des points du cube pour obtenir une translation de vecteur (tx,ty,tz) des points du cube. */ { A IMPLEMENTER } void calculProjection(int d) /* calcul les points projetés du cube dans le plan z=d. les points projetés seront stockés dans le tableau proj: la projection de point[i] sera donc projete[i] */ { A IMPLEMENTER } void drawEdge(Graphics g,int i,int j) /* dessine l'arete du cube entre le sommet i et le sommet j */ { g.drawLine( projete[i%8][0]+shiftx,projete[i%8][1]+shifty, projete[j%8][0]+shiftx,projete[j%8][1]+shifty ); } void drawRepere(Graphics g) /* dessine le repere du plan de projection */ { g.drawLine(shiftx+minx+20,shifty,shiftx+maxx-40,shifty); g.drawLine(shiftx,shifty+miny+50,shiftx,shifty+maxy-20); g.drawString("0",shiftx-3,shifty-3); g.drawString("+x",shiftx+maxx-30,shifty-3); g.drawString("+y",shiftx-3,shifty+maxy-10); g.drawString("-x",shiftx+minx+10,shifty-3); g.drawString("-y",shiftx-3,shifty+miny+40); } public void paint (Graphics g) /* dessine ce qu'il y a à dessiner */ { g.setColor(Color.black); g.setFont(font); for ( int i=0; i< 8; ++i) { Integer j = new Integer(i); g.drawString(j.toString(),projete[i][0]+shiftx,projete[i][1]+shifty); } drawEdge(g,0,1); drawEdge(g,0,3); drawEdge(g,0,5); drawEdge(g,6,1); drawEdge(g,6,5); drawEdge(g,6,7); drawEdge(g,2,1); drawEdge(g,2,3); drawEdge(g,2,7); drawEdge(g,4,3); drawEdge(g,4,5); drawEdge(g,4,7); drawRepere(g); } public static void main(String[] arg) { cube2D f = new cube2D(); f.setSize(f.maxx-f.minx,f.maxy-f.miny); f.setVisible(true); double a=0.0; // variable utilisee pour faire une rotation // differente toutes les 100 ms while (true) // on va faire tourner le cube { try { Thread.sleep(100); } // pause de 100 ms catch(InterruptedException e){ } f.initCube(); // initialisation du cube f.etirementCube(100); // etirement du cube pour l'agrandir f.rotationCubeOz(a*3.14/360.0); // rotation du cube autour de l'axe Oz f.translationCube(300,200,200); // translation du cube f.calculProjection(f.D); // calcul des points projetes f.repaint(); // mise a jour du dessin ++a; } } }
Faire de même pour une projection oblique.
Dans les programmes précédent, colorier l'une des faces.