计算几何 - Circum Triangle - UVA 11186
题意:
给 定 一 个 圆 心 在 ( 0 , 0 ) , 半 径 为 r 的 圆 , 给定一个圆心在(0,0),半径为r的圆, 给定一个圆心在(0,0),半径为r的圆,
圆 上 有 n 个 点 , 给 出 这 n 个 圆 上 的 点 的 极 角 , 圆上有n个点,给出这n个圆上的点的极角, 圆上有n个点,给出这n个圆上的点的极角,
从 这 n 个 点 中 任 选 3 个 点 构 成 三 角 形 , 对 这 些 三 角 形 的 面 积 求 和 。 从这n个点中任选3个点构成三角形,对这些三角形的面积求和。 从这n个点中任选3个点构成三角形,对这些三角形的面积求和。
输入:
多 组 测 试 数 据 , 多组测试数据, 多组测试数据,
每 组 测 试 数 据 包 括 两 个 正 整 数 n 和 r , 分 别 表 示 点 的 个 数 和 圆 的 半 径 。 每组测试数据包括两个正整数n和r,分别表示点的个数和圆的半径。 每组测试数据包括两个正整数n和r,分别表示点的个数和圆的半径。
接 着 n 行 包 括 n 个 点 的 极 角 度 数 。 接着n行包括n个点的极角度数。 接着n行包括n个点的极角度数。
输出:
一 个 浮 点 数 , 表 示 答 案 , 四 舍 五 入 到 整 数 部 分 。 一个浮点数,表示答案,四舍五入到整数部分。 一个浮点数,表示答案,四舍五入到整数部分。
Sample Input
5 10
10.00
100.00
300.00
310.00
320.00
3 20
10.00
100.00
300.00
0 0
Sample Output
286
320
数据范围:
0 ≤ N ≤ 500 , 0 < R ≤ 100. 0 ≤ N ≤ 500,0 < R ≤ 100. 0≤N≤500,0<R≤100.
Time limit:3000 ms
分析:
本 题 数 据 范 围 给 到 500 , 可 以 用 O ( n 3 ) 通 过 。 本题数据范围给到500,可以用O(n^3)通过。 本题数据范围给到500,可以用O(n3)通过。
先 将 所 有 点 转 化 为 直 角 坐 标 , 然 后 枚 举 三 个 顶 点 , 用 叉 积 计 算 面 积 再 求 和 。 先将所有点转化为直角坐标,然后枚举三个顶点,用叉积计算面积再求和。 先将所有点转化为直角坐标,然后枚举三个顶点,用叉积计算面积再求和。
注意:
四 舍 五 入 的 两 种 方 法 : 四舍五入的两种方法: 四舍五入的两种方法:
① 、 给 浮 点 数 + 0.5 再 强 转 为 整 型 数 。 ①、给浮点数+0.5再强转为整型数。 ①、给浮点数+0.5再强转为整型数。
② 、 直 接 输 出 % . 0 l f , 自 动 四 舍 五 入 。 ②、直接输出\%.0lf,自动四舍五入。 ②、直接输出%.0lf,自动四舍五入。
由 于 精 度 问 题 , 这 里 采 用 ② 。 由于精度问题,这里采用②。 由于精度问题,这里采用②。
代码:
#include<cstring>
#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
const double eps=1e-5;
const double pi=acos(-1.0);
struct Point
{
double x,y;
Point(double x=0,double y=0) : x(x), y(y) {}
};
//点与向量
typedef Point Vector;
Vector operator + (Vector A,Vector B) { return Vector(A.x+B.x,A.y+B.y); }
Vector operator - (Point A,Point B) { return Vector(A.x-B.x,A.y-B.y); }
Vector operator * (Vector A,double p) { return Vector(A.x*p,A.y*p); }
Vector operator / (Vector A,double p) { return Vector(A.x/p,A.y/p); }
double Cross(Vector A, Vector B) { return A.x*B.y - A.y*B.x; } //若A到B逆时针则为正,否则为负
double Area2(Point A,Point B,Point C) { return fabs(Cross(B-A,C-A)); } //三角形ABC的面积的两倍(有方向)
double angle(Vector v) { return atan2(v.y,v.x); } //arctan(y/x)
double torad(double x)
{
return pi*x/180.0;
}
int n,r;
double th;
Point V[510];
int main()
{
while(scanf("%d%d",&n,&r),n&&r)
{
for(int i=0;i<n;i++)
{
scanf("%lf",&th);
th=torad(th);
V[i].x=r*cos(th);
V[i].y=r*sin(th);
}
double res=0;
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
for(int k=j+1;k<n;k++)
res+=Area2(V[i],V[j],V[k]);
printf("%.0lf\n",res/2.0);
}
return 0;
}