Figuras Geometricas [By Burnhack]

Iniciado por Burnhack, 22 Abril 2008, 21:31 PM

0 Miembros y 1 Visitante están viendo este tema.

Burnhack

Bueno presentare mi programa jeje, es algo similar al de los balones pero mas avanzado, donde se trabaja con figuras geometricas y se permiten modificaciones de las mismas, poder seleccionar el color o los lados de un poligono son algunas de las opciones. Aun no encontre el metodo de que reboten las pelotas del estadio y tampoco lo encontre para las figuras consecuentemente jejee. A este programa le falta el metodo modificar aun...que posteare en los proximos dias cuando lo deje listo. Asi que si alguien se anima a participar en este programa le doy creditos sin ningun tipo de problema. El de agregar y eliminar funcionan perfectamente. El programa esta compilado y listo para ejecutar. Un saludo

Nota : Hay creado un Package para las clases, Figura, PanelFiguras, Elipse, Rectangulo, Poligono



Clase Principal [Figuras]

import java.applet.Applet;
import java.awt.event.*;
import java.awt.*;
import figuras.*;

public class Figuras extends Applet implements Runnable, ActionListener {

PanelFiguras  panelIzquierdo;
Thread t;
List lstFiguras;
TextField txtAncho,
  txtAlto,
  txtVelocidad,
  txtMinX,
  txtMinY,
  txtMaxX,
  txtMaxY;
Choice   cboMovimiento,
  cboColor,
  cboLados;
Button   cmdAgregar,
  cmdModificar,
  cmdEliminar;
CheckboxGroup            cbgTipo;
Checkbox            chkRectangulo,
chkElipse,
chkPoligono;
Color color[];

public void init(){

setLayout(new BorderLayout());
setSize(600, 400);
//Crear el panel Derecho
Panel panelDerecho = new Panel();
panelDerecho.setBackground(Color.gray);
panelDerecho.setPreferredSize(new Dimension(200, 400));
//Añadir la etiqueta "Figuras" al panel derecho
Label lblAux = new Label("Figuras");
lblAux.setPreferredSize(new Dimension(200, 20));
lblAux.setAlignment(Label.CENTER);
panelDerecho.add(lblAux);
//Añadir la lista para las figuras al panel derecho
lstFiguras = new List();
lstFiguras.setPreferredSize(new Dimension(170, 170));
panelDerecho.add(lstFiguras);
//Añadir campos de datos
txtAncho = agregarTextField(panelDerecho, "Ancho");
txtAlto = agregarTextField(panelDerecho, "Alto");
cboMovimiento= agregarChoice(panelDerecho, "Movimiento");
cboMovimiento.add("Horizontal");
cboMovimiento.add("Vertical");
cboMovimiento.add("Diagonal");
cboMovimiento.add("Diagonal Inversa");
cboMovimiento.add("En L");
cboMovimiento.add("En L Inversa");
txtVelocidad = agregarTextField(panelDerecho, "Velocidad");
txtMinX = agregarTextField(panelDerecho, "Min X");
txtMinY = agregarTextField(panelDerecho, "Min Y");
txtMaxX = agregarTextField(panelDerecho, "Max X");
txtMaxY = agregarTextField(panelDerecho, "Max Y");
cboColor= agregarChoice(panelDerecho, "Color");
cboColor.add("Blanco");
cboColor.add("Azul");
cboColor.add("Rojo");
cboColor.add("Verde");
cboColor.add("Amarillo");
cboColor.add("Naranja");
cboColor.add("Rosa");
cboColor.add("Gris");
cboColor.add("Magenta");
color = new Color[9];
color[0] = Color.white;
color[1] = Color.blue;
color[2] = Color.red;
color[3] = Color.green;
color[4] = Color.yellow;
color[5] = Color.orange;
color[6] = Color.pink;
color[7] = Color.gray;
color[8] = Color.magenta;
//Añadir tipo de figura
cbgTipo = new CheckboxGroup();
chkRectangulo = new Checkbox("Rectangulo",cbgTipo, true);
chkRectangulo.setPreferredSize(new Dimension(150, 20));
panelDerecho.add(chkRectangulo);
chkElipse = new Checkbox("Elipse",cbgTipo, false);
chkElipse.setPreferredSize(new Dimension(150, 20));
panelDerecho.add(chkElipse);
chkPoligono = new Checkbox("Polígono", cbgTipo, false);
chkPoligono.setPreferredSize(new Dimension(70, 20));
panelDerecho.add(chkPoligono);
cboLados = new Choice();
cboLados.setPreferredSize(new Dimension (75, 20));
for ( int i=3; i<=9; i++)
cboLados.add(i + " lados");
panelDerecho.add(cboLados);
//Añadir botones
cmdAgregar = new Button ("Agregar");
cmdAgregar.addActionListener((this));
cmdModificar = new Button ("Modificar");
cmdModificar.addActionListener((this));
cmdEliminar = new Button ("Eliminar");
cmdEliminar.addActionListener((this));
cmdAgregar.setPreferredSize(new Dimension(60,30));
cmdModificar.setPreferredSize(new Dimension(60,30));
cmdEliminar.setPreferredSize(new Dimension(60,30));
panelDerecho.add(cmdAgregar);
panelDerecho.add(cmdModificar);
panelDerecho.add(cmdEliminar);
//Añadir el panel Derecho al Applet
add(panelDerecho, BorderLayout.EAST);
//Crear el panel izquierdo
panelIzquierdo = new PanelFiguras(this);
add(panelIzquierdo, BorderLayout.CENTER);

}


private TextField agregarTextField(Panel p, String e){
Label lblAux= new Label(e);
TextField txtAux = new TextField();
lblAux.setPreferredSize(new Dimension (90, 20));
txtAux.setPreferredSize(new Dimension (90, 20));
p.add(lblAux);
p.add(txtAux);
return txtAux;
}

private Choice agregarChoice(Panel p, String e){
Label lblAux= new Label(e);
Choice cboAux = new Choice();
lblAux.setPreferredSize(new Dimension (90, 20));
cboAux.setPreferredSize(new Dimension (90, 20));
p.add(lblAux);
p.add(cboAux);
return cboAux;
}

public void start(){
t = new Thread(this);
if (t != null) t.start();
}

public void run(){
while (true){
panelIzquierdo.repaint();
panelIzquierdo.mover();
try {
Thread.sleep(40);
} catch (Exception e) {

}
}
}

public void actionPerformed (ActionEvent e){
if (e.getSource() == cmdAgregar){
Figura aux;

if(cbgTipo.getSelectedCheckbox()== chkRectangulo){
lstFiguras.add("Rectangulo");
aux = new Rectangulo (Integer.parseInt(txtAncho.getText()),
Integer.parseInt(txtAlto.getText()),
Integer.parseInt(txtVelocidad.getText()),
cboMovimiento.getSelectedIndex(),
Integer.parseInt(txtMinX.getText()),
Integer.parseInt(txtMinY.getText()),
Integer.parseInt(txtMaxX.getText()),
Integer.parseInt(txtMaxY.getText()),
color[cboColor.getSelectedIndex()]);

}
else if (cbgTipo.getSelectedCheckbox()== chkElipse){
lstFiguras.add("Elipse");
aux = new Elipse (Integer.parseInt(txtAncho.getText()),
Integer.parseInt(txtAlto.getText()),
Integer.parseInt(txtVelocidad.getText()),
cboMovimiento.getSelectedIndex(),
Integer.parseInt(txtMinX.getText()),
Integer.parseInt(txtMinY.getText()),
Integer.parseInt(txtMaxX.getText()),
Integer.parseInt(txtMaxY.getText()),
color[cboColor.getSelectedIndex()]);
}
else{
lstFiguras.add("Poligono");
aux = new Poligono (cboLados.getSelectedIndex()+3,
Integer.parseInt(txtAncho.getText()),
Integer.parseInt(txtVelocidad.getText()),
cboMovimiento.getSelectedIndex(),
Integer.parseInt(txtMinX.getText()),
Integer.parseInt(txtMinY.getText()),
Integer.parseInt(txtMaxX.getText()),
Integer.parseInt(txtMaxY.getText()),
color[cboColor.getSelectedIndex()]);
}
//añadir la figura al panel izquierdo
panelIzquierdo.agregarFigura(aux);
}

else if (e.getSource () == cmdModificar){

}
else if (e.getSource ()== cmdEliminar){
int i =lstFiguras.getSelectedIndex();
if (i >= 0){
panelIzquierdo.eliminarFigura(i);
lstFiguras.remove(i);
}
}
}
}



