这题作为一个预热,用叉乘判平行,点乘判垂直
写得比较乱 有待改进
#include<iostream>
#include<vector>
#include <string.h>
#include<algorithm>
#include<fstream>
#include<cmath>
using namespace std;
#define lch(i) ((i)<<1)
#define rch(i) ((i)<<1|1)
#define sqr(i) ((i)*(i))
#define pii pair<int,int>
#define mp make_pair
#define FOR(i,b,e) for(int i=b;i<=e;i++)
#define FORE(i,b,e) for(int i=b;i>=e;i--)
#define ms(a) memset(a,0,sizeof(a))
const int maxnum =10007;
const int key = 177;
int t;
struct proxy
{
int x,y;
}point[5];int p=0;
int count1[5];
struct node{
proxy st,en,v;
}vec[5];
bool cmp(proxy a,proxy b){
return a.x==b.x&&a.y==b.y;
}
bool vertical(node a,node b){
return !(a.v.y*b.v.y+a.v.x*b.v.x);
}
bool parandequal(node a,node b){
return (a.v.y*b.v.x==a.v.x*b.v.y)&&(a.v.y*a.v.y+a.v.x*a.v.x==b.v.y*b.v.y+b.v.x*b.v.x);
}
bool insertpoint(proxy a){
FOR(i,1,p){
if(cmp(a,point[i])){
count1[i]++;
return count1[i]<3;
}
}
if(p>=4)return false;
point[++p].x=a.x;
point[p].y=a.y;
count1[p]=1;\
return true;
}
int main()
{
/*fstream fin("G:/1.txt");*/
scanf("%d",&t);
//fin>>t;
while(t--){
ms(vec);
ms(point);
ms(count1);
p=0;
int flag=0;
FOR(i,1,4){
scanf("%d%d%d%d",&vec[i].st.x,&vec[i].st.y,&vec[i].en.x,&vec[i].en.y);
/* fin>>vec[i].st.x>>vec[i].st.y>>vec[i].en.x>>vec[i].en.y;*/
if(flag)continue;
if(!insertpoint(vec[i].st)||!insertpoint(vec[i].en)) flag=1;
vec[i].v.x=vec[i].en.x-vec[i].st.x;
vec[i].v.y=vec[i].en.y-vec[i].st.y;
}
if(flag) printf("NO\n");
flag=0;
FOR(i,2,4){
if(parandequal(vec[1],vec[i])) flag++;
}
if(flag==1){
FOR(i,2,4)
if(vertical(vec[1],vec[i]))
flag++;
if(flag==3) printf("YES\n");
else printf("NO\n");
}
else printf("NO\n");
}
return 0;
}