(计算几何 线段判交) 51nod1264 线段相交

1264 线段相交

给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相交)。 如果相交,输出"Yes",否则输出"No"。

输入

第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)

输出

输出共T行,如果相交输出"Yes",否则输出"No"。

输入样例

2
1 2 2 1 0 0 2 2
-1 1 1 1 0 0 1 -1

输出样例

Yes
No

注意这个题中,部分重合可以算是线段相交。和nyoj1016类似 https://www.cnblogs.com/Weixu-Liu/p/10599278.html

C++代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct Point{
    double x1,y1,x2,y2;
}point[2];
int cmp(const Point& a,const Point& b){
    double k1 = (a.x2 - a.x1)*(b.y1 - a.y1) - (b.x1 - a.x1)*(a.y2 - a.y1);
    double k2 = (a.x2 - a.x1)*(b.y2 - a.y1) - (b.x2 - a.x1)*(a.y2 - a.y1);
    if(k1 * k2 <= 0){
        return true;
    }
    else{
        return false;
    }
}
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&point[0].x1,&point[0].y1,&point[0].x2,
                                         &point[0].y2,&point[1].x1,&point[1].y1,
                                         &point[1].x2,&point[1].y2);
        if(!(max(point[0].x1,point[0].x2) < min(point[1].x1,point[1].x2) ||
             max(point[0].y1,point[0].y2) < min(point[1].y1,point[1].y2) ||
             max(point[1].x1,point[1].x2) < min(point[0].x1,point[0].x2) ||
             max(point[1].y1,point[1].y2) < min(point[0].y1,point[0].y2))){
            if(cmp(point[0],point[1]) && cmp(point[1],point[0])){
                printf("Yes\n");
            }
            else{
                printf("No\n");
            }
        }
        else{
            printf("No\n");
        }

    }
    return 0;
}

请使用手机"扫一扫"x

原文地址:https://www.cnblogs.com/Weixu-Liu/p/10599336.html

时间: 2024-09-30 22:56:52

(计算几何 线段判交) 51nod1264 线段相交的相关文章

(线段判交的一些注意。。。)nyoj 1016-德莱联盟

1016-德莱联盟 内存限制:64MB 时间限制:1000ms 特判: No通过数:9 提交数:9 难度:1 题目描述: 欢迎来到德莱联盟.... 德莱文... 德莱文在逃跑,卡兹克在追.... 我们知道德莱文的起点和终点坐标,我们也知道卡兹克的起点和 终点坐标,问:卡兹克有可能和德莱文相遇吗?,并且保证他们走的都是直线. 输入描述: 几组数据,一个整数T表示T组数据 每组数据 8个实数,分别表示德莱文的起点和终点坐标,以及卡兹克的起点和终点坐标 输出描述: 如果可能 输出 Interseeti

线段判交——poj2826

目前poj似乎数据出了问题,拿以前a的代码交上去也是wa 总体来说,要考虑三种答案0.00的情况 1.线段不相交 2.一根线段水平 3.开口被封闭,即高的那一端把低的那一端完全遮住了 #include<iostream> #include<cstring> #include<cstdio> #include<cmath> using namespace std; typedef double db; const db eps=1e-6; const db p

【Hihocoder 1167】 高等理论计算机科学 (树链的交,线段树或树状数组维护区间和)

[题意] 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 少女幽香这几天正在学习高等理论计算机科学,然而她什么也没有学会,非常痛苦.所以她出去晃了一晃,做起了一些没什么意义的事情来放松自己.门前有一颗n个节点树,幽香发现这个树上有n个小精灵.然而这些小精灵都比较害羞,只会在一条特定的路径上活动.第i个小精灵会在ai到bi的路径上活动.两个小精灵是朋友,当且仅当它们的路径是有公共点的.于是幽香想要知道,有多少对小精灵a和b,a和b是朋友呢?其中a不等于b,a,b和b,

(hdu step 5.1.3)Segment set(求与一条线段相交的线段集合中的线段的数量)

题目: Segment set Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 177 Accepted Submission(s): 82   Problem Description A segment and all segments which are connected with it compose a segment set. T

POJ1408-Fishnet(线段求交)

Fishnet Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1788   Accepted: 1144 Description A fisherman named Etadokah awoke in a very small island. He could see calm, beautiful and blue sea around the island. The previous night he had enc

主席树/函数式线段树/可持久化线段树

什么是主席树 可持久化数据结构(Persistent data structure)就是利用函数式编程的思想使其支持询问历史版本.同时充分利用它们之间的共同数据来减少时间和空间消耗. 因此可持久化线段树也叫函数式线段树又叫主席树. 可持久化数据结构 在算法执行的过程中,会发现在更新一个动态集合时,需要维护其过去的版本.这样的集合称为是可持久的. 实现持久集合的一种方法时每当该集合被修改时,就将其整个的复制下来,但是这种方法会降低执行速度并占用过多的空间. 考虑一个持久集合S. 如图所示,对集合的

BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)

题目大意:有一些位置,这些位置上可以放若干个数字.现在有两种操作. 1.在区间l到r上添加一个数字x 2.求出l到r上的第k大的数字是什么 思路:这种题一看就是树套树,关键是怎么套,怎么写.(话说我也不会来着..)最容易想到的方法就是区间线段树套一个权值线段树,但是区间线段树上的标记就会变得异常复杂.所以我们就反过来套,用权值线段树套区间线段树.这样修改操作在外线段树上就变成了单点修改,外线段树就不用维护标记了.在里面的区间线段树上维护标记就容易多了.具体实现见代码. CODE: #includ

[51nod1264]线段相交

给定两个点: typedef  struct { double  x, y; } Point; Point A1,A2,B1,B2; 首先引入两个实验: a.快速排斥实验 设以线段A1A2和线段B1B2为对角线的矩形为M,N; 若M,N 不相交,则两个线段显然不相交: 所以:满足第一个条件时:两个线段可能相交. b.跨立实验 如果两线段相交,则两线段必然相互跨立对方.若A1A2跨立B1B2,则矢量( A1 - B1 ) 和(A2-B1)位于矢量(B2-B1)的两侧, 即(A1-B1) × (B2

线段判非严格相交+暴力——poj2653

O(n2)的暴力居然能过.. #include<iostream> #include<cstring> #include<cstdio> #include<cmath> using namespace std; #define N 200005 #define db double const db eps=1e-6; int sign(db k){if (k>eps) return 1; else if (k<-eps) return -1; r