martes, 3 de enero de 2012

Cubo 3D en java.....

El siguiente es un Applet en el que tenemos un cubo, el cual rota en cualquier dirección, mostrándonos  sus coordenadas X, Y.


Ahora el código:

nombre: Cubo.java
........................................................................................................
/**
 *
 * @author alex4024
 */
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.Math;
import java.awt.Polygon;

class Point{

public double x;

public double y;

public double z;

Point(){ this.x=0; this.y=0; this.z=0; }

Point(double x,double y, double z){ this.x=x; this.y=y; this.z=z; }

int getXCoordinate(){return Cubo.origin + (int)this.x;}

int getYCoordinate(){return Cubo.origin - (int)this.y;}

int getZCoordinate(){return 0;} 

}

class Face{

Point p1,p2,p3,p4;

Polygon side= new Polygon();

Face(){}

Face(Point p1,Point p2,Point p3,Point p4){

this.p1=p1;this.p2=p2;this.p3=p3;this.p4=p4;

this.side.addPoint(p1.getXCoordinate(),p1.getYCoordinate());

this.side.addPoint(p2.getXCoordinate(),p2.getYCoordinate());

this.side.addPoint(p3.getXCoordinate(),p3.getYCoordinate());

this.side.addPoint(p4.getXCoordinate(),p4.getYCoordinate());

}

public void drawFace(Graphics g){ g.fillPolygon(side); }

public boolean isVisible(){

Point aux1, aux2;

aux1 = new Point(p2.x-p1.x, p2.y-p1.y, p2.z-p1.z); // p1->p2

aux2 = new Point(p4.x-p1.x, p4.y-p1.y, p4.z-p1.z); // p1->p4

if((aux1.x*aux2.y - aux1.y*aux2.x) > 0)

return true;

return false;

}

}

public class Cubo extends Applet implements

Runnable, MouseMotionListener{

Thread luxury;

static Point[] vertex = new Point[8]; 

static int maxSize =300; 

static int origin = maxSize/2;

static int xMouseP=0, yMouseP =0;

int xAux , yAux ; 

int module = 50; 

Image canvasAux;

Graphics backBuffer;

public void init(){

setSize(maxSize,maxSize);

setBackground( new Color(0.2f,0.6f,0.1f,1.0f) );

addMouseMotionListener(this);

int[] coordX = new int[]{-module,module,module,-module,-module,module,module,-module};

int[] coordY = new int[]{-module,-module,module,module,-module,-module,module,module};

int[] coordZ = new int[]{module,module,module,module,-module,-module,-module,-module};

canvasAux = createImage(500,500);

backBuffer = canvasAux.getGraphics();

for(int i =0; i<vertex.length; i++){

vertex[i] = new Point(coordX[i],coordY[i],coordZ[i]);

}

}

public void start(){

try { luxury = new Thread(this); luxury.start(); }

catch (Exception e){}

}

public void run() {}

public void stop(){}

public void paint(Graphics g){

int[] pts1 = new int[]{0,1,5,0,0,3};

int[] pts2 = new int[]{1,5,4,3,4,2};

int[] pts3 = new int[]{2,6,7,7,5,6};

int[] pts4 = new int[]{3,2,6,4,1,7};

Color[] colorRGB = new Color[]{ Color.black, Color.blue,Color.orange,Color.pink,Color.red, Color.yellow};

Face[] faces = new Face[6];

backBuffer.clearRect(0,0,500,500);

for(int i=0; i<6; i++){

backBuffer.setColor(colorRGB[i]);

faces[i] = new 

Face(vertex[pts1[i]],vertex[pts2[i]],vertex[pts3[i]],vertex[pts4[i]]);

if(faces[i].isVisible()){

faces[i].drawFace(backBuffer);

}

}

g.drawImage(canvasAux,0,0,this);

g.drawString(" Coordenadas: ", 30,30);

g.drawString(" X= " + xMouseP, 30,50);

g.drawString(" Y= " + yMouseP, 30,65);

return;

}

public void update(Graphics g){ paint(g); }

public void destroy(){

try {Thread.sleep(1500);}

catch (InterruptedException e) {

System.out.println("Exception in sleep");

}

}

void rota(double angleTeta, double anglePhi, double anglePsi) {

double teta= Math.toRadians(angleTeta);

double phi= Math.toRadians(anglePhi);

double psi= Math.toRadians(anglePsi);

Point pAux = new Point();

Point pAux1 = new Point();

Point pAux2 = new Point();

for(int i =0; i<8; i++){

pAux1.x = vertex[i].x;

pAux1.y= vertex[i].y * Math.cos(teta) + vertex[i].z * (-Math.sin(teta));

pAux1.z = vertex[i].y * Math.sin(teta) + vertex[i].z * Math.cos(teta);

pAux2.x = pAux1.x * Math.cos(phi) + pAux1.z * Math.sin(phi);

pAux2.y = pAux1.y;

pAux2.z = pAux1.x * (-Math.sin(phi)) + pAux1.z * Math.cos(phi);

pAux.x= pAux2.x * Math.cos(psi) + pAux2.y * (-Math.sin(psi));

pAux.y = pAux2.x * Math.sin(psi) + pAux2.y * Math.cos(psi);

pAux.z= pAux2.z;

vertex[i].x = pAux.x;

vertex[i].y = pAux.y;

vertex[i].z = pAux.z;

}

}

public void mouseDragged( MouseEvent e ){

xAux = xMouseP;

yAux = yMouseP;

xMouseP = e.getX();

yMouseP = e.getY();

if(yMouseP > yAux){ rota(2,0,0); }

if(yMouseP < yAux){ rota(-2,0,0); }

if(xMouseP > xAux){ rota(0,2,0); }

if(xMouseP < xAux){ rota(0,-2,0); }

repaint();

e.consume();

}

public void mouseMoved( MouseEvent e ) { }

........................................................................................................

2 comentarios: