码迷,mamicode.com
首页 > 其他好文 > 详细

7-8 对称图形的面积 (25分)

时间:2020-01-19 23:49:26      阅读:92      评论:0      收藏:0      [点我收藏+]

标签:pac   mat   pts   +=   cin   algorithm   排序   曲线   name   

二维平面坐标系上有一些散乱点,首先需要根据点的y坐标值将散乱点排序,之后将点连接成一条开放的多边形曲线。 给定一条和Y轴平行的旋转轴x=x?0??,此时将多边形曲线按旋转轴x = x?0??做镜像,并在最底端和最高端的原始点和镜像点之间连接两条线段,从而构成一个封闭的对称图形,请你计算该图形的面积。对称轴的x?0??坐标值要么大于所有散乱点的x坐标值,要么小于所有点的x坐标,因此该对称图形不存在自交现象。题目保证所有散乱点的y坐标值都不相同。

输入格式:

第一行给出平行于y轴的旋转轴的x坐标x?0??,第二行给出正整数n (2≤ n ≤10?4??),表示散乱点个数,随后n行给出散乱点的x和y坐标。

输出格式:

输出该对称图形的面积,保留2位小数。

输入样例:

例如输入1:

3.0
2
-1.5 1.5
1.5 -1.5

输出:

18.00

例如输入2:

-10.25
5
-1.5 1.5
-1.5 4.5
1.5 -1.5
10.5 -11.5
21.52 20.5

输出:

1087.32
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
#define N 10000
struct vi
{
    double x;
    double y;
};
bool cmp(vi a, vi b)
{
    return a.y > b.y;
}
int main()
{
    double x0, x, y, s = 0, flag=-1;
    int n;
    cin >> x0 >> n;
    vi v[N];
    for (int i = 0; i < n; i++)
    {
        cin >> x >> y;
        v[i].x = x;
        v[i].y = y;
        if (x > x0)
            flag = 1;
    }
    sort(v, v + n, cmp);
    for (int i = 0; i < n-1; i++)
    {
        if (flag==-1)
             s+= ((x0 - v[i].x) + (x0 - v[i+1].x))*(v[i].y - v[i+1].y) / 2;
        else
             s += ((v[i].x -x0) + (v[i+1].x -x0))*(v[i].y - v[i+1].y) / 2;
    }
    s = 2 * s;
    printf("%.02f", s);
}

7-8 对称图形的面积 (25分)

标签:pac   mat   pts   +=   cin   algorithm   排序   曲线   name   

原文地址:https://www.cnblogs.com/luoyoooo/p/12215801.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!