Cuentas Premium Gratis aquí

Petición partidos fútbol, F1, tenis, baloncesto...
aquí

Burnhack

Esta es la clase Figura, se refiere a cada figura , no confundir con figuras...que es la clase principal

package figuras;

import java.awt.Color;
import java.awt.Graphics;

public abstract class Figura {

int x, // coordenada X
    y, // coordenada Y
    v, // velocidad de movimiento
    vx,     // componentes x de la velocidad
    vy, // componentes y de la velocidad
    ancho, //ancho de la figura
    alto, //alto de la figura
    tipo, // tipo de movimiento
    minX,   // valor minimo para la coordenada X
    minY, // valor minimo para la coordenada Y
    maxX, // valor maximo para la coordenada X
    maxY; // valor maximo para la coordenada Y

Color color; // color de relleno de la figura

public Figura (int ancho, int alto, int v, int tipo,
int minX, int minY, int maxX, int maxY, Color color){

this.v = v;
this.ancho = ancho;
this.alto= alto;
this.minX = minX;
this.minY = minY;
this.maxX = maxX;
this.maxY = maxY;
this.color = color;
this.tipo= tipo;
double anchoMov = maxX - minX + 1;
double altoMov = maxY - minY +1;
double d = Math.sqrt (Math.pow(anchoMov, 2)+
Math.pow(altoMov, 2));
switch (tipo){//tipos de movimiento
case 0://horizontal restringido a un area rectangular
x = minX ;
y = (minY + maxY + 1 -alto);
vx = v;
vy = 0;
break;
case 1: //Movimiento vertical restringido a un area rectangular
x = (minX + maxX - ancho +1) /2 ;
y = minY;
vx = 0;
vy = v;
break;
case 2://Movimiento diagonal
x = minX ;
y = minY;
vx = (int) Math.round(anchoMov * v / d);
vy = (int) Math.round(altoMov * v / d);
break;
case 3://Movimiento diagonal invertido
x = maxX - ancho;
y = minY;
vx = -(int) Math.round(anchoMov * v / d);
vy = (int) Math.round(altoMov * v / d);
break;
case 4://Movimiento L
x = minX ;
y = minY;
vx = 0;
vy = -v;
break;
case 5://Movimiento L invertida
x = minX ;
y = minY;
vx = v;
vy = 0;
break;

}
}



public abstract void paint (Graphics g);


public void mover(){
switch (tipo) {
case 0: moverH(); break;
case 1: moverV(); break;
case 2: moverD(); break;
case 3: moverDI (); break;
case 4: moverL (); break;
case 5: moverLI (); break;
}
}

private void moverH(){
x += vx;

if (x + ancho >= maxX){
x = maxX - ancho;
vx = -vx;
}
else if(x <= minX){
x = minX;
vx = -vx;
}
}

private void moverV(){
y += vy;
if (y + alto >= maxY){
y = maxY - alto;
vy = -vy;
}
else if(y <= minY){
y = minY;
vy = -vy;
}
}

private void moverD(){
x += vx ;
y += vy ;

if ((x+ ancho) >= maxX || (y + alto) >= maxY){
x = maxX - ancho;
y = maxY - alto;
vx = -vx;
vy = -vy;
}
else if (x <= minX || y <= minY){
x = minX;
y= minY;
vx = -vx;
vy = -vy;
}

}

private void moverDI(){
x += vx ;
y += vy ;

if (x <= minX ||  (y + alto) >= maxY){
x = minX;
y = maxY - alto;
vx = -vx;
vy = -vy;
}
else if ((x + ancho) >= maxX ||  y <= minY){
x = maxX - ancho;
y =  minY;
vx = -vx;
vy = -vy;
}

}

private void moverL(){
x += vx;
y +=vy;

if (y + alto >= maxY && vy > 0){
y = maxY - alto;
vx = v;
vy = 0;
}
else if(x + ancho >= maxX && vx > 0){
x = maxX - ancho;
vx = -vx;
}
else if (x <= minX && vx < 0){
x= minX;
vx = 0;
vy = -v;
}
else if(y <= minY && vy < 0 ){
y = minY;
vy = -vy;
}
}

private void moverLI(){
x += vx;
y +=vy;


if (x + ancho >= maxX && vx > 0){
x = maxX - ancho;
vx = 0;
vy = -v;
vy = v;

}
else if(y + alto >= maxY && vy > 0 ){
y = maxY - alto;
vy = -vy;

}
else if (y <= minY && vy < 0){

y = minY;
vy = 0;
vx = -v;
}
else if(x <= minX && vx < 0){
x= minX;
vx = -vx;
}
}

}



