编程练习:考古遗迹

 

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

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

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

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

输入

输入的第一行为一个正整数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

转载于:https://www.cnblogs.com/zhangqifire/p/5762057.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值