zoukankan      html  css  js  c++  java
  • 51nod1264 线段相交

    给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相交)。 如果相交,输出"Yes",否则输出"No"。
    Input
    第1行:一个数T,表示输入的测试数量(1 <= T <= 1000)
    第2 - T + 1行:每行8个数,x1,y1,x2,y2,x3,y3,x4,y4。(-10^8 <= xi, yi <= 10^8)
    (直线1的两个端点为x1,y1 | x2, y2,直线2的两个端点为x3,y3 | x4, y4)
    Output
    输出共T行,如果相交输出"Yes",否则输出"No"。
    Input示例
    2
    1 2 2 1 0 0 2 2
    -1 1 1 1 0 0 1 -1
    Output示例
    Yes
    No

    题目思路就是判断其他两点是否在线段两边,如果两条线段都是则相交,用向量叉乘,叉乘小于0则在左边,大于0在右边。
    还有可能一点真好在线段上也是相交的,则叉乘等于0。
    具体的原理,思路可以看这位大佬的博客https://www.cnblogs.com/kane1990/p/5742830.html
    代码:
    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #define ll long long
    using namespace std;
    struct point{
        double x,y;
    }a,b,c,d;
    
    double cross(point a,point b,point c)//叉乘,向量ac与向量ab 
    {
        double cross1=(c.x-a.x)*(b.y-a.y);
        double cross2=(c.y-a.y)*(b.x-a.x);
        return (cross1-cross2);
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            cin>>a.x>>a.y;
            cin>>b.x>>b.y;
            cin>>c.x>>c.y;
            cin>>d.x>>d.y;
            double t1=cross(a,b,c);
            double t2=cross(a,b,d);
            double t3=cross(c,d,a);
            double t4=cross(c,d,b);
            if(t1*t2<=0&&t3*t4<=0)//小于0则是在线段两边,等于0为在线段上 
                cout<<"Yes"<<endl;
            else
                cout<<"No"<<endl;
        }
        return 0;
    }
  • 相关阅读:
    day5 元组、列表、字典和集合
    day4 字符串类型和列表类型的详细caozu
    day3 数据类型
    预习
    python基础
    计算机基础——老年人上网冲浪手册
    pycharm操作指北
    day1 计算机基础知识
    Securing a Laravel API in 20 minutes with JWTs
    Testing Api using PHPUnit Laravel
  • 原文地址:https://www.cnblogs.com/xiongtao/p/9308707.html
Copyright © 2011-2022 走看看