Cuentas Premium Gratis aquí

Petición partidos fútbol, F1, tenis, baloncesto...
aquí

Burnhack

Esta es la clase Panel Figuras, donde agregaremos las figuras. esta clase tampoco hacia falta realmente ya que las figuras las podemos dibujar sobre el propio primer panel , limitariamos el campo y listo, pero bueno asi queda mas claro el code.Nose cual estaria mejor visto desde el punto de vista del programador

package figuras;

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Panel;

public class PanelFiguras extends Panel {

Figura v[];
int cont;
static final int max = 1000;
Image aux;


public PanelFiguras(Applet a){
cont = 0;
v = new Figura[max];
aux = a.createImage(600, 400);

}

public boolean agregarFigura(Figura f){
if (cont == 1000)
return false;
else{
v[cont ++] = f;
return true;
}
}

public boolean eliminarFigura(int i){
if (cont == 0 || i >= cont)
return false;
else{
for (int j=i; j<cont; j++)
v[j] = v[j+1];
cont--;
return true;
}
}
public void mover(){
for (int i=0; i<cont; i++)
v[i].mover();
}

public void update (Graphics g){
paint (g);
}
public void paint(Graphics g){
aux.getGraphics().setColor(Color.white);
aux.getGraphics().fillRect(0, 0, 600, 400);
for (int i=0; i<cont; i++)
v[i].paint(aux.getGraphics());
g.drawImage(aux, 0, 0, this);
}

}



