Exemple basique de CAO avec JAVA
La class Point3D comprend les points suivants:- construction d'un applet, à savoir une application incluse dans une page web,
- modélisation d'un cube en 3D,
- animation d'une forme géométrique.
Pour faire pivoter et pouvoir admirer les perspectives du cube, il suffit cliquer sur le cube et déplacer la souris. Lorsque l'on regarde de plus près le contenu de la class, le mécanisme interne est construit autour des étapes suivantes:
- mouseDragged(): lorsque l'utilisateur déplace le curseur sur le cube, la class stocke le déplacement à appliquer,
- drawWireFrame(): chaque ligne du cube est redessinée aux nouvelles coordonnées.
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.Math;
/*
* Afficher et animer un cube 3D dans un applet
*
* Author: ???
* source trouvé sur l'url
* http://www.itsmauritius.com/krish/blog/java-3d-cube-coding/
*/
class Point3D {
public int x, y, z;
public Point3D(int X, int Y, int Z) {
x = X;
y = Y;
z = Z;
}
}
class Edge {
public int a, b;
public Edge(int A, int B) {
a = A;
b = B;
}
}
public class Box3D extends Applet implements MouseListener, MouseMotionListener {
private static final long serialVersionUID = 1L;
int width, height;
int mx, my;
Image backbuffer;
Graphics backg;
int azimuth = 35, elevation = 30;
Point3D[] vertices;
Edge[] edges;
public void init() {
setSize(640, 480);
width = getSize().width;
height = getSize().height;
vertices = new Point3D[8];
vertices[0] = new Point3D(-1, -1, -1);
vertices[1] = new Point3D(-1, -1, 1);
vertices[2] = new Point3D(-1, 1, -1);
vertices[3] = new Point3D(-1, 1, 1);
vertices[4] = new Point3D(1, -1, -1);
vertices[5] = new Point3D(1, -1, 1);
vertices[6] = new Point3D(1, 1, -1);
vertices[7] = new Point3D(1, 1, 1);
edges = new Edge[12];
edges[0] = new Edge(0, 1);
edges[1] = new Edge(0, 2);
edges[2] = new Edge(0, 4);
edges[3] = new Edge(1, 3);
edges[4] = new Edge(1, 5);
edges[5] = new Edge(2, 3);
edges[6] = new Edge(2, 6);
edges[7] = new Edge(3, 7);
edges[8] = new Edge(4, 5);
edges[9] = new Edge(4, 6);
edges[10] = new Edge(5, 7);
edges[11] = new Edge(6, 7);
backbuffer = createImage(width, height);
backg = backbuffer.getGraphics();
drawWireFrame(backg);
addMouseListener(this);
addMouseMotionListener(this);
}
void drawWireFrame(Graphics g) {
double theta = Math.PI * azimuth / 180.0;
double phi = Math.PI * elevation / 180.0;
float cosT = (float) Math.cos(theta), sinT = (float) Math.sin(theta);
float cosP = (float) Math.cos(phi), sinP = (float) Math.sin(phi);
float cosTcosP = cosT * cosP, cosTsinP = cosT * sinP, sinTcosP = sinT * cosP,
sinTsinP = sinT * sinP;
// projecting vertices onto two-dimensional view-port
Point[] points;
points = new Point[vertices.length];
int scaleFactor = width / 4;
float near = 3;
int i;
float nearToObj = 1.5f;
for (i = 0; i < vertices.length; i ) {
int x0 = vertices[i].x;
int y0 = vertices[i].y;
int z0 = vertices[i].z;
float x1 = cosT * x0 sinT * z0;
float y1 = -sinTsinP * x0 cosP * y0 cosTsinP * z0;
float z1 = cosTcosP * z0 - sinTcosP * x0 - sinP * y0;
x1 = x1 * near / (z1 near nearToObj);
y1 = y1 * near / (z1 near nearToObj);
points[i] = new Point((int) (width / 2 scaleFactor * x1 0.5),
(int) (height / 2 - scaleFactor * y1 0.5));
}
// draw
g.setColor(Color.black);
g.fillRect(0, 0, width, height);
g.setColor(Color.green);
for (i = 0; i < edges.length; i) {
g.drawLine(points[edges[i].a].x, points[edges[i].a].y,
points[edges[i].b].x, points[edges[i].b].y);
}
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
mx = e.getX();
my = e.getY();
e.consume();
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseDragged(MouseEvent arg0) {
int new_mx = arg0.getX(), new_my = arg0.getY();
azimuth -= new_mx - mx;
elevation = new_my - my;
drawWireFrame(backg);
mx = new_mx;
my = new_my;
repaint();
arg0.consume();
}
public void update(Graphics g) {
g.drawImage(backbuffer, 0, 0, this);
System.out.println("azimuth: " azimuth ", elevation: " elevation);
}
public void paint(Graphics g) {
update(g);
}
@Override
public void mouseMoved(MouseEvent arg0) {
// TODO Auto-generated method stub
}
}