题意给你n个点,每个点有x,y坐标,让你求出来能组成的四边形最大面积是多少
思路这个是一个叉积,叉积是啥呢?,就是给你四个点,我复制了一把别人的
向量的叉积性质都忘完了……但是它可以用来判断点在直线的某侧。进而可以解决点是否在三角形内,两个矩形是否重叠等问题。向量的叉积的模表示这两个向量围成的平行四边形的面积。
设矢量P = ( x1, y1 ),Q = ( x2, y2 ),则矢量叉积定义为由(0,0)、p1、p2和p1+p2所组成的平行四边形的带符号的面积,即:P×Q = x1*y2 - x2*y1,其结果是一个伪矢量。
显然有性质 P × Q = - ( Q × P ) 和 P × ( - Q ) = - ( P × Q )。
叉积的一个非常重要性质是可以通过它的符号判断两矢量相互之间的顺逆时针关系:
若 P × Q > 0 , 则P在Q的顺时针方向。
若 P × Q < 0 , 则P在Q的逆时针方向。
若 P × Q = 0 , 则P与Q共线,但可能同向也可能反向。
叉积的方向与进行叉积的两个向量都垂直,所以叉积向量即为这两个向量构成平面的法向量。
如果向量叉积为零向量,那么这两个向量是平行关系。
因为向量叉积是这两个向量平面的法向量,如果两个向量平行无法形成一个平面,其对应也没有平面法向量。所以,两个向量平行时,其向量叉积为零。
然后这个题吧,就是n是三百,应该是n三方,不能使n四次方,每次都选取三角形,然后连个三角形一拼就是四边形
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
struct point{
double x , y;
}p[310];
double cross_funtion(point a , point b , point c)
{
return ((a.x - c.x)*(b.y - c.y) - (b.x - c.x)*(a.y - c.y))/2;
}
int main()
{
int n;
scanf("%d",&n);
for(int i = 1 ; i <= n ; i++){
scanf("%lf %lf",&p[i].x , &p[i].y);
}
double sum = 0 , lmax = 0 , rmax = 0;
for(int i = 1 ; i <= n ; i++){
for(int j = i + 1 ; j <= n ; j++){
lmax = 0 , rmax = 0;
for(int k = 1 ; k <= n ; k++){
if(k == i || k == j) continue;
double tmp = cross_funtion(p[i] , p[j] , p[k]);
if(tmp <= 0){
lmax = max(lmax , -tmp);
}
else{
rmax = max(rmax , tmp);
}
if(lmax == 0 || rmax == 0) continue;
sum = max(sum , lmax + rmax);
}
}
}
printf("%lf\n",sum);
return 0;
}