原题链接 https://www.luogu.com.cn/problem/P1183
题目描述
给出一个没有缺口的简单多边形,它的边是垂直或者水平的,要求计算多边形的面积。
xOy 的笛卡尔平面上,它所有的边都平行于两条坐标轴之一。然后按逆时针方向给出各顶点的坐标值。所有的坐标值都是整数,因此多边形的面积也为整数。
输入格式
第一行给出多边形的顶点数n
接下来 n 行,每行给出多边形一个顶点的坐标值
顶点按 “逆时针” 方向逐个给出。多边形最后是靠从最后一个顶点到第一个顶点画一条边来封闭的。
注意,这题的逆时针方向很重要,如果不是暗顺序给的话是不能用向量或者要先求顺序后计算
先说知识点:向量的叉乘公式ab=x1y2-x2*y1(都以o为原点a是从0.0到x1.y1);
这个公式的结果的正负取决于0,a,b三点的关系
他的绝对值是这三个点形成的三角形的面积的两倍
使用向量的叉乘可以判断向量的方向。
若 a × b > 0 , 则P在Q的顺时针方向。
若 a × b < 0 , 则P在Q的逆时针方向。
若 a × b = 0 , 则P与Q共线,但可能同向也可能反向。
第二个知识点:一个多边形以一个点o为基准,逆时针遍历每个边的两点与o形成的向量计算出的三角形面积(有正有负)和的绝对值与多边形的面积相同;
include
include
include
include
include
include
include
using namespace std;
int main()
{
int n;
int x[500], y[500];
int ans=0;
cin>>n;
for (int i = 1; i <= n; ++i)
{
cin >> x[i] >> y[i];
}
x[n + 1] = x[1], y[n + 1] = y[1];//注意算n次会涉及到n+1的点,那么这个点即是第一个点
for (int i = 1; i <= n; ++i)
{
ans += (x[i] * y[i + 1] - x[i + 1] * y[i]);//叉乘的公式
}
printf("%d", abs(ans / 2));//我们最后再取绝对值除二
//为什么要取绝对值,因为这个代码是以0.0为基准,多边形可能在o的右上角,也可能在左下角
return 0;
}