EOJ 1127. 多边形面积(计算几何)

题目链接:1127. 多边形面积(计算几何)

题意

按逆时针顺序给出 \(n\) 个点的坐标,求这些点围成的多边形的面积。

思路

选择多边形上的一个点,然后每次枚举之后的两个点,计算叉积,注意要保留符号,对所有的叉积的结果相加就是多边形的面积。

举个栗子:

计算上图多边形 \(ABCDEFGH\) 的面积,选择 \(A\) 点,则面积等于 \(\frac{1}{2} (\boldsymbol {AB \times AC} + \boldsymbol {AC \times AD} + \boldsymbol {AD \times AE} + \boldsymbol {AE \times AF} + \boldsymbol {AF \times AG} + \boldsymbol {AG \times AH})\)。其中 \(\triangle ABC\) 的面积是负的,而 \(\triangle ACD\) 与 \(\triangle ADE\) 的面积都是正的,则多边形 \(ABCDE\) 的面积相当于多边形 \(ACDE\) 的面积减去 \(\triangle ABC\) 的面积。

代码

#include <cstdio>
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef double db;
const db eps = 1e-10;
const db pi = acos(-1.0);
const ll inf = 0x3f3f3f3f3f3f3f3f;
const ll maxn = 100 + 10;

inline int dcmp(db x) {
    if(fabs(x) < eps) return 0;
    return x > 0? 1: -1;
}

class Point {
public:
    double x, y;
    Point(double x = 0, double y = 0) : x(x), y(y) {}
    void input() {
        scanf("%lf%lf", &x, &y);
    }
    bool operator<(const Point &a) const {
        return (!dcmp(x - a.x))? dcmp(y - a.y) < 0: x < a.x;
    }
    bool operator==(const Point &a) const {
        return dcmp(x - a.x) == 0 && dcmp(y - a.y) == 0;
    }
    db dis2(const Point a) {
        return pow(x - a.x, 2) + pow(y - a.y, 2);
    }
    db dis(const Point a) {
        return sqrt(dis2(a));
    }
    db dis2() {
        return x * x + y * y;
    }
    db dis() {
        return sqrt(dis2());
    }
    Point operator+(const Point a) {
        return Point(x + a.x, y + a.y);
    }
    Point operator-(const Point a) {
        return Point(x - a.x, y - a.y);
    }
    Point operator*(double p) {
        return Point(x * p, y * p);
    }
    Point operator/(double p) {
        return Point(x / p, y / p);
    }
    db dot(const Point a) {
        return x * a.x + y * a.y;
    }
    db cross(const Point a) {
        return x * a.y - y * a.x;
    }
};

Point p[maxn];

int n;

db area() {
    if(n < 3) return 0.0;
    db ans = 0.0;
    for(int i = 2; i < n; ++i) {
        ans += (p[i] - p[1]).cross(p[i + 1] - p[1]);
    }
    return ans * 0.5;
}

int main() {
    while(~scanf("%d", &n) && n) {
        db s = 0;
        for(int i = 1; i <= n; ++i) {
            p[i].input();
        }
        s = area();
        printf("%.1lf\n", fabs(s));
    }
    return 0;
}

原文地址:https://www.cnblogs.com/wulitaotao/p/11688993.html

时间: 2024-10-11 14:04:07

EOJ 1127. 多边形面积(计算几何)的相关文章

poj 3348 Cows 凸包 求多边形面积 计算几何 难度:0 Source:CCC207

Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7038   Accepted: 3242 Description Your friend to the south is interested in building fences and turning plowshares into swords. In order to help with his overseas adventure, they are f

Gym 100625H 多边形面积-计算几何

题意:输入多边形的n个顶点,现在假设在第一二个顶点连线的中点有一个照相机,这个相机的视角与这条边的夹角是45度,求阴影的面积和多边形总面积的比值. 分析:纯粹的几何题,会用向量求面积.交点.判断点在不在两点之间就行了.熟能生巧. 代码: #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #define eps 1e-10 using namespace std; c

EOJ 1058. 挤模具 (多边形面积)

题目链接:1058. 挤模具 题意 给出模具的底和体积,求模具的高. 思路 模具的底为多边形,因此求出多边形面积,用体积除以底的面积就是答案. 多边形的面积求解见 EOJ 1127. 多边形面积(计算几何) 代码 #include <cstdio> #include <iostream> #include <vector> #include <cmath> #include <algorithm> using namespace std; typ

eoj1127 计算几何 任意多边形面积

题目:eoj1127 " 改革春风吹满地, 不会算法没关系; 实在不行回老家, 还有一亩三分地. 谢谢!(乐队奏乐)" 话说部分学生心态极好,每天就知道游戏,这次考试如此简单的题目,也是云里雾里,而且,还竟然来这么几句打油诗. 好呀,老师的责任就是帮你解决问题,既然想种田,那就分你一块. 这是一块多边形形状的田,原本是Partychen的,现在就准备送给你了.不过,任何事情都没有那么简单,你必须首先告诉我这块地到底有多少面积,如果回答正确才能真正得到这块地. 发愁了吧?就是要让你知道,

多边形面积公式

多边形面积公式 设点顺序 (x1 y1) (x2 y2)    ... (xn yn) 则面积等于 |x1   y1 |      |x2   y2|                  |xn   yn| 0.5 * abs( |            | +   |           | + ...... +   |           | ) |x2   y2 |      |x3   y3|                  |x1   y1| 其中        |x1   y1| |

三角剖分求多边形面积的交 HDU3060

1 //三角剖分求多边形面积的交 HDU3060 2 3 #include <iostream> 4 #include <cstdio> 5 #include <cstring> 6 #include <stack> 7 #include <queue> 8 #include <cmath> 9 #include <algorithm> 10 using namespace std; 11 12 const int max

poj 1654 Area(求多边形面积)

题意:从原点出发向八个方向走,所给数字串每个数字代表一个方向,终点与原点连线,求所得多边形面积: 思路:(性质)共起点的两向量叉积的一半为两向量围成三角形的面积.以此计算每条边首尾两个向量的叉积,求和,除二: #include<cstdio> #include<iostream> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const dou

poj1408——叉积求多边形面积

poj1408——叉积求多边形面积 Fishnet Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1853   Accepted: 1185 Description A fisherman named Etadokah awoke in a very small island. He could see calm, beautiful and blue sea around the island. The previou

地球椭球面上多边形面积量算(C++代码)

昨天突然测试的时候发现以前产品中写的地球椭球面上面积计算的代码有点问题,于是今天就彻底修正,从QGIS中抠出代码来用C++重写了一下,新代码可以比较准确计算椭球面上多边形的面积,这个基础函数对空间量算功能中的面积量测非常重要,在这里共享出来供大家参考甚至直接拿过去用. 头文件如下: /** * @file DistanceArea.h * @brief 椭球面上计算多边形面积的接口文件 * @details * @author zxg * @date 2015年5月15日 * @version