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 ...
随机推荐
- AIDL与service
Service:Local service,一个进程中的多线程服务. AIDL:remote service,不同进程间通信. Service启动方法: startService():调用方destr ...
- RTP、RTCP
http://blog.chinaunix.net/uid-22670933-id-1771676.html
- 不再让内容把td撑开
<style type="text/css"> table {width:600px;table-layout:fixed;} td {white-space:nowr ...
- java中字符串String 转 int(转)
java中字符串String 转 int String -> int s="12345"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法 ...
- 说明&总目录
1. 说明 1.1 这是一个乱七八糟的博客,包含遇到的各类问题,甚至会有奇♂怪的东西~ 1.2 作者目前本科生,懒虫一只,喜欢吃喝玩乐看动漫,更喜欢睡觉 1.3 文章难免有错,欢迎指出 1.4 语死早 ...
- Android -- TabHost、Fragment、状态保存、通信
工程结构 TabAFm到Ta ...
- Node.js 学习(五)Node.js 事件循环
Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高. Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发. Node.j ...
- 推荐系统之LFM
这里我想给大家介绍另外一种推荐系统,这种算法叫做潜在因子(Latent Factor)算法.这种算法是在NetFlix(没错,就是用大数据捧火<纸牌屋>的那家公司)的推荐算法竞赛中获奖的算 ...
- Java compiler level does not match the version of the instal
一.问题描述 新建了一个项目,workspace默认jdk编译版本是1.7的,新建项目使用的是jdk1.5的版本,肯定会报@override错误.这个时候,修改项目的compilor即可. 这时候,你 ...
- Leetcode#89 Gray Code
原题地址 二进制码 -> 格雷码:从最右边起,依次与左边相邻位异或,最左边一位不变.例如: 二进制: 1 0 0 1 1 1 0 |\|\|\|\|\|\| 格雷码: 1 1 0 1 0 0 1 ...