Codeforces 1 C. Ancient Berland Circus

题意:

二维平面中,给定三个点,这三个点是正多边形的三个顶点,求正多边形最小的面积。

思路:

两对点分别求中垂线,相交点是多边形外接圆的圆心,圆心有了半径和角度也就有了,之后求一下gcd,再算一下多边形面积。

 

 

C# 10 .net6 代码

List<double> a = new();
List<double> b = new();
for (int i = 0; i < 3; i++)
{
    List<double> c = new();
    Console.ReadLine()!.Split(' ').ToList().ForEach(x => c.Add(double.Parse(x)));
    a.Add(c[0]);
    b.Add(c[1]);
}

P2 v0 = new P2(a[0], b[0]);
P2 v1 = new P2(a[1], b[1]);
P2 v2 = new P2(a[2], b[2]);

P2 o = P2.Intersection(
    (v0 + v1) * 0.5,
    (v0 + v1) * 0.5 + (v0 - v1).Normal(),
    (v2 + v1) * 0.5,
    (v2 + v1) * 0.5 + (v2 - v1).Normal());

double r = P2.Distance(v0, o);

List<double> th = new();
th.Add((v0 - o).Polar());
th.Add((v1 - o).Polar());
th.Add((v2 - o).Polar());

double Gcd(double x, double y, double eps = 1e-2)
{
    while (Math.Abs(x) > eps && Math.Abs(y) > eps)
    {
        if (x > y)
        {
            x -= Math.Floor(x / y) * y;
        }
        else
        {
            y -= Math.Floor(y / x) * x;
        }
    }

    return x + y;
}
double g = Gcd(Math.Abs(th[1] - th[0]), Math.PI * 2);
g = Gcd(g, Math.Abs(th[2] - th[0]));
g = Gcd(g, Math.Abs(th[2] - th[1]));
double n = Math.Round((2 * Math.PI) / g);
g = 2 * Math.PI / n;
Console.WriteLine(Math.PI * r * r * Math.Sin(g) / g);

struct P2
{
    double x, y;
    public P2()
    {
        x = 0;
        y = 0;
    }

    public P2(double x, double y)
    {
        this.x = x;
        this.y = y;
    }

    public static P2 operator +(P2 p1, P2 p2)
    {
        return new P2(p1.x + p2.x, p1.y + p2.y);
    }

    public static P2 operator -(P2 p1, P2 p2)
    {
        return new P2(p1.x - p2.x, p1.y - p2.y);
    }

    public static P2 operator *(P2 p, double k)
    {
        return new P2(p.x * k, p.y * k);
    }

    public static double Distance(P2 p1, P2 p2)
    {
        return Math.Sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
    }

    public static P2 Intersection(P2 p1, P2 p2, P2 q1, P2 q2)
    {
        return p1 + (p2 - p1) * (((q2 - q1).Det(q1 - p1)) / ((q2 - q1).Det(p2 - p1)));
    }

    public P2 Normal()
    {
        return new P2(y, -x);
    }

    public double Dot(P2 p)
    {
        return x * p.x + y * p.y;
    }

    public double Det(P2 p)
    {
        return x * p.y - p.x * y;
    }

    public double Polar()
    {
        return Math.Atan2(y, x);
    }

    public override string ToString()
    {
        return $"[{x},{y}]";
    }
}

 

posted on 2022-12-06 15:55  luobo67  阅读(26)  评论(0)    收藏  举报

导航