Ésta será la primera práctica donde usemos las excepciones.Aquí teneis el esquema:
La clase vector representa el vector que iría desde el origen de cordenadas (el punto (0,0) ) hasta el punto (o coordenadas del mismo) que le demos.
En el caso de la recta, podemos darle o bien dos puntos, o bien un punto y un vector.
Nota: Para los que no lo sepan, un vector es "una flecha" que posee módulo (longitud), dirección (sobre que recta está) y sentido (dirección a la que apunta). Para más información aquí teneis el link a la wiki.
Aquí os dejo el test para probar las clases ;)
public class TestRectas { public static void main(String[] args) { // Calcular el área del triángulo definido por sus tres vértices Punto p1 = new Punto(0,0); Punto p2 = new Punto(4,0); Punto p3 = new Punto(2,3); // Se calcula la distancia entre p1 y p2 double base = p1.distancia(p2); // Se calcula la recta que pasa por p1 y p2 Recta r1 = new Recta(p1,p2); // se calcula la distancia entre p3 y r1 double altura = r1.distanciaDesde(p3); // El area es base*altura/2 double area = base*altura/2; System.out.printf("Puntos %s %s %s\n",p1,p2,p3); System.out.println("Área = "+area); } }Y aquí tenéis las soluciones a las clases ;)
public class Recta { private Vector director; private Punto origen; public Recta(Vector v, Punto p) { director = v; origen = p; } public Recta(Punto p1, Punto p2) { Vector v = new Vector(p1, p2); director = v; origen = p1; } public Vector vector() {return director;} public Punto origen() {return origen;} public boolean pasaPor(Punto p) { Vector v = new Vector(origen, p); return director.paralelos(v); } public boolean paralelaA(Recta r) { return director.paralelos(r.vector()); } public Recta paralelaPor(Punto p) { Recta r = new Recta(director, p); return r; } public Recta perpendicularPor(Punto p) { Recta r; Vector v = director.ortogonal(); r = new Recta(v, p); return r; } public Punto interseccionCon(Recta r) { double d, d1, d2, x0, y0; Punto p; if (this.paralelaA(r)) { throw new RuntimeException("Rectas paralelas"); } d = director.componenteX() * r.vector().componenteY() - director.componenteY() * r.vector().componenteX(); if (d==0) { throw new RuntimeException("Rectas paralelas o coincidentes"); } d1 = director.componenteX() * origen.y() - director.componenteY() * origen.x(); d2 = r.vector().componenteX() * r.origen().y() - r.vector().componenteY() * r.origen().x(); x0 = (d1 * r.vector().componenteX() - director.componenteX() * d2)/d; y0 = -(director.componenteY() * d2 - r.vector().componenteY() * d1)/d; p = new Punto(x0, y0); return p; } public double distanciaDesde(Punto p) { Recta perp = this.perpendicularPor(p); Punto comun = this.interseccionCon(perp); return p.distancia(comun); } public String toString() { return "R("+director + ", " + origen + ")"; } }Y aquí la clase Vector.
public class Vector { private Punto extremo; public Vector(double x0, double y0) { extremo = new Punto(x0, y0); } public Vector(Punto pto) { extremo = pto; } public Vector(Punto inicio, Punto fin) { double x0, y0; x0 = fin.x() - inicio.x(); y0 = fin.y() - inicio.y(); extremo = new Punto(x0, y0); } public double componenteX() { return extremo.x(); } public double componenteY() { return extremo.y(); } public double modulo() { double sum = extremo.x()*extremo.x() + extremo.y()*extremo.y(); return Math.sqrt(sum); } public Vector ortogonal() { double x,y; Vector ort; x = extremo.x(); y = extremo.y(); ort = new Vector(-y, x); return ort; } public boolean paralelos(Vector v) { double xExt, yExt, xV, yV; xExt = extremo.x(); yExt = extremo.y(); xV = v.componenteX(); yV = v.componenteY(); return (xExt*yV == yExt*xV); } public Punto extremoDesde(Punto pto) { double x0, y0, x, y; Punto p; x0 = extremo.x(); y0 = extremo.y(); x = x0 + pto.x(); y = y0 + pto.y(); p = new Punto(x,y); return p; } public String toString() { return "V("+extremo.x()+","+extremo.y()+")"; } }
y la clase Punto?..
ResponderEliminarhttp://resolviendoejerciciosdeprogramacion.blogspot.com.es/2014/02/practica-de-herencia-con-punto-circulo.html
EliminarSaludos ;)