平行垂直(叉积点积为0)的应用
程序员文章站
2022-04-01 13:34:59
...
判断给出的线段能否构成矩形。
链接:http://hihocoder.com/problemset/problem/1040
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <sstream>
#include <string>
#include <set>
#include <queue>
using namespace std;
#define mem(a,n) memset(a,n,sizeof(a))
#define pb(x) push_back(x)
typedef long long LL;
typedef unsigned long long ull;
const int mod=1e9+7;
const double eps=1e-6;
const LL INF=0x3f3f3f3f;
const int N=100;
///判断是否是矩形
///平行时(叉积为0):x1*y2=x2*y1; 垂直时(点积为0):x1*x2+y1*y2=0
struct Line
{
int x1,y1,x2,y2;
Line(int x1,int y1,int x2,int y2):x1(x1),y1(y1),x2(x2),y2(y2){}
int vx() {return x1-x2;}
int vy() {return y1-y2;}
};
bool isParallel(Line& m,Line& n)///判断平行关系
{
return m.vx()*n.vy()==n.vx()*m.vy();
}
bool isVertical(Line& m,Line& n)///判断垂直关系
{
return m.vx()*n.vx()+m.vy()*n.vy()==0;
}
bool isSame(Line& m,Line& n)///判断是否为同一条直线
{
Line c(m.x1,m.y1,n.x1,n.y1);
return isParallel(m,c);
}
bool judge(vector<Line>& vec)///判断点的数量及相互垂直的直线对
{
int p=0,v=0;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(i==j) continue;
if(isParallel(vec[i],vec[j])&&!isSame(vec[i],vec[j])) p++;
if(isVertical(vec[i],vec[j])) v++;
}
}
return p==4&&v==8;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
vector<Line>vec;
int x1,y1,x2,y2;
for(int i=0;i<4;i++)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
vec.pb(Line(x1,y1,x2,y2));
}
printf("%s\n",judge(vec)?"YES":"NO");
}
return 0;
}
推荐阅读