@Override
  public FGEArea intersect(FGEArea area) {
    if (area.containsArea(this)) {
      return this.clone();
    }
    if (containsArea(area)) {
      return area.clone();
    }
    if (area instanceof FGEAbstractLine) {
      return computeLineIntersection((FGEAbstractLine) area);
    }
    if (area instanceof FGERoundRectangle) {
      return computeRectangleIntersection((FGERoundRectangle) area);
    }
    if (area instanceof FGEHalfPlane) {
      return computeHalfPlaneIntersection((FGEHalfPlane) area);
    }

    FGEIntersectionArea returned = new FGEIntersectionArea(this, area);
    if (returned.isDevelopable()) {
      return returned.makeDevelopped();
    } else {
      return returned;
    }
  }
  @Override
  public FGEArea union(FGEArea area) {
    if (containsArea(area)) {
      return clone();
    }
    if (area.containsArea(this)) {
      return area.clone();
    }

    return new FGEUnionArea(this, area);
  }