Cuentas Premium Gratis aquí

Petición partidos fútbol, F1, tenis, baloncesto...
aquí

Burnhack

Aqui tengo las clases de cada una de las figuras Elipse, como so cortas las pondre todas en este mismo post. Repito son clases diferentes, no copiar y pegar en la misma clase. Hay que crear clases diferentes para los tres tipos de figuras

Clase Elipse

package figuras;

import java.awt.Color;
import java.awt.Graphics;

public class Elipse extends Figura {

public Elipse(int ancho, int alto, int v, int tipo, int minX, int minY,
int maxX, int maxY, Color color) {
super(ancho, alto, v, tipo, minX, minY, maxX, maxY, color);

}


public void paint(Graphics g) {
g.setColor(color);
g.fillOval(x, y, ancho, alto);
}

}








La clase Poligono


package figuras;

import java.awt.*;
import java.awt.Color;
import java.awt.Graphics;

public class Poligono extends Figura
{

int px[], py[];

public Poligono (int lados, int radio, int v, int tipo, int minX, int minY,
int maxX, int maxY, Color color) {
super(radio, radio, v, tipo, minX, minY, maxX, maxY, color);
px = new int [lados];
py = new int [lados];
double inc = 2*Math.PI/ (double)lados;
        double angulo = 0.0;
       
    for (int i=0; i<lados; i++){   
px[i] =(int)((int)Math.round(radio * Math.cos(angulo)) + radio + x);
py[i] =(int)((int)Math.round(radio * Math.sin(angulo)) + radio + y);
angulo += inc;
}
}

    public void paint(Graphics g)
    {
        g.setColor(color);
        g.fillPolygon(px, py, px.length);
    }
   
   public void mover(){
int xaux = x, yaux= y;
super.mover();
int dx = x -xaux , dy = y - yaux;
for (int i = 0; i<px.length; i++){
px[i] += dx;
py[i] += dy;
}
    }
}







Y la clase Rectangulo


package figuras;

import java.awt.Color;
import java.awt.Graphics;

public class Rectangulo extends Figura {

public Rectangulo(int ancho, int alto, int v, int tipo, int minX, int minY,
int maxX, int maxY, Color color) {
super(ancho, alto, v, tipo, minX, minY, maxX, maxY, color);
}

public void paint(Graphics g) {
g.setColor(color);
g.fillRect(x, y, ancho, alto);
}

}




Saludos



Cuentas Premium Gratis aquí

Petición partidos fútbol, F1, tenis, baloncesto...
aquí

narcorasta

gran trabajo amigo  ;-) pero esto lo puedo implementar en netbeans ? esq tengo un trabajo parecido y necesito ayuda !

RyogiShiki

Cita de: narcorasta en  9 Junio 2013, 08:00 AM
gran trabajo amigo  ;-) pero esto lo puedo implementar en netbeans ? esq tengo un trabajo parecido y necesito ayuda !

Dos cosas: primero, si necesitas ayuda porfavor abre un nuevo tema, incluso puedes en ese tema referenciar este tema. Y segundo es contra las normas revivir post tan viejos, vamos que es un tema del 2008.

Saludos


narcorasta

lo siento amigo olvide ese detalle pero esq busque por toda la web y esto es lo mas cercano qe encontre y tenia qe intentarlo pero bueno abrire otro tema para ver si me ayudan
gracias por avisar y saludos  :D