欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

平行垂直(叉积点积为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;
}
相关标签: 叉积 点积