import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.Math;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextField;
class Point3D {
public int x, y, z;
public Point3D(int X, int Y, int Z) {
x = X;
y = Y;
z = Z;
}
}
class Edge { //klasa zdefiniowana do rysowania krawedzi
public int a, b;
public Edge(int A, int B) {
a = A;
b = B;
}
}
public class Box3D extends Applet implements MouseListener, MouseMotionListener,ActionListener {
double skala=4;
JTextField skalaa;
Button
b1 = new Button("Rysuj"), //guzik
b2 = new Button("Przesuń"),
b3 = new Button("Skaluj"),
b4 = new Button("Obróć");
private static final long serialVersionUID = 1L;
int width, height;
int mx, my;
int przycisk=0;
Image backbuffer;
Graphics backg;
int azimuth = 35, elevation = 30;
Point3D[] vertices;
Edge[] edges;
public void init() {
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
b4.addActionListener(this);
b1.addActionListener(new B1()); //guzik
add(b1); //guzik
b2.addActionListener(new B2()); //guzik2
add(b2); //guzik2
b3.addActionListener(new B3()); //guzik3
add(b3);
skalaa= new JTextField ("1",4);
//guzik od skalowania
add (skalaa);
b4.addActionListener(new B4()); //guzik4
add(b4);
/*
skalaa= new JTextField ("1",4);
//guzik od skalowania
add (skalaa);
*/
setSize(1366, 768);
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;
//skalowanie objetosci wgl dl bokow:
Point[] points;
points = new Point[vertices.length];
double scaleFactor = width / skala;
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.gray);
g.fillRect(0, 0, width, height);
g.setColor(Color.red);
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) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
public void actionPerformed(ActionEvent e)
{
Object source = e.getSource();
if(source == b4)
{
przycisk=1;
}
if(source == b1)
{
drawWireFrame(backg);
repaint();
}
if(source == b3)
{
skala=Double.parseDouble(skalaa.getText());
drawWireFrame(backg);
repaint();
}
if(source == b2)
{
przycisk=2;
}
}
@Override
public void mousePressed(MouseEvent e) {
mx = e.getX();
my = e.getY();
e.consume();
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseDragged(MouseEvent arg0) { //FUNKCJA OBROT
if(przycisk==1)
{
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();
}
if(przycisk==2)
{
}
}
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) {
}
class B1 implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
}
}
class B2 implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
}
}
class B3 implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
}
}
class B4 implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
}
}
}
Witam, mam pewien problem mianowicie chodzi mi o napisanie metody do przesuwania tego szescianu po x y. Po przeciagnieciu myszą powinien przemieszczać po całym oknie aplikacji.
Z góry dziękuje za pomoc.