计算几何 - Circum Triangle - UVA 11186

计算几何 - Circum Triangle - UVA 11186

题意:

给 定 一 个 圆 心 在 ( 0 , 0 ) , 半 径 为 r 的 圆 , 给定一个圆心在(0,0),半径为r的圆, (0,0)r

圆 上 有 n 个 点 , 给 出 这 n 个 圆 上 的 点 的 极 角 , 圆上有n个点,给出这n个圆上的点的极角, nn

从 这 n 个 点 中 任 选 3 个 点 构 成 三 角 形 , 对 这 些 三 角 形 的 面 积 求 和 。 从这n个点中任选3个点构成三角形,对这些三角形的面积求和。 n3

输入:

多 组 测 试 数 据 , 多组测试数据,

每 组 测 试 数 据 包 括 两 个 正 整 数 n 和 r , 分 别 表 示 点 的 个 数 和 圆 的 半 径 。 每组测试数据包括两个正整数n和r,分别表示点的个数和圆的半径。 nr

接 着 n 行 包 括 n 个 点 的 极 角 度 数 。 接着n行包括n个点的极角度数。 nn

输出:

一 个 浮 点 数 , 表 示 答 案 , 四 舍 五 入 到 整 数 部 分 。 一个浮点数,表示答案,四舍五入到整数部分。

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. 0N5000<R100.

Time limit:3000 ms


分析:

本 题 数 据 范 围 给 到 500 , 可 以 用 O ( n 3 ) 通 过 。 本题数据范围给到500,可以用O(n^3)通过。 500O(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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值