博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3304 Segments(判断直线与线段是否相交)
阅读量:4663 次
发布时间:2019-06-09

本文共 1489 字,大约阅读时间需要 4 分钟。

等价于是否存在一条直线穿过所有线段

判断直线与线段是否相交:

首先用两点p1,p2确定了一条直线 在用p1,p2分别与计算线段两个端点计算叉乘即可 ,叉乘之积>0就说明线段两端点在直线的同侧,也就是直线不经过此线段

注意顺序不要搞反了

 

#include
#include
#include
#include
#include
using namespace std;const double eps=1e-8;const int maxn=100004;int dcmp(double x) { if(fabs(x) < eps) return 0; return x < 0 ? -1 : 1;}#define Point Vectorstruct Vector{ double x,y; Vector(double x=0,double y=0):x(x),y(y){}; Vector operator + (const Vector &A) const{ return Vector(x+A.x,y+A.y); } Vector operator - (const Vector &A) const{ return Vector(x-A.x,y-A.y); } Vector operator * (const double &A) const{ return Vector(x*A,y*A); } Vector operator / (const double &A) const{ return Vector(x/A,y/A); } bool operator == (const Vector &A) const{ return dcmp(x-A.x)==0&&dcmp(y-A.y)==0; }};struct Line{ Point p1,p2; Line(){}; Line(Point p1,Point p2):p1(p1),p2(p2){}}li[maxn];bool operator < (Line l1,Line l2){ if(l1.p1.x==l2.p1.x) return l1.p1.y
0) return false; } return true;}int main(){ int T;scanf("%d",&T); while(T--){ scanf("%d",&n); for(int i=1;i<=n;i++){ Point p1,p2; scanf("%lf%lf%lf%lf",&p1.x,&p1.y,&p2.x,&p2.y); li[i]=Line(p1,p2); } if(n==1) {printf("Yes!\n");continue;} int flag=0; for(int i=1;i<=n;i++){ if(solve(li[i].p1,li[i].p2)) { //cout<
<

 

转载于:https://www.cnblogs.com/wifimonster/p/10323946.html

你可能感兴趣的文章
ltrim、rtrim与trim 去除空格或者别的字符
查看>>
k8s cookbook读书笔记 第二章
查看>>
hdu 3709+hdu 3555(数位dp)
查看>>
Go学习笔记(3)字符串
查看>>
挑战编程题(三)
查看>>
Linux下的crontab定时执行任务命令详解
查看>>
iOS开发init方法解析
查看>>
ValueListEdit控件的用法
查看>>
Python的主成分分析PCA算法
查看>>
day04-Linux系统中用户控制及文件权限管理方法
查看>>
go语言操作mongodb
查看>>
java定时器的使用
查看>>
es6学习笔记
查看>>
PAT 1043. 输出PATest
查看>>
Angular4 后台管理系统搭建(6) - 和D3.js V4版本结合画图
查看>>
《DSP using MATLAB》Problem 5.31
查看>>
HttpWebRequest解析 作用 介绍
查看>>
阿里云 centos vim 显示中文 乱码
查看>>
《DSP using MATLAB》示例Example7.24
查看>>
第一阶段——站立会议总结DAY01
查看>>