25-12-2012, 22:14
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
Clase Punto:
Clase Vector:
Clase Triangulo Equilátero:
Clase Gestor Formas:
Aquí tenéis las clases para descargar por dropbox (subidas por mi):
Clase Punto:
Comentad si os gusta y os sirve!
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
Clase Punto:
Código PHP:
package p5;
public class Punto implements IForma{
double x, y;
int color;
public Punto (){
}
public Punto (double x, double 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 x, double y){
return Math.sqrt((this.x-x)*(this.x-x)+(this.y-y)*(this.y-y));
}
public IForma trasladar (double dx, double dy){
return new Punto (x+dx, y+dy);
}
public IForma girar (double grados){
return new Punto (x,y);
}
public IForma girar (double grados, double x0, double 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 (xgirado, ygirado);
}
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 origen, extremo;
int color;
public Vector (){
origen = new Punto();
extremo = new Punto (1,0);
}
public Vector (double x, double 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 a, Punto b){
origen = a.clonar();
extremo = b.clonar();
}
public Vector (Punto a, double modulo, double 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 grados, double x, double y) {
Punto origen = (Punto) this.origen.girar(grados,x,y);
Punto extremo = (Punto) this.extremo.girar(grados,x,y);
return new Vector (origen,extremo);
}
public IForma girar(double grados) {
Punto extremogirado = (Punto) extremo.girar(grados,origen.getX(),origen.getY());
return new Vector(origen,extremogirado);
}
public IForma trasladar(double deltaX, double deltaY) {
Punto a = new Punto (origen.getX()+deltaX, origen.getY()+deltaY);
Punto b = new Punto (extremo.getX()+deltaX, extremo.getY()+deltaY);
return new Vector(a,b);
}
public double distancia(double x, double y) {
return origen.distancia(x, y);
}
public IForma escalar(double k) {
return new Vector (origen, modulo()*k,getOrientacion());
}
public Vector clonar(){
return new Vector (origen, extremo);
}
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(origen, 1, getOrientacion());
}
public static Vector getUnitario(double gr){
return new Vector(new Punto(), 1, gr);
}
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 IForma, IPoligonoRegular {
Punto vertice1, vertice2, vertice3;
int color;
public TrianguloEquilatero(){
double yvertice1 = 50*Math.tan(Math.toRadians(30));
vertice1 = new Punto (0,yvertice1);
vertice2 = (Punto) vertice1.girar(120,0,0);
vertice3 = (Punto) vertice2.girar(120,0,0);
}
public TrianguloEquilatero(double l){
double yvertice1 = l*Math.tan(Math.toRadians(30));
vertice1 = new Punto (0,yvertice1);
vertice2 = (Punto) vertice1.girar(120,0,0);
vertice3 = (Punto) vertice2.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 grados, Punto cdg) {
vertice1 = (Punto) vertice1.girar(grados, cdg.getX(), cdg.getY());
vertice2 = (Punto) vertice2.girar(grados, cdg.getX(), cdg.getY());
vertice3 = (Punto) vertice3.girar(grados, cdg.getX(), cdg.getY());
}
public void trasladar(Vector v) {
vertice1 = (Punto) vertice1.trasladar(v.getCompX(), v.getCompY());
vertice2 = (Punto) vertice2.trasladar(v.getCompX(), v.getCompY());
vertice3 = (Punto) vertice3.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 grados, double x, double y) {
vertice1 = (Punto) vertice1.girar(grados,x,y);
vertice2 = (Punto) vertice2.girar(grados,x,y);
vertice3 = (Punto) vertice3.girar(grados,x,y);
return this;
}
public IForma girar(double grados) {
double x = getX();
double y = getY();
vertice1 = (Punto) vertice1.girar(grados,x,y);
vertice2 = (Punto) vertice2.girar(grados,x,y);
vertice3 = (Punto) vertice3.girar(grados,x,y);
return this;
}
public IForma trasladar(double deltaX, double deltaY) {
vertice1 = (Punto) vertice1.trasladar(deltaX, deltaY);
vertice2 = (Punto) vertice2.trasladar(deltaX, deltaY);
vertice3 = (Punto) vertice3.trasladar(deltaX, deltaY);
return this;
}
public double distancia(double x, double y) {
return getCentro().distancia(x, y);
}
public IForma escalar(double k) {
Punto centro = getCentro();
Vector a = (Vector) new Vector (centro,vertice1).escalar(k);
vertice1 = a.getExtremo();
vertice2 = (Punto) vertice1.girar(120,centro.getX(),centro.getY());
vertice3 = (Punto) vertice2.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=0; i<misFormas.length; i++){
if (misFormas[i]!=null)
count++;
}
if (count == MaxFormas)
return -1;
IForma [] misFormashechas = new IForma[count+1];
count = 0;
for (int i=0; i<misFormas.length; i++){
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=0; i<misFormashechas.length; i++)
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=0; i<misFormas.length; i++)
if (misFormas[i] instanceof Punto)
count++;
Punto [] misPuntos = new Punto [count];
count = 0;
for (int i=0; i<misFormas.length; i++){
if (misFormas[i] instanceof Punto){
misPuntos[count] = (Punto) misFormas[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=0; i<misFormas.length; i++)
if (misFormas[i] instanceof Vector)
count++;
Vector [] misVectores = new Vector [count];
count = 0;
for (int i=0; i<misFormas.length; i++){
if (misFormas[i] instanceof Vector)
misVectores[count++] = (Vector) misFormas[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=0; i<misFormas.length; i++)
if (misFormas[i] instanceof TrianguloEquilatero)
count++;
TrianguloEquilatero [] misTriangulos = new TrianguloEquilatero [count];
count = 0;
for (int i=0; i<misFormas.length; i++){
if (misFormas[i] instanceof TrianguloEquilatero)
misTriangulos[count++] = (TrianguloEquilatero) misFormas[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 obj, Punto destino, double orientacion){
if (obj instanceof Punto)
obj = destino;
if (obj instanceof Vector)
obj = new Vector (destino, ((Vector) obj).modulo(), orientacion);
if (obj instanceof TrianguloEquilatero){
TrianguloEquilatero a = (TrianguloEquilatero) obj;
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 tipoForma, Punto destino, double orientacion){
if (tipoForma == FPunto){
for (int i=0; i<getPuntos().length; i++)
moverA(getVectores()[i],destino,orientacion);
}
if (tipoForma == FVector){
for (int i=0; i<getVectores().length; i++)
moverA(getVectores()[i],destino,orientacion);
}
if (tipoForma == FTriangulo){
for (int i=0; i<getTriangulos().length; i++){
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 formaId, int 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!