Foro no oficial de la UPCT

Versión completa: Solución a la Práctica 5
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Páginas: 1 2

Jesús Hernández Galián

Os dejo las soluciones de la Práctica 5, por si alguien se atranca haciéndola. Yo me he atrancado un par de veces, pero he salido del paso probando. Hay algunos métodos que pueden dar muchos dolores de cabeza.

Estas soluciones están hechas por mi, y funcionan de maravilla con los test. Es posible que existan soluciones más directas para algunos métodos. Yo lo he simplificado todo lo más que he podido.
Las lineas no están comentadas, así que si tenéis alguna duda sobre alguna linea no dudad en comentad. Espero que os sirva Guiño

Clase Punto:
Código PHP:
package p5;

public class 
Punto implements IForma{
    
double xy;
    
int color;
    
    public 
Punto (){
    }
    
    public 
Punto (double xdouble y){
        
this.x=x;
        
this.y=y;
    }
    
    public 
double getX(){
        return 
x;
    }
    
    public 
double getY(){
        return 
y;
    }
    
    public 
double getOrientacion(){ // No tiene sentido.
        
return 0;
    }
    
    public 
double distancia (double xdouble y){
        return 
Math.sqrt((this.x-x)*(this.x-x)+(this.y-y)*(this.y-y));
    }
    
    public 
IForma trasladar (double dxdouble dy){
        return new 
Punto (x+dxy+dy);
    }
    
    public 
IForma girar (double grados){
        return new 
Punto (x,y);
    }
    
    public 
IForma girar (double gradosdouble x0double y0){
        
double angulo Math.toRadians(grados);
        
double xgirado x0+Math.cos(angulo)*(x-x0)-Math.sin(angulo)*(y-y0);
        
double ygirado y0+Math.sin(angulo)*(x-x0)+Math.cos(angulo)*(y-y0);
        return new 
Punto (xgiradoygirado);
    }
    
    public 
IForma escalar (double k){ // No tiene sentido
        
return new Punto (x,y);
    }
    
    public 
Punto clonar (){
        return new 
Punto (x,y);
    }
    
    public 
String toString (){
        return 
"P["+x+", "+y+"]";
    }
    
    public 
void setColor (int code){
        
color code;
    }
    
    public 
int getColor (){
        return 
color;
    }
    
    public static 
void main (String []args){
        
    }


Clase Vector:
Código PHP:
package p5;

public class 
Vector implements IForma {
    private 
Punto origenextremo;
    
int color;
    
    public 
Vector (){
        
origen = new Punto();
        
extremo = new Punto (1,0);
    }
    
    public 
Vector (double xdouble y){
        
origen = new Punto (0,0);
        
extremo = new Punto (x,y);
    }
    
    public 
Vector (Punto a){
        
origen = new Punto (0,0);
        
extremo a.clonar();
    }
    
    public 
Vector (Punto aPunto b){
        
origen a.clonar();
        
extremo b.clonar();
    }
    
    public 
Vector (Punto adouble modulodouble angulo){
        
origen a.clonar();
         
double x a.getX()+Math.cos(Math.toRadians(angulo))*modulo;
        
double y a.getY()+Math.sin(Math.toRadians(angulo))*modulo;
        
extremo = new Punto (x,y);
    }

    public 
double getX() {
        return 
origen.getX();
    }

    public 
double getY() {
        return 
origen.getY();
    }

    public 
double getOrientacion() {
        return 
Math.toDegrees(Math.atan2(getCompY(),getCompX()));
    }

    public 
IForma girar(double gradosdouble xdouble y) {
        
Punto origen = (Puntothis.origen.girar(grados,x,y);
        
Punto extremo = (Puntothis.extremo.girar(grados,x,y);
        return new 
Vector (origen,extremo);
    }

    public 
IForma girar(double grados) {
        
Punto extremogirado = (Puntoextremo.girar(grados,origen.getX(),origen.getY());
        return new 
Vector(origen,extremogirado);
    }

    public 
IForma trasladar(double deltaXdouble deltaY) {
        
Punto a = new Punto (origen.getX()+deltaXorigen.getY()+deltaY);
        
Punto b = new Punto (extremo.getX()+deltaXextremo.getY()+deltaY);
        return new 
Vector(a,b);
    }

    public 
double distancia(double xdouble y) {
        return 
origen.distancia(xy);
    }

    public 
IForma escalar(double k) {
        return new 
Vector (origenmodulo()*k,getOrientacion());
    }
    
    public 
Vector clonar(){
        return new 
Vector (origenextremo);
    }
    
    public 
double getCompX(){
        return 
extremo.getX()-origen.getX();    
    }
    
    public 
double getCompY(){
        return 
extremo.getY()-origen.getY();    
    }
    
    public 
Punto getPuntoAplicacion(){
        return 
origen.clonar();
    }
    
    public 
Punto getExtremo(){
        return 
extremo.clonar();
    }
    
    public 
double modulo(){
        return 
Math.sqrt(getCompX()*getCompX()+getCompY()*getCompY());
    }
    
    public 
Vector getUnitario(){
        return new 
Vector(origen1getOrientacion());
    }
    
    public static 
Vector getUnitario(double gr){
        return new 
Vector(new Punto(), 1gr);
    }
    
    public 
String toString(){
        return 
"P["+origen.getX()+","+origen.getY()+"] E["+extremo.getX()+
                
","+extremo.getY()+"] |v|="+modulo()+", ang="+getOrientacion();
    }
    
    public 
void setColor(int code) {
        
color code;
    }
    
    public 
int getColor() {
        return 
color;
    }

    public static 
void main(String[] args) {

    }



Clase Triangulo Equilátero:
Código PHP:
package p5;

public class 
TrianguloEquilatero implements IFormaIPoligonoRegular {
    
Punto vertice1vertice2vertice3;
    
int color;
    
    public 
TrianguloEquilatero(){
        
double yvertice1 50*Math.tan(Math.toRadians(30));
        
vertice1 = new Punto (0,yvertice1);
        
vertice2 = (Puntovertice1.girar(120,0,0);
        
vertice3 = (Puntovertice2.girar(120,0,0);
    }
    
    public 
TrianguloEquilatero(double l){
        
double yvertice1 l*Math.tan(Math.toRadians(30));
        
vertice1 = new Punto (0,yvertice1);
        
vertice2 = (Puntovertice1.girar(120,0,0);
        
vertice3 = (Puntovertice2.girar(120,0,0);
    }
    
    public 
Punto[] getVertices() {
        
Punto vertices [] = {vertice1,vertice2,vertice3};
        return 
vertices;
    }

    public 
double getLado() {
        return 
vertice1.distancia(vertice2.getX(), vertice2.getY());
    }

    public 
void orientar(Vector v) {
        
double orientacion v.getOrientacion()-getOrientacion();
        
girar(orientacion,getCentro());
    }

    public 
void girar(double gradosPunto cdg) {
        
vertice1 = (Puntovertice1.girar(gradoscdg.getX(), cdg.getY());
        
vertice2 = (Puntovertice2.girar(gradoscdg.getX(), cdg.getY());
        
vertice3 = (Puntovertice3.girar(gradoscdg.getX(), cdg.getY());
    }


    public 
void trasladar(Vector v) {
        
vertice1 = (Puntovertice1.trasladar(v.getCompX(), v.getCompY());
        
vertice2 = (Puntovertice2.trasladar(v.getCompX(), v.getCompY());
        
vertice3 = (Puntovertice3.trasladar(v.getCompX(), v.getCompY());
    }

    public 
Punto getCentro() {
        
double x vertice1.getX()+vertice2.getX()+vertice3.getX();
        
double y vertice1.getY()+vertice2.getY()+vertice3.getY();
        return new 
Punto (x/3,y/3);
    }

    public 
Vector getUnitario() {
        
Vector a = new Vector (getCentro(),vertice1);
        return new 
Vector (getCentro(),1,a.getOrientacion());
    }

    public 
double getArea() {  
        
double h getLado()*Math.sin(Math.PI/3);
        return 
getLado()*h/2;
    }

    public 
double getPerimetro() {
        return 
3*getLado();
    }

    public 
void reset() {
        
Vector trasladar = new Vector (getCentro(),new Punto());
        
trasladar(trasladar);
    }

    public 
double getX() {
        return 
getCentro().getX();
    }

    public 
double getY() {
        return 
getCentro().getY();
    }

    public 
double getOrientacion() {
        return 
getUnitario().getOrientacion();
    }

    public 
IForma girar(double gradosdouble xdouble y) {
        
vertice1 = (Puntovertice1.girar(grados,x,y);
        
vertice2 = (Puntovertice2.girar(grados,x,y);
        
vertice3 = (Puntovertice3.girar(grados,x,y);
        return 
this;
    }

    public 
IForma girar(double grados) {
        
double x getX();
        
double y getY();
        
vertice1 = (Puntovertice1.girar(grados,x,y);
        
vertice2 = (Puntovertice2.girar(grados,x,y);
        
vertice3 = (Puntovertice3.girar(grados,x,y);
        return 
this;
    }

    public 
IForma trasladar(double deltaXdouble deltaY) {
        
vertice1 = (Puntovertice1.trasladar(deltaXdeltaY);
        
vertice2 = (Puntovertice2.trasladar(deltaXdeltaY);
        
vertice3 = (Puntovertice3.trasladar(deltaXdeltaY);
        return 
this;
    }

    public 
double distancia(double xdouble y) {
        return 
getCentro().distancia(xy);
    }

    public 
IForma escalar(double k) {
        
Punto centro getCentro();
        
Vector a = (Vector) new Vector (centro,vertice1).escalar(k);
        
vertice1 a.getExtremo();
        
vertice2 = (Puntovertice1.girar(120,centro.getX(),centro.getY());
        
vertice3 = (Puntovertice2.girar(120,centro.getX(),centro.getY());
        return 
this;
    }

    public 
void setColor(int code) {
        
color code;
    }

    public 
int getColor() {
        return 
color;
    }

    public 
String toString (){
        return 
"Triángulo --> C:P[" +getX()+ ", " +getY()+ "], L:" +getLado()+ 
                
", P[" vertice1.getX() +", " +vertice1.getY()+ "], P[" +vertice2.getX()+ ", " +vertice2.getY()+ 
                
"], P[" +vertice3.getX()+ ", " +vertice3.getY()+ "], theta = "+getOrientacion(); 
    }
    public static 
void main(String[] args) {

    }



Clase Gestor Formas:
Código PHP:
package p5;

/**
 * Gestiona formas geométricas que implementan la
 * interfaz IMovible.
 * 
 * @author Juan Ángel
 *
 */

public class GestorFormas {
    
    
/**
     * Identificadores de tipos de formas de objetos.
     */
    
public static final int FPrimeraForma   1;
    public static final 
int FPunto            1;
    public static final 
int FVector            2;
    public static final 
int FTriangulo        3;
    public static final 
int FCualquiera        4;
    public static final 
int FUltimaForma    4;

    
/**
     * Tamaños predeterminados
     */
    
public static final int Tiny =      1;
    public static final 
int Small =     2;
    public static final 
int Medium =     3;
    public static final 
int Large =     4;
    public static final 
int KingSize =  5;
    
    
/**
     * Máximo de objetos permitidos en el gestor.
     */
    
public static final int MaxFormas 18;
    public static final 
int LimiteFormasAlcanzado = -1;
    public static final 
int ArgumntoNulo = -2;

    
    private  
IForma [] misFormas = new IForma[MaxFormas];
    private  
int nroFormas 0;
    
    
/**
     * Añade un objeto al gestor si no se excede el máximo de objetos permitidos.
     * Cuando un objeto se añade al gestor decimos que está registrado en el gestor.
     * 
     * @param obj objeto añadido. obj debe ser distinto de null y no estar ya añadido.
     * @return número de objetos registrados contando con el añadido, 
     *         -1 si no se ha podido añadir la forma.        
     */
    
public int aniadirForma(IForma obj){
        if (
obj==null)
            return -
1;
        
int count 0;
        for (
int i=0i<misFormas.lengthi++){
            if (
misFormas[i]!=null)
                
count++;
        }
        if (
count == MaxFormas)
            return -
1;
        
IForma [] misFormashechas = new IForma[count+1];
        
count 0;
        for (
int i=0i<misFormas.lengthi++){
            if (
misFormas[i]!=null){
                
misFormashechas[count++]=misFormas[i];
            }
            if (
misFormas[i]==obj)
                return -
1;
        }
        
misFormashechas[count]=obj;
        
misFormas misFormashechas;
        return ++
nroFormas;
    }
    
    
/**
     * Elimina todos los objetos del gestor.
     */
    
public void resetFormas(){
        
misFormas = new IForma[0];
        
nroFormas 0;
    }
    
    
    
/**
     * Devuelve array con todos los objetos registrados en el gestor.
     * @return array con todos los objetos registrados en el gestor.
     */
    
public IForma [] getFormas (){
        
IForma[] misFormashechas = new IForma[misFormas.length];
        for (
int i=0i<misFormashechas.lengthi++)
            
misFormashechas[i] = misFormas[i];
        return 
misFormashechas;
    }
    
    
/**
     * Devuelve array con todos los puntos registrados en el gestor.
     * @return array con todos los puntos registrados en el gestor.
     */    
    
public Punto [] getPuntos(){
        
int count 0;
        for (
int i=0i<misFormas.lengthi++)
            if (
misFormas[i] instanceof Punto)
                
count++;
        
Punto [] misPuntos = new Punto [count];
        
count 0;
        for (
int i=0i<misFormas.lengthi++){
            if (
misFormas[i] instanceof Punto){
                
misPuntos[count] = (PuntomisFormas[i];
                
count++;
            }
        }
        return 
misPuntos;
    }
    
    
/**
     * Devuelve array con todos los vectores registrados en el gestor.
     * @return array con todos los vectores registrados en el gestor.
     */
    
public Vector [] getVectores(){
        
int count 0;
        for (
int i=0i<misFormas.lengthi++)
            if (
misFormas[i] instanceof Vector)
                
count++;
        
Vector [] misVectores = new Vector [count];
        
count 0;
        for (
int i=0i<misFormas.lengthi++){
            if (
misFormas[i] instanceof Vector)
                
misVectores[count++] = (VectormisFormas[i];
        }
        return 
misVectores;
    }
    
    
/**
     * Devuelve array con todos los triángulos registrados en el gestor.
     * @return array con todos los triángulos registrados en el gestor.
     */
    
public TrianguloEquilatero [] getTriangulos(){
        
int count 0;
        for (
int i=0i<misFormas.lengthi++)
            if (
misFormas[i] instanceof TrianguloEquilatero)
                
count++;
        
TrianguloEquilatero [] misTriangulos = new TrianguloEquilatero [count];
        
count 0;
        for (
int i=0i<misFormas.lengthi++){
            if (
misFormas[i] instanceof TrianguloEquilatero)
                
misTriangulos[count++] = (TrianguloEquilateromisFormas[i];
        }
        return 
misTriangulos;
    }
    
    
    
    
/**
     * Mueve el objeto obj al punto especificado.
     * Coloca el centro del objeto en el punto destino y lo 
     * orienta respecto del eje X según un determinado ángulo.
     * 
     * Si el objeto no está registrado no hace nada.
     * 
     * @param obj objeto a mover
     * @param destino punto destino del objeto.
     * @param orientacion angulo en grados de la figura con el eje X 
     */
    
public void moverA(IForma objPunto destinodouble orientacion){
        if (
obj instanceof Punto)
            
obj destino;
        if (
obj instanceof Vector)
            
obj = new Vector (destino, ((Vectorobj).modulo(), orientacion);
        if (
obj instanceof TrianguloEquilatero){
            
TrianguloEquilatero a = (TrianguloEquilateroobj;
            
Vector traslada = new Vector (a.getCentro(),destino);
            
Vector orienta = new Vector (new Punto(),1,orientacion);
            
a.trasladar(traslada);
            
a.orientar(orienta);
        }
    }
    
    
/**
     * Mueve todas las formas de un cierto tipo a un punto determinado.
     * Coloca todos los centros de las figuras en el punto destino y
     * las orienta de igual forma respecto del eje X.
     * 
     * @param tipoForma tipo de las formas a agrupar.
     * @param destino punto de agrupamiento.
     * @param orientacion angulo en grados de la figura con el eje X 
     */
    
public void agruparFormas(int tipoFormaPunto destinodouble orientacion){
        if (
tipoForma == FPunto){
            for (
int i=0i<getPuntos().lengthi++)
                
moverA(getVectores()[i],destino,orientacion);
        }
        if (
tipoForma == FVector){
            for (
int i=0i<getVectores().lengthi++)
                
moverA(getVectores()[i],destino,orientacion);
        }
        if (
tipoForma == FTriangulo){
            for (
int i=0i<getTriangulos().lengthi++){
                
moverA(getTriangulos()[i],destino,orientacion);
            }
        }
    }

    
    
/**
     * Devuelve una forma de un cierto tipo y tamaño colocada en el
     * origen de coordenadas y orientada según eje Y.
     * 
     * @param formaId Tipo de forma solicitada.
     * @param size tamaño según tamaños predefinidos en la clase.
     * 
     * @return forma generada.
     */
    
public static IForma getForma(int formaIdint size){
        if (
formaId == FPunto)
            return new 
Punto();
        if (
formaId == FVector){
            if (
size == Tiny)
                return new 
Vector (new Punto(),10,90);
            if (
size == Small)
                return new 
Vector (new Punto(),20,90);
            if (
size == Medium)
                return new 
Vector (new Punto(),30,90);
            if (
size == Large)
                return new 
Vector (new Punto(),40,90);
            if (
size == KingSize)
                return new 
Vector (new Punto(),50,90);
        }
        if (
formaId == FTriangulo){
            if (
size == Tiny)
                return new 
TrianguloEquilatero (10);
            if (
size == Small)
                return new 
TrianguloEquilatero (20);
            if (
size == Medium)
                return new 
TrianguloEquilatero (30);
            if (
size == Large)
                return new 
TrianguloEquilatero (40);
            if (
size == KingSize)
                return new 
TrianguloEquilatero (50);
        }
        return 
null;
    }


Aquí tenéis las clases para descargar por dropbox (subidas por mi):
Clase Punto:

[Para ver los enlaces debes registrate]

Clase Vector:

[Para ver los enlaces debes registrate]

Clase Triangulo Equilátero:

[Para ver los enlaces debes registrate]

Clase Gestor Formas:

[Para ver los enlaces debes registrate]


Comentad si os gusta y os sirve! Guiño

José Antonio Martín Martínez

Muy grande! Guiño
Buen trabajo.

¿Pero esto cuándo hay que subirlo?

Paco Sánchez

dios jesús, q dios te bendiga, q máquina! Sonrisa

Jesús Hernández Galián

(26-12-2012, 17:41)José Antonio Martín Martínez escribió:

[Para ver los enlaces debes registrate]

Muy grande! Guiño

(26-12-2012, 18:30)Paco Sánchez escribió:

[Para ver los enlaces debes registrate]

dios jesús, q dios te bendiga, q máquina! Sonrisa

Gracias! Guiño



(26-12-2012, 18:10)admin escribió:

[Para ver los enlaces debes registrate]

Buen trabajo.

¿Pero esto cuándo hay que subirlo?

Pues según el Aula Virtual hay que subirlo antes del día de Reyes (6 de Enero), pero lo mas seguro es que lo aplace un poco, porque esta práctica asalta muchas dudas...

Por cierto, Feliz Navidad a todos Guiño
Gran trabajo!

Gracias y felices fiestas Tímido

Enviado desde mi LG-P920 usando Tapatalk 2

José Antonio Martín Martínez

Dijo el profesor que iba a dejar hasta la última semana para poder subirlo.

Un saludo a todos!

Pablo Lucas

Genial Jesús!! Grandísimo aporte!! Se agradece mucho!! Gran sonrisa
Feliz Navidad a todos!

Paco Sánchez

(27-12-2012, 01:05)José Antonio Martín Martínez escribió:

[Para ver los enlaces debes registrate]

Dijo el profesor que iba a dejar hasta la última semana para poder subirlo.

Un saludo a todos!

Entonces sin problema, ya la subiré un día de estos xD

Feliz Navidad y Próspero Año Nuevo a todos!! Gran sonrisa

Juan Pablo Navarro Castillo

Muy buen trabajo si señor! Enhorabuena!!!!
Páginas: 1 2