POJ 3304 Segments (直线与线段是否相交)
题意 : 能否找出一条直线使得所有给定的线段在该直线上的投影有一个公共点。
思路 : 假设存在一条直线a使得所有线段在该直线上的投影有公共点,则必存在一条垂直于直线a的直线b,直线b与所有线段相交,所以问题又转变为是否存在一条直线与所在所有线段相交。
假设这样的直线存在,则这一条直线可能与某一条或者某些线段的端点重合,也可能不重合。对于那些没有在端点相交的线段,我们可以把这一条直线通过旋转或平移,让其先与一条线段在线段的端点相交(那此时这一条直线与别的线段就在别的线段的中间相交), 然后继续旋转,让这一条直线与别的直线也在端点处相交。到此为止,我们可以明白所有存在的这样的直线都可以这样平移和旋转来处理他。那么反过来,如果我们用所有的线段的端点(任意组合)构成的直线都不满足和所有的线段至少有一个公共点,也就是说不存在这样的直线。
要注意的是小于1e-8就算是重点,所以要注意判断
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#define eps 1e-8 using namespace std ; struct point
{
double x,y;
}p[];
struct line
{
point a,b;
}L[]; double multi(point a,point b,point c)
{
return ((a.x-c.x)*(b.y-c.y) - (b.x-c.x)*(a.y-c.y)) ;
}
bool inter(line L,point a,point b)
{
double x1 = multi(L.a,a,b) ;
double x2 = multi(L.b,a,b) ;
if((x1 > eps && x2 < -eps) || (x1 < -eps && x2 > eps) || (fabs(x1) < eps) || (fabs(x2) < eps))
return true ;
return false ;
}
int main()
{
int T ,n;
scanf("%d",&T) ;
while(T--)
{
scanf("%d",&n) ;
int cnt = ;
for(int i = ; i < n ; i++)
{
scanf("%lf %lf %lf %lf",&L[i].a.x,&L[i].a.y,&L[i].b.x,&L[i].b.y) ;
p[cnt ++] = L[i].a ;
p[cnt ++] = L[i].b ;
// printf("2\n") ;
}
//printf("1\n") ;
bool ans = false ;
for(int i = ; i < cnt- ; i++)
{
for(int j = i+ ; j < cnt ; j++)
{
if(fabs(p[i].x-p[j].x) < eps && fabs(p[i].y-p[j].y) < eps) continue ;
bool flag = true ;
for(int k = ; k < n ; k++)
{
if(!inter(L[k],p[i],p[j]))
{
flag = false ;
break ;
}
}
if(flag)
{
ans = true ;
break ;
}
}
}
if(ans) puts("Yes!") ;
else puts("No!") ;
}
return ;
}
POJ 3304 Segments (直线与线段是否相交)的更多相关文章
- POJ 3304 Segments[直线与线段相交]
Segments Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13514 Accepted: 4331 Descrip ...
- Segments - POJ 3304 (判断直线与线段是否相交)
题目大意:给出一些线段,然后判断这些线段的投影是否有可能存在一个公共点. 分析:如果这些线段的投影存在一个公共点,那么过这个公共点作垂线一定与所有的直线都想交,于是题目转化成是否存在一个直线可以经 ...
- POJ 3304 Segments(计算几何:直线与线段相交)
POJ 3304 Segments 大意:给你一些线段,找出一条直线可以穿过全部的线段,相交包含端点. 思路:遍历全部的端点,取两个点形成直线,推断直线是否与全部线段相交,假设存在这种直线,输出Yes ...
- POJ 3304 Segments 判断直线和线段相交
POJ 3304 Segments 题意:给定n(n<=100)条线段,问你是否存在这样的一条直线,使得所有线段投影下去后,至少都有一个交点. 思路:对于投影在所求直线上面的相交阴影,我们可以 ...
- POJ 3304 Segments(判断直线与线段是否相交)
题目传送门:POJ 3304 Segments Description Given n segments in the two dimensional space, write a program, ...
- POJ 3304 Segments (直线和线段相交判断)
Segments Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7739 Accepted: 2316 Descript ...
- 简单几何(线段与直线的位置) POJ 3304 Segments
题目传送门 题意:有若干线段,问是否存在一条直线,所有线段投影到直线上时至少有一个公共点 分析:有一个很好的解题报告:二维平面上线段与直线位置关系的判定.首先原问题可以转换为是否存在一条直线与所有线段 ...
- POJ 3304 Segments (判断直线与线段相交)
题目链接:POJ 3304 Problem Description Given n segments in the two dimensional space, write a program, wh ...
- 判断直线与线段相交 POJ 3304 Segments
题意:在二维平面中,给定一些线段,然后判断在某直线上的投影是否有公共点. 转化,既然是投影,那么就是求是否存在一条直线L和所有的线段都相交. 证明: 下面给出具体的分析:先考虑一个特殊的情况,即n=1 ...
- poj 3304 Segments(计算直线与线段之间的关系)
Segments Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10921 Accepted: 3422 Descrip ...
随机推荐
- ociuldr 支持分多个数据文件
在审计工作,将几亿条的oracle数据通过sqlserver自带工具导入到sqlserver中,速度不是特别的理想,虽然通过视图方式能提高一些速度,但是既不简洁,也不方便. 用ociuldr工具,可以 ...
- 关于生成缩略图及水印图片时出现GDI+中发生一般性错误解决方法
System.Drawing.Image OldImage = null; oldImage = System.Drawing.Image.FromFile(ImageUrl); 使用该方法读取图片时 ...
- Android判断当前的android设备是否处于联网状态
首先,要想获得当前android设备是否处于联网状态,那么android本身给我们提供了一个服务 private ConnectivityManager connectivityManager;//用 ...
- ios中怎么样自动剪切图片周围超出的部分
UIImageView *image = [[UIImageView alloc] init]; image.clipsToBounds = YES;
- C#操作FTP, FTPHelper和SFTPHelper
1. FTPHelper using System; using System.Collections.Generic; using System.IO; using System.Net; usin ...
- 配置 apt-get cloudera 离线source(Cloudera Manager的源)
配置 apt-get cloudera 离线source(Cloudera Manager的源) 创建/etc/apt/source.list.d/cloudera-manager.list文件,并在 ...
- Go channel同步
我们可以使用Channel来同步不同goroutines的执行.看下面的代码: package main import "fmt" import "time" ...
- python的内存管理
1.在Python中,整数和短小的字符,Python都会缓存这些对象,以便重复使用.当我们创建多个等于1的引用时,实际上是让所有这些引用指向同一个对象. a = 1 b = 1 print hex(i ...
- HashSet<T>类
HashSet<T>类主要是设计用来做高性能集运算的,例如对两个集合求交集.并集.差集等.集合中包含一组不重复出现且无特性顺序的元素. HashSet<T>的一些特性如下: 1 ...
- 零基础学习Linux(三)linux与windows文件共享
上次的博文零基础学习Linux(一)环境搭建中我们已经将linux环境部署完毕了,接下来我们就可以在linux上进行软件的安装和环境的配置.但在进行这些操作之前,我们还需要解决一个问题——Linux与 ...