$Description$
给定平面上的一些点,求这些点能组成的所有三角形的面积之和
利用$atan2()$函数按极角从小到大排序。
$atan2(double~y,double~x)$其中$y$代表已知点的$Y$坐标,同理$x$ ,返回值见下图,它的值域相应的也就是$-\pi\sim \pi$了
$atan2$转换到$\left[0,2\pi\right)$表示的是与$x$轴正方向的逆时针夹角,这样转换的好处是便于计算两条线之间的夹角。
第二种转换是用于对直线进行极角排序的。
1 |
|
利用叉积。
1 | friend double operator ^(Point a,Point b){ |
若叉积$>0$,则向量$a$在向量$b$的顺时针方向,叉积$<0$,则向量$a$在向量$b$的逆时针方向1
2
3
4
5bool cmp(point a,point b) {
if((a^b)==0)
return a.x<b.x;
else return (a^b)>0;
}
排序效果同单个$atan2()$
一般情况下用叉积(精度高),但是$atan2()$更加灵活。
前置芝士$:$向量及其的基本运算,如叉积(叉积运算下面用符号^表示)。
对于一个已知三点坐标的三角形,其面积是可以算出来的。
设点$c$为原点$(0,0)$
$S_{\Delta}=\frac{|\vec{a}|\times |\vec{b}|\times\sin (\theta)}{2}=\frac{\vec{a}~\hat{}~\vec{b}}{2}=\frac{\left|x_{1}\times y_{2}-x_{2}\times y_{1}\right|}{2}$
对于任意多边形
$S=\frac{\left| \sum_{1}^{n-1}(x[i]\times y[i+1]-x[i+1]\times y[i])+x[n]\times y[1]-x[1]\times y[n]\right|}{2}$
$ps:$注意绝对值不要忘。
来张图
在网上并没有找到什么严格的证明,但是如果自己手玩过就会发现这样做是对的。
其中标出的$a$部分(不包括多边形本身)被重复算了两次,一次加,一次减,而多边形本身只被算了一次,符合题意。
如果点的坐标不是按顺序依次给出的又该怎么办呢?
$1.$所给多边形为凹包(或者不给说明,凸包和凹包都有可能):
如果点不是按照顺序依次给出的,那么所构成的多边形一定不唯一(画画就明了),所以点一定是按顺序给出的
$2.$所给多边形为凸包:
我们可以先将点按极角排序,就可套用公式了,(凸包的点极角排序后多边形的顶点是依次有序的,且多边形一定是唯一的)
1 | #include <bits/stdc++.h> |