/* "has-a" -> "composition"
 *
 * a LineSegment has two Points, i.e., is composed of two Points */
public class LineSegment {
  private Point p1;
  private Point p2;

  public LineSegment() {
    p1 = new Point();
    p2 = new Point();
  }

  public LineSegment(int x1, int y1, int x2, int y2) {
    p1 = new Point(x1, y1);
    p2 = new Point(x2, y2);
  }

  public LineSegment(Point startPoint, Point endPoint) {
    p1 = new Point(startPoint);
    p2 = new Point(endPoint);
  }

  public LineSegment(LineSegment other) {
    p1 = new Point(other.p1);
    p2 = new Point(other.p2);
  }

  public Point getP1() { return p1.clone(); }
  public Point getP2() { return p2.clone(); }

  public void move(int dx, int dy) {
    p1.move(dx, dy);
    p2.move(dx, dy);
  }

  public double length() {
    int dx = p2.getX() - p1.getX();
    int dy = p2.getY() - p1.getY();
    return Math.sqrt(dx * dx + dy * dy);
  }

  public boolean equals(LineSegment other) {
    return (p1.equals(other.p1) && p2.equals(other.p2)) ||
        (p1.equals(other.p2) && p2.equals(other.p1));
  }

  public String toString() {
    return p1 + " -> " + p2;
  }
}
