51nod1264(计算几何入门题)

传送门:51nod1264


题意:给你两条线段,判断是否相交


数学渣渣看了一下午各种找公式才明白:下面写一下理解:

判断两个线段相交与否。可以看成直线是否与线段相交

根据高数所学,向量的叉乘积,可以利用右手法则来判断结果的方向。

那么如果两种情况的方向一个上,一个下,那么自然也就是不在直线的同侧,那么就满足条件了。

代码是有需要注意x,y用double类型,否则乘法会有问题



ACcode

#include <iostream>
#include <stdio.h>
using namespace std;
struct node
{
    double x,y;
}a,b,c,d,ab,bc,bd;
void solve()
{
   double p[4];
    p[0]=(b.x-a.x)*(b.y-c.y)-(b.y-a.y)*(b.x-c.x); //ba X bc
    p[1]=(b.x-a.x)*(b.y-d.y)-(b.y-a.y)*(b.x-d.x); //ba X bd
    p[2]=(d.x-c.x)*(d.y-a.y)-(d.y-c.y)*(d.x-a.x);
    p[3]=(d.x-c.x)*(d.y-b.y)-(d.y-c.y)*(d.x-b.x);
    if ((p[0]*p[1]<=0)&&(p[2]*p[3]<=0))
   cout<<"YES"<<endl;
   else
    cout<<"NO"<<endl;
}
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        cin>>a.x>>a.y>>b.x>>b.y>>c.x>>c.y>>d.x>>d.y;
        solve();
    }
    return 0;
}



猜你喜欢

转载自blog.csdn.net/reallsp/article/details/78235495
今日推荐