import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Peterandsnowblower {
public static void main(String[] args)
{
MyScannerpeter sc=new MyScannerpeter();
int n=sc.nextInt();
double x=sc.nextInt();
double y=sc.nextInt();
Point p=new Point(x,y);
Point pt[]=new Point[n];
int i;
double R=0;
double r=Double.MAX_VALUE;
for(i=0;i<n;i++)
{
double s=sc.nextDouble();
double t=sc.nextDouble();
pt[i]=new Point(s,t);
}
for(i=0;i<n;i++)
{
R=Math.max(R, pt[i].distance(p));
int next=(i==n-1)?0:i+1;
r=Math.min(r,pt[i].shortd(pt[next],p));
}
double area=Math.PI*(R*R-r*r);
System.out.println(area);
}
static class Point
{
double x;
double y;
Point(double x,double y)
{
this.x=x;
this.y=y;
}
double distance(Point p)
{
double a=x-p.x;
double b=y-p.y;
return Math.sqrt(a*a+b*b);
}
Point diff(Point p)
{
return new Point(p.x-x,p.y-y);
}
double dot(Point p)
{
return x*p.x+y*p.y;
}
double cross(Point p)
{
return (x*p.y-y*p.x);
}
double shortd(Point next,Point p)
{
Point d=this.diff(next);
Point e=this.diff(p);
if(e.dot(d)<0){
return this.distance(p);
}
else if(next.diff(p).dot(d.multi())<0){
return next.distance(p);
}
else
{
return Math.abs(e.cross(d))/d.mag();
}
}
double mag()
{
return Math.sqrt(x*x+y*y);
}
Point multi()
{
return new Point(-x,-y);
}
}
}
class MyScannerpeter
{
BufferedReader br;
StringTokenizer st;
MyScannerpeter()
{
br=new BufferedReader(new InputStreamReader(System.in));
}
String next()
{
while(st==null || !st.hasMoreTokens())
{
try
{
st=new StringTokenizer(br.readLine());
}
catch(Exception e)
{
e.printStackTrace();
}
}
return st.nextToken();
}
int nextInt()
{
return Integer.parseInt(next());
}
long nextLong()
{
return Long.parseLong(next());
}
double nextDouble()
{
return Double.parseDouble(next());
}
String nextLine()
{
String str="";
try
{
str=br.readLine();
}
catch(Exception e)
{
e.printStackTrace();
}
return str;
}
}
Comments
Post a Comment