题意:
二维平面中,给定三个点,这三个点是正多边形的三个顶点,求正多边形最小的面积。
思路:
两对点分别求中垂线,相交点是多边形外接圆的圆心,圆心有了半径和角度也就有了,之后求一下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}]"; } }
标签:P2,p2,Ancient,double,Circus,Codeforces,p1,public,Math From: https://www.cnblogs.com/luobo67/p/16955570.html