E. Coin Tossing 第八届北京邮电大学程序设计竞赛 - 热身赛 (2)

时间限制 1000 ms 内存限制 65536 KB

题目描述

Little smart QiQi is fond of coin tossing. This day, he came to a huge field, where there's a irregular convex swamp within. Little smart QiQi didn’t want to toss the coin into the swamp, and thus, she needed to know the area of this convex. Please help her.

输入格式

The input contains several test cases, ended with EOF. In each test case, an integer N(3≤N≤100) exists first, indicating the number of vertex. The following N lines give the coordinates(x,y) of each vertex.(−106≤x,y≤106), x and y are real numbers.

输出格式

Output the area of each convex. The answer should be corrected to 1 decimal places.

输入样例

3
-1 0
0 1
1 1

输出样例

0.5

思路:计算多边形最低点 -》 将多边形移动到最低点刚好为原点 -》 计算各个顶点和原点连线的cos值,最低点赋特殊值(10)-》所有顶点按照cos值排序-》依次计算相临两点与最低点形成的三角形的面积(公式:s = 1/2*跟号下(p(p-a)(p-b)(p-c))(其中:abc是三角形三条边))-》 将所有的这样的三角形面积相加即得到凸多边形的面积

#include <iostream>
#include <vector>
#include <algorithm>
#include <math.h>
#include <stdlib.h>
using namespace std;

struct node {
    double x;
    double y;
    double cos;
};
//移动多边形
void move(vector<node> &org)
{
    double xx = org[0].x;
    double yy = org[0].y;
    for (int i = 0; i < org.size(); ++i) {
        if (org[i].y < yy) {
            yy = org[i].y;
            xx = org[i].x;
        }
    }
    for (int j = 0; j < org.size(); ++j) {
        org[j].x -= xx;
        org[j].y -= yy;
    }
    cout << "move up " << endl;
    for (int j = 0; j < org.size(); ++j) {
        cout << org[j].x << " " << org[j].y << endl;
    }
}
//排序比较规则
bool comp(const node &s1, const node &s2)
{
    return s1.cos < s2.cos;
}
void countCosAndSort(vector<node> &org)
{
    for (int i = 0; i < org.size(); ++i) {
        if ((org[i].y < 0.000001 || org[i].y > -0.000001) &&
             (org[i].x < 0.000001 || org[i].x > -0.000001)) {
            org[i].cos = 10;
            continue;
        }
        double d = sqrt(org[i].x * org[i].x + org[i].y * org[i].y);
        org[i].cos = org[i].x / d;
    }
    sort(org.begin(), org.end(), comp);
    cout << "after sort" << endl;
    for (int i = 0; i < org.size(); ++i) {
        cout << org[i].x << " " << org[i].y << endl;
    }
}
//计算单个三角形面积
double singleArea(node &n1, node &n2)
{
    double len1, len2, len3;
    len1 = sqrt(n1.x * n1.x + n1.y * n1.y);
    len2 = sqrt(n2.x * n2.x + n2.y * n2.y);
    len3 = sqrt((n2.x-n1.x)*(n2.x-n1.x) + (n2.y-n1.y)*(n2.y-n1.y));
    double p = (len1+len2+len3)/2;
    double s = sqrt(p*(p-len1)*(p-len2)*(p-len3));
    return s;
}

//计算多边形面积
double sunArea(vector<node> &org)
{
    move(org);
    countCosAndSort(org);
    double sumA = 0;
    for (int i = 0; i < org.size()-1; ++i) {
        sumA += singleArea(org[i], org[i+1]);
    }
    return sumA;
}

int main()
{
    int t;
    cin >> t;
    vector<node> data;
    node tmp;
    double xx, yy;
    for (int i = 0; i < t; ++i) {
        cin >> xx >> yy;
        tmp.x = xx;
        tmp.y = yy;
        data.push_back(tmp);
    }
    cout << sunArea(data) << endl;

return 0;
}

转载于:https://www.cnblogs.com/candycloud/p/3591818.html

