record Point(int x, int y) {}
abstract sealed class Shape permits Circle, Rectangle, Triangle {   
  protected final Point[] points;
 
  Shape(int edges) {
     this.points = new Point[edges];
  }  
  Shape(Point... points) {
     this.points = points;
  }
  public int getEdges() {
     return this.points.length;
  }
 
  protected abstract double area();
  protected abstract double perimeter();
}
final class Circle extends Shape {  
  private final int radius;
  Circle() {
    super(1);
    this.radius = 1;
  }  
  Circle(Point center, int radius) {
    super(center);
    this.radius = radius;
  }    
  
  public int getRadius() {
    return radius;
  }
    
  public Point getCenter() {
    return points[0];   
  }
  @Override
  public double area() {
      return Math.PI * (radius * radius);
  } 
  @Override
  public double perimeter() {
    return Math.PI * 2*radius;
  } 
}
final class Rectangle extends Shape {  
  private int width, height; 
  Rectangle(int width, int height) {
    super(1);
    this.width = width;
    this.height = height;
  }  
  Rectangle(Point upperLeft, int width, int height) {
    super(upperLeft);
    this.width = width;
    this.height = height;
  }
  
  public int getWidth() {
    return width;
  }
  
  public int getHeight() {
    return height;
  }
  @Override
  public double area() {
      return width * height;
  } 
  
  @Override
  public double perimeter() {
    return 2*width + 2*height;
  }  
}
final class Triangle extends Shape {
    Triangle(Point... points) {
        super(points);
    }
    public Point[] getPoints() {
        return points;
    }
    
    // see https://tinyurl.com/msfdtjme
    private double length(Point p1, Point p2) {
        return Math.sqrt((p2.x() - p1.x()) * (p2.x() - p1.x()) + (p2.y() - p1.y()) * (p2.y() - p1.y()));
    }
    
    // see https://www.ypologismos.gr/emvadon-trigonou-xerontas-3-pleyres-typos-hrona/
    @Override
    public double area() {
        double s = perimeter()/2;
        double a = length(points[0], points[1]);
        double b = length(points[1], points[2]);
        double c = length(points[2], points[0]);
        return Math.sqrt(s*(s-a)*(s-b)*(s-c));
    }
    // https://www.ypologismos.gr/emvadon-trigonou-xerontas-3-pleyres-typos-hrona/
    @Override
    public double perimeter() {
        return length(points[0], points[1]) + length(points[1], points[2]) + length(points[2], points[0]);
    }
}
public class Main {  
  public static void main(String[] args) {
	Shape c = new Circle(new Point(10, 10), 10);
	System.out.println(c.perimeter());
	System.out.println(c.area());
	
	Shape r = new Rectangle(new Point(0, 0), 10, 10);
	System.out.println(r.perimeter());
	System.out.println(r.area());
	
	Shape t = new Triangle(new Point(0, 0), new Point(10, 10), new Point(-10, -10));
	System.out.println(t.perimeter());
	System.out.println(t.area());
	
  }
}