编程练习:考古遗迹


 

受到新考古发现的影响,小赛最近迷上了考古,帮助考古学家根据已有的发现推测古时的一些建筑结构设计。

最新某个区域中发现了古代祭祀场所的遗址,根据考古学者的研究,该遗址所在时代的祭祀场所通常设计为正多边形,但场所的大小和多边形角度因规模而异。多边形的每个角上设置有一个柱子,柱子之间通过绳子连接。

新近出土的遗址由于受到破坏的原因,只发现了三个柱子,其余的柱子则湮灭在历史的时间长河中。

根据已知的柱子坐标,考古学者请小赛帮忙计算祭祀场所可能的最小面积。

输入

输入的第一行为一个正整数T,表示有T组测试数据。每组测试数据有三行数据,每行为一个柱子的坐标,其绝对值不超过1000。坐标为浮点数表示,最多保留6位小数。

输出

对每组测试数据,在单独的一行里输出可能的最小面积,请保留6位小数。已知正多边形的角点数不超过100个。​

 

样例输入

1

0.000000 0.000000

1.000000 1.000000

0.000000 1.000000

 

 

样例输出

1.000000

我的解决方案如下,具体思路在注释里有。

 

#include"stdafx.h" #include<stdio.h> #include<string.h> #include<assert.h> #include<math.h> #include<algorithm> #include<iostream> #pragma warning(disable:4996) using namespace std; void fre() //输出重定向 { freopen("E:\\input.txt", "r", stdin); freopen("E:\\output.txt", "w", stdout); } double gcdx(double x, double y) //辗转相除法求最大公约数,精度为0.001,这里的精度取决于题目中具体n最大是多少,一般去1/n比较合适 //因为弧度PI/n,精度满足这个条件即可。  { while (fabs(x)>0.0001&&fabs(y)>0.0001) { if (x > y) { x = x - floor(x / y)*y; } else { y = y - floor(y / x)*x; } } return x + y; } double get_edge(double x1, double y1,double x2,double y2){ return sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2)); } int main() { double PI = 3.1415926; int T; double x1, y1, x2, y2, x3, y3; double a, b, c;//a,b,c 为三角形边长; double A, B, C;//三角形角度的弧度值 double r, S;//r 为三角形外接圆半径,S为三角形面积(用海伦公式求) double n;//正n边形 double Sn;//正n边形的面积 cin >> T; while(T>0){ cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3; a = get_edge(x1, y1, x2, y2); b = get_edge(x1, y1, x3, y3); c = get_edge(x2, y2, x3, y3); //三角形的角度公式cosA =(b2+c2-a2)/(2bc); A = acos((b*b + c*c - a*a) / (2 * b*c)); B = acos((a*a + c*c - b*b) / (2 * a*c)); C = acos((a*a + b*b - c*c) / (2 * a*b)); //求三角形的面积,用海伦公式求解面积 double p = (a + b + c) / 2; S = sqrt(p*(p - a)*(p - b)*(p - c)); r = a*b*c / 4 / S; double temp = gcdx(A, B); temp = gcdx(temp, C); //求多边形有多少条边,用360度除以每个圆心角的度数即可,而三角形对应的顶角是正多边形圆周角, //根据圆周角定理,一条弧所对圆周角等于它所对圆心角的一半,所以这里用PI除以temp n = PI / temp; Sn = (r*r / 2)*sin(2 * PI / n)*n;//三角形面积公式1/2 absin(A),n个三角形 T = T - 1; printf("%.6f\n", Sn); } return 0; }
View Code


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM