【POJ】poj 3304 (计算机图论_直线和线段相交)

二维平面上线段与直线位置关系的判定 计算几何 线段与直线位置关系 线段投影 阅读详情

 

Description

Given n segments in the two dimensional space, write a program, which determines if there exists a line such that after projecting these segments on it, all projected segments have at least one point in common.

Input

Input begins with a number T showing the number of test cases and then, T test cases follow. Each test case begins with a line containing a positive integer n≤ 100 showing the number of segments. After that, n lines containing four real numbers x1y1x2y2 follow, in which (x1, y1) and (x2, y2) are the coordinates of the two endpoints for one of the segments.

Output

For each test case, your program must output "Yes!", if a line with desired property exists and must output "No!" otherwise. You must assume that two floating point numbers a and b are equal if |a - b| < 10-8.

Sample Input

3
2
1.0 2.0 3.0 4.0
4.0 5.0 6.0 7.0
3
0.0 0.0 0.0 1.0
0.0 1.0 0.0 2.0
1.0 1.0 2.0 1.0
3
0.0 0.0 0.0 1.0
0.0 2.0 0.0 3.0
1.0 1.0 2.0 1.0

Sample Output

Yes!
Yes!
No!

 

 

 

这个题目是目的是找一条直线是否能和所有的线段相交,可以证明如果存在那么必有一条过所有线段的端点的其中两个,可以通过判断直线与线段的相交关系来判断是否存在这一条直线;注意,用到判断两个double之间的差值大小,

代码:

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define MAX 105
#define INF 1e-8
using namespace std;
const double PI = acos(-1.0);
struct point
{
    double x; double y;
}p[MAX*2];
int num;
double cross ( point& a, point& b, point& c)
{
    return (a.x-c.x)*(b.y-c.y)-(a.y-c.y)*(b.x-c.x);
}
int sig( double d)/// 判断两个double之间的差值;
{
    return ( d > INF)-(d < -INF);
}
bool linecross( point& a,  point& b,  point& c, point& d)
{
    int d1, d2;
    d1 = sig(cross(a,b,c));
    d2 = sig(cross(a,b,d));
    if ((d1^d2) == -2 )///两条直线规范相交,(d1^d2) == -2表示d1,d2异号;
        return 1;
    if (d1 == 0||d2 == 0)///表示两条直线不规范相交;
        return 1;
    return 0;
}
bool Test(point& a, point& b)
{
    if ( sig(a.x-b.x)==0&&sig(a.y-b.y)==0 )///如果两个点离得很近就看做两个点重合,看做一个点;
        return false;
    for ( int i = 1; i <= 2*num; i += 2)
    {
        if (!linecross(a,b,p[i],p[i+1]))///判断a,b,点组成的这条线是否能和所有的线段相交
            return false;
    }
    return true;
}
bool Find ()
{
    for ( int i = 1; i <= 2*num; i++)
    {
        for ( int j = i+1; j <= 2*num; j++)
        {
            if ( Test(p[i],p[j])) return true;
        }
    }
    return false;
}
int main()
{
    //freopen("in.txt","r",stdin);
    int test;
    cin >> test;
    while (test--)
    {
        cin >> num;
        for ( int i = 1; i <= num*2; i++)
        {
            scanf("%lf %lf",&p[i].x,&p[i].y);
        }
        if (Find())
            printf("Yes!\n");
        else
            printf("No!\n");
    }
}

 

 

 

 

 

 

arcgis建筑数据的矢量化(一) 简单来说,建筑数据的获取无外乎是矢量化和去网站下载 无奈的是,osm和网上的建筑数据只有全国的主要城市,实在是为难我们这些小城市的,百度和天地图上是有建筑数据,无奈人家不要开放下载啊,所以就只能矢量化咯, 矢量化,无外乎手动和自动,手动就是新建shp面手动勾绘,这里就不讲了,我们来看看自动矢量化 自动矢量化在arcgis中主要是利用arcscan和栅格转面(栅格转面这个效果真是一言难尽,所以我们主要讨论arcscan) 同时我们矢量化也不一定要局限于arcgis... 阅读详情

相关推荐

Oracle19c集群节点故障恢复:从主机重装到重新加入集群的完整指南

本文详细介绍了Oracle19c集群节点故障恢复的全过程,从主机重装到重新加入集群的完整指南。重点讲解了保持集群配置一致性、彻底清理故障节点残留信息和分阶段验证等关键恢复原则,帮助DBA高效解决节点故障问题,确保集群稳定运行。

weixin_42524276的博客 256

POJ 3304(直线与线段相交)

题目:POJ3304 给定n条线段,找出一条直线,能与所有的线段有一个交点(可以在端点处相交)。 思路: 如果存在这么一条直线,必定过平面中的两个点,所以任意穷举两个点所在的直线与所有线段判断是否相交。 Sample Input 3 2 1.0 2.0 3.0 4.0 4.0 5.0 6.0 7.0 3 0.0 0.0 0.0 1.0 0.0 1.0 0.0 2.0 1.0 1.0 2...

qq_40905284的博客 516

LSF0108 level shift设计使用及debug流程

目录 初版设计 测试出现的问题1 解决问题(尝试1) 测试出现的问题2 解决问题2-1 解决问题2-2 单Port测试结果 所有Port均连接测试结果 初版设计 此电路的应用场景在于将LCD屏幕连接到FPGA上,进而通过FPGA中设计的硬件电路来驱动LCD屏幕,验证数字硬件电路设计的正确性。因此需要一个转接板位于FPGA和LCD屏幕之间,将二者连接起来。 转接板的硬件电路设计主要存在以下需求: 实现3.3V和1.8V之间的同时双向逻辑转换(LCD屏幕电平为3.3V,FPGA电平为1.

moshanghongfeng的博客 7562

POJ3304--Segments

题目大意:给定一些线段,问是否有直线L存在,使得所有线段到L的投影有至少一个公共点。 分析:实际上就是问,是否存在一条直线K, 和所有这些线段都相交。L是K的垂线即可。若存在一条直线与所有线段相交,该直线必定经过这些线段的某两个端点(否则可以平移或转动使之靠上端点)。枚举任意两个端点构造直线并看它是否与每条线段相交即可。 代码: #include #include #in

Apple.Daily的专栏 638

八大排序算法——(万字图文详解)

本篇博客将对“直接插入排序”、“希尔排序”、“直接选择排序”、“堆排序”、“冒泡排序”、“快速排序”、“归并排序”、“计数排序”进行详细的解析(算法逻辑、具体实现过程、时间复杂度、稳定性),并附以图片帮助大家更好地理解算法逻辑以及实现每个排序的参考代码。

Forward♞的博客 8075

DESeq2实战:如何用LRT检验分析基因表达随时间变化的模式(附完整代码)

本文详细介绍了如何使用DESeq2中的LRT检验分析基因表达随时间变化的模式,包括实验设计、数据预处理、模型构建、结果提取与可视化等完整流程。通过实战案例和完整代码,帮助生物信息学研究者掌握时间序列RNA-seq分析的核心技术,特别适合需要快速上手的实践者。

weixin_42620255的博客 466

POJ3304:直线与线段相交

POJ3304 题解 所有线段的投影都交于一点,相当于有一条直线的垂线经过所有的线段。 直线经过所有的点,我们可以旋转直线,使它恰好经过线段的两个端点,所有O(n^2)枚举端点。 判断ab直线和线段cd是否相交,只要判ab×ac和ab×ad的符号是否小于等于0。比判断线段和线段相交少一个条件。 最后注意重点的判断,因为叉积为0可能是直线和线段重合。 代码 #include <i...

FlyingJack 846

【OpenArm|Control】openarm机械臂ROS2仿真控制

openarm_ros2 存储库包含用于 ros2_control 的包集合。 它抽象化了硬件控制,将手臂公开为接收位置、速度和扭矩命令并输出关节状态的接口。 openarm_bringup 包提供了通过包与 ROS2 控制框架集成的启动文件。该软件包提供启动文件和配置,用于启动硬件接口、加载控制器以及将物理臂连接到 ROS2 生态系统。启动后,您可以使用标准 ROS2 控制工具和接口来命令手臂并接收反馈。openarm_bringup bringup 包支持模拟硬件(用于模拟/测试)和通过硬件插件的真实

ai领域探索者,欢迎一起交流,目前从事具身智能行业。 2955

poj3304(叉积判断直线和线段相交)

题目链接:https://vjudge.net/problem/POJ-3304 题意:求是否能找到一条直线,使得n条线段在该直线的投影有公共点。 思路:   如果存在这样的直线,那么在公共投影点作直线的垂线,显然该垂线会经过所有直线,那么原题转换为求是否有经过所有线段的直线。   如果存在这样的直线,那么该直线一定能通过平移和旋转之后经过所有线段中的两个端点,那么我们枚举所有两...

weixin_30757793的博客 233

ERROR: Could not install packages due to an OSError: [Errno 2] No such file or directory解决方案

本文主要介绍了ERROR: Could not install packages due to an OSError: [Errno 2] No such file or directory解决方案,希望能对使用Python的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 11万+

流体动力学仿真软件:Star-CCM+_(1).Star-CCM+基础及入门

Star-CCM+的用户界面(UI)分为多个部分,包括菜单栏、工具栏、工作区、视图窗口和控制台。菜单栏包含文件、编辑、视图、工具等常用菜单。例如,“File”菜单可以用于打开、保存和退出项目。工具栏提供常用的工具按钮,如新建项目、打开项目、保存项目等。也可以自定义工具栏,添加常用的功能按钮。工作区显示当前项目的结构和各个对象。可以通过拖拽方式组织和管理项目中的各个部分。视图窗口显示几何模型、网格、结果等。可以通过不同的视图模式查看和分析数据。控制台显示软件的运行日志和输出信息。

kkchenjj的博客 1197

poj3304(叉乘)

有n条线段,问是否存在一条线段与所有给出得线段相交 存在这样一条线段,那么一定可以通过旋转使得该线段与给出线段的某两个端点相交,所以枚举这样的线段只需要枚举任意两个端点即可,判断线段与线段是否相交,可以转化成判断线段1的两个端点是否在线段2的两侧,然后用叉乘来判断就行了,n注意==1时特判 #include &lt;cstdio&gt; #include &lt;cmath&gt; #inc...

bpdwn2017的博客 217

用 Docker 一键部署 SillyTavern酒馆 mac/windows/linux通用教程,我再也不手动折腾了!

本文介绍了如何使用 Docker 一键部署 SillyTavern 项目,适用于 Mac、Windows 和 Linux 系统。SillyTavern 是一个本地部署的大语言模型聊天界面,支持多种插件和扩展。文章详细说明了安装 Docker、拉取项目、启动容器、配置白名单、启用插件等步骤,并提供了常见问题的解决方法。通过 Docker 部署,用户可以避免繁琐的手动配置,快速搭建和运行 SillyTavern,适合希望简化部署流程的用户。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2620

直线与线段相交问题(例题:POJ3304)

判断直线与线段是否相交 判断直线与线段是否相交,这个刘汝佳的板子上没有,但是稍微分析一下就可以得到了,这个是线段相交的简化版。 // 显然只需要b1,b2在a1,a2两侧即可,不需要判断a1,a2是否在b1,b2两侧 // 其中a1,a2是直线,b1,b2是线段 bool SegLineInt(Point a1,Point a2,Point b1,Point b2) { double c1 = ...

Radium_1209 863

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

判断直线与线段相交 POJ 3304 Segments

题意:在二维平面中,给定一些线段,然后判断在某直线上的投影是否有公共点。 转化,既然是投影,那么就是求是否存在一条直线L和所有的线段都相交。 证明: 下面给出具体的分析:先考虑一个特殊的情况,即n=1的时候,如下图,线段AB在直线L上的投影为线段A'B',则过任意介于A'B'之间的点C'做直线L的垂线必交线段AB与一点C;反之,过线段AB之间任意一点C做直线L的垂线,垂足必定落...

dizhuo0219的博客 311

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

POJ - 3304 Segments(直线与线段相交)

链接:https://cn.vjudge.net/problem/POJ-3304 题意:n条线段,问是否存在一条直线。n条线段在该直线的投影至少有一个公共点。 思路:如果存在这样的直线,那么过某一公共点作该直线的垂线,这条垂线一定与n条线段都相交。所以,问题转化为是否有一条直线与这n条线段相交。显然,如果存在这样的直线,那么肯定可以经过两线段的端点画出一条这样的线。枚举这两个端点判断即可。判...

birdmanqin的博客 317

POJ3304 求直线和线段是否相交

  判断能否找到一条直线使得与每个线段有交点 先枚举2条线段,再枚举出2条线段上的各一个端点,来当做直线。 判断直线相交直接利用向量线段表示法,然后用叉积去算 a是直线的一个点,v是方向向量,b是线段的一个点,w是方向向量 假设a+tv是交点 cj(a + tv − b,w) = 0 cj(a − b,w) + cj(tv,w) = 0 t ∗ cj(v,w) = cj(b − a,w)...

binarycopycode 502

POJ 3304 || Segments (线段,直线相交

题目写太久现在都快忘记题意是什么了。 赤果果的WA了五六七发,后来改的快和kuangbin的题解一样了。 思路是一样的,但是自己的代码就是过不了!! 注意的点。一开始将符号的重载是放在结构体外的,之后符号重载移到结构体内部就AC了。 这是至今还搞不明白的WA点。望指点。 题目大概意思。 给你若干条线段,问你能不能画出一条直线,让所有的线段投影在这条直线上至少有一个点是重合的。

野生 777

POJ 3304 Segment 直线与线段相交

C - Segments Time Limit:1000MS    Memory Limit:65536KB    64bit IO Format:%I64d & %I64u Description Given n segments in the two dimensional space, write a program, which determines if

liguangye122333的专栏 450

poj-3304-Segments-线段与直线相交

判断线段与直线是否相交,注意精度问题。 #include #include #include #include #include using namespace std; #define eps 0.00000001 #define zero(x) ((fabs(x)<eps)?0:x) struct segn { double x1,y1; double x2,y2; }seg

青竹梦 972

POJ 3304 直线和线段相交

Segments Time Limit: 1000MS   Memory Limit: 65536K       Given n segments in the two dimensional space, write a program, which determines if there exists a line such that

black_miracle的博客 301

poj 3304 判断是否有与所有线段相交的直线

题意:给出n条线段两个端点的坐标,问所有线段投影到一条直线上,如果这些所有投影至少相交于一点就输出Yes!,否则输出No!。 思路:

dearmango 443

Poj 3304 Segments 【线段于直线相交】

点击打开链接 题意:         给你n条线段,问你有没有可能存在一条直线可以让所有线段在这条直线上的投影交于一点。 题解:         题意可以转化成所有是否存在一直线与所有线段有交点,而要求的直线就是该直线的一条垂线。垂足即是所有线段投影的焦点,         那么枚举所有线段的端点,来枚举这条直线,因为如果一条直线能能和

zoro_n的博客 258

POJ 3304 判断线段和直线相交

题意:给n个线段,问是否存在这样的一条直线,满足这n个线段在投影有公共点 思路:如果存在这样的直线,那么这样的直线一定是一组平行的直线都可以(投影),投影有公共点,从公共点做直线的垂线,那么这条垂线一定和所有的线段相交,也就是如果存在一个直线和所有的线段相交就可以。如果存在这样的垂线,考虑如果稍微偏移一定的角度,一定偏移到了某条线段的端点的时候不能再偏移,所以只要枚举端点就可以了(开始时枚举的是

黑山老猴妖的专栏 468

叉积判断线段/直线相交 POJ3304

题意: 给你n个线段的两端坐标问是否存在一条直线所有线段在这条直线上的投影有共同点 思路 存在一条直线所有线段在这条直线上的投影有共同点 ==有一条线能穿过所有线段(这两条直线刚好⊥) 暴力枚举所有端点 直线与线段相交——叉积(判断一次就够啦~/线段与线段相交twice) ACcode #include<cstdio> #include<iostream> #include<algorithm> #include<cmath>...

kth_xixi 242

POJ 3304 Segments 枚举线段端点+判断相交

所有线段在直线上的投影有公共区域,那么这条直线存在一条法线通过

353

POJ 3304 Segments 判断直线与线段相交

题意:给你一些线段 问你它们的投影有没有一部分可以重叠在一起 思路:投影重叠在一起 其实也就是是否存在一条直线 使得它与所有线段都相交 注意这里相交并不是单纯的规范相交 那么如何判断线段与直线非规范相交呢 我们找到直线上两个点a1 a2 对于一条线段b1 b2如果Cross(a2 - a1, b1 - a1) * Cross(a2 - a1, b2 - a1) 对于几何题 清晰的思路以及可读

s_h_r 446
上一篇: 【POJ】poj 1094(拓扑排序)
下一篇: 【HDU】hdu 3579 (同余方程组,逐一合并大法)
三生石1103
博客等级 码龄12年 16粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值