计算给定坐标系和各个定点坐标的凸多边形的面积相关推荐

  1. 采用成员函数和友元函数计算给定两个坐标点之间的距离

    设计一个用来表示直角坐标系的Location类,在主程序中创建类Location的两个对象A和B,要求A的坐标点在第3象限,B的坐标点在第2象限,分别采用成员函数和友元函数计算给定两个坐标点之间的距离 ...

  2. python给定两个框的坐标,计算IoU以及IoM

    给定两个框的坐标,计算IoU以及IoM. 1.计算IoU 交并比(Intersection-over-Union,IoU),目标检测中使用的一个概念,是产生的候选框(candidate bound)与 ...

  3. 指针法算中点坐标c语言,C语言:利用指针编写程序,用梯形法计算给定的定积分实例...

    题目要求 利用指针编写程序,用梯形法计算下列公式中的定积分: 参考代码 首先说明一下指针的用处:因为所传递的参数均为数字,并不需要使用指针提高效率,故这里使用指针指向函数. 请注意calc()函数中的 ...

  4. 给定点坐标求多边形面积模板

    给定点坐标求多边形面积模板 方法:利用向量叉积求三角形面积的方法,把多边形分割成若干个三角形,然后求和得到多边形面积,计算时需要注意,给定的点的顺序必须是逆时针或者顺时针. 逆时针的方向是叉积的正方向 ...

  5. gps两点距离 php,PHP应用:PHP计算百度地图两个GPS坐标之间距离的方法

    <PHP应用:PHP计算百度地图两个GPS坐标之间距离的方法>要点: 本文介绍了PHP应用:PHP计算百度地图两个GPS坐标之间距离的方法,希望对您有用.如果有疑问,可以联系我们. 本文实 ...

  6. php 地图 距离,PHP计算百度地图两个GPS坐标之间距离的方法

    这篇文章主要介绍了PHP计算百度地图两个GPS坐标之间距离的方法,是针对百度地图接口开发的典型应用,需要的朋友可以参考下 本文实例讲述了PHP计算百度地图两个GPS坐标之间距离的方法.分享给大家供大家 ...

  7. html鼠标各种坐标,HTML坐标系与鼠标事件坐标

    HTML坐标系与鼠标事件坐标 在开发中处理鼠标事件时,经常会碰到 offset.scroll.client 这几个关键字,每次处理页面元素的坐标和偏移前,都要网上去搜资料,还会踩一些坑,影响开发效率. ...

  8. c语言在平面直角坐标系中,给定一个圆的圆心坐标Ox,Oy以及半径R,在再给定一个点的坐标PX,Py,请判断这个点与圆的位置关系。

    在平面直角坐标系中,给定一个圆的圆心坐标Ox,Oy以及半径R,在再给定一个点的坐标PX,Py,请判断这个点与圆的位置关系. 输入格式: 先输入三个正整数,分别代表圆心的横纵坐标x,Oy和半径R. 在输 ...

  9. 15电赛b题风力摆小记:陀螺仪计算激光点在大地坐标系下坐标

    加速度计计算激光点在大地坐标系下坐标 最近在做风力摆题目,我们想着求解激光点坐标.有两种方案: 利用摄像头做传感器,将摄像头放在坐标纸旁边,然后透视变换即可得到激光坐标. 利用陀螺仪解算. 因为不熟悉 ...

  10. python求13号是星期几的次数_Python简单计算给定某一年的某一天是星期几示例

    本文实例讲述了Python简单计算给定某一年的某一天是星期几.分享给大家供大家参考,具体如下: # -*- coding:utf-8 -*- #计算某特定天使星期几 #蔡勒公式:w=y+[y/4]+[ ...

最新文章

  1. 自动色阶、对比度、直方图均衡等算法的一些小改进
  2. ubuntu-14.04 系统安装mysql-5.6.21
  3. android 向左滑动动画,Android中的滑动动画
  4. 数数题(计数类 DP)做题记录
  5. android 活动传递数据,如何在Android应用程序的“活动”之间传递数据?
  6. Python中 文件处理
  7. 20.QT-Qpixmap实现图片鼠标缩放,鼠标拖动示例(详解)
  8. 他面前有一个人,有一把刀
  9. SpringBoot 修改仓库
  10. 利用ArcGIS Python批量拼接遥感影像(arcpy batch processing)
  11. 读书印记 - 《批判性思维工具》
  12. 20162314 《Program Design Data Structures》Learning Summary Of The Eighth Week
  13. ssm毕设项目班级网站45nk3(java+VUE+Mybatis+Maven+Mysql+sprnig)
  14. 工业和信息化部关于印发贯彻落实《国务院关于积极推进“互联网+”行动的指导意见》行动计划(2015-2018年)的通知
  15. 十分钟带你深入了解什么是移动端?
  16. C语言程序设计(第三版)何钦铭著 习题5-3
  17. 帕慕克给我上的一堂编程学习课
  18. 第五章:使用HBuilder
  19. Vue3 项目遇到的问题
  20. 2022上半年信息系统项目管理师论文真题

热门文章

  1. 苹果电脑如何查看本机IP地址和DNS?
  2. 如果Mac在播放音乐时遇到问题,没有声音或无法调整音量,该怎么办呢?
  3. 如何设置NeoFinder在共享网络中的目录数据库
  4. CentOS7忘记root密码的解决方法
  5. 用.htaccess 禁止IP访问
  6. Mellanox infinoband RDMA SDP
  7. 波形捕捉:(3)捕捉设备性能
  8. 哇撒!这几个SpringBoot前后端分离项目(附源码),star过千,快去收藏夹吃灰吧。。。
  9. 远程删除用户照片?刚刚,拼多多承认了!
  10. MyBatis 的 4 个妙用,别再踩坑了!