[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-B1) * (A2-B1) × (B2-B1)<0。

上式可改写成(A1-B1) × (B2-B1) * (B2-B1) × (A2-A1)>0。

应该判断两次,即两条线段都要为直线,判断另一直线的两端点是否在它两边,若是则两线段相交。

若积极满跨立实验是不行的,如下面的情况:

 

即两条线段在同一条直线上。所以我们要同时满足两次跨立和快速排斥实验。

 

总体分析:

当(A1-B1) × (B2-B1)=0时,说明(A1-B1)和(B2-B1)共线,但是因为已经通过快速排斥试验,所以 A1一定在线段 B1B2上;同理,(B2-B1)×(A2-B1)=0 说明A2一定在线段B1B2上。所以判断A1A2跨立B1B2的依据是:(A1-B1) × (B2-B1) * (B2-B1) × (A2-B1) >= 0。

同理判断B1B2跨立A1A2的依据是:(B1-A1) × (A2-A1) * (A2-A1) × (B2-A1) >= 0。

如图:

 

应用:

1.       判断两个线段相交

2.       判断线段与直线相交

3.       判断点在矩形内

 

模板题

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 struct line{
 5     double x1,y1,x2,y2;
 6 }p,q;
 7 double cross1(line &a,line &b){
 8     return (a.x1-b.x1)*(b.y2-b.y1)-(a.y1-b.y1)*(b.x2-b.x1);
 9 }
10 double cross2(line &a,line &b){
11     return (a.x2-b.x1)*(b.y2-b.y1)-(a.y2-b.y1)*(b.x2-b.x1);
12 }
13 bool judge(line &a,line &b){
14     if(max(a.x1,a.x2)>=min(b.x1,b.x2)&&
15         max(a.y1,a.y2)>=min(a.y1,a.y2)&&
16         max(b.x1,b.x2)>=min(a.x1,a.x2)&&
17         max(b.y1,b.y2)>=min(a.y1,a.y2)&&
18         cross1(a,b)*cross2(a,b)<=0&&
19         cross1(b,a)*cross2(b,a)<=0)
20     return true;
21     return false;
22 }
23 int main(){
24     int t;
25     cin>>t;
26     while(t--){
27         cin>>p.x1>>p.y1>>p.x2>>p.y2>>q.x1>>q.y1>>q.x2>>q.y2;
28         if(judge(p,q)) cout<<"Yes\n";
29         else cout<<"No\n";
30     } 
31 }

 

转载于:https://www.cnblogs.com/elpsycongroo/p/6914812.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/269297.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt 在designer 中给QToolBar 添加 action控件

Qt 在designer 中给QToolBar 添加 action控件 1.在action editor 添加控件 SendData不出现使用打钩时 2. 使用鼠标直接拖拽到Ui指定位置

Windows环境下通过Git来管理自己的Android代码

前面已经介绍了在Windows下使用git工具来下载Android的源代码&#xff0c;Windows环境下通过Git得到Android源代码&#xff0c;这里记录我使用git工具来管理我自己的代码&#xff0c;git是一种分布式的项目管理工具而CVS及SVN都是集中式的版本号控制系统集中式版本号控制系统最…

Hello world开始

一切都从Hello world开始&#xff0c;代码如下&#xff1a; 1 #!/usr/bin/env python 定义程序执行过程中调用的环境 在linux下 直接调用python来解析执行该文件 2 #-*- coding:utf-8 -*- 也可以是 #codingutf-8 &#xff0c;作用是设置代码在执行过程中的编码形式&…

13 Tensorflow机制(翻译)

代码&#xff1a; tensorflow/examples/tutorials/mnist/ 本文的目的是来展示如何使用Tensorflow训练和评估手写数字识别问题。本文的观众是那些对使用Tensorflow进行机器学习感兴趣的人。 本文的目的并不是讲解机器学习。 请确认您已经安装了Tensorflow。 教程文件 文件作用mn…

有趣的Web版Ubuntu Linux

其实这不是真的 Ubuntu 啦。不过&#xff0c;在看到 Wubuntu 时&#xff0c;其逼真的模仿效果真是令人惊叹不已。不管怎么样&#xff0c;让我们来体验一把 Web 版的 Ubuntu 吧。首先&#xff0c;我们会经历一个 Ubuntu 启动过程。其启动画面与真实的 Ubuntu 一模一样。接着&…

重新定义旅游网站,米胖新版发布

还记得一年多之前&#xff0c;我在web 2.0 网站推荐这篇博客中提到了米胖。没多久&#xff0c;我认识了米胖的两位帅气又有才气的当家人。在多次聊天之后&#xff0c;我被他们的激情与专注深深地折服了&#xff0c;在那时我就坚信米胖一定能够发展得很好&#xff0c;走出一条属…

wait和notify使用例子

public class Test2 {public static void main(String[] args) {String lock "lock";Thread thread1 new Thread(new Runnable() {Overridepublic void run() {synchronized (lock){System.out.println("线程1开始等待" System.currentTimeMillis());tr…

Linux基础系列:常用命令(5)_samba服务与nginx服务

作业一&#xff1a;部署samba 每个用户有自己的目录&#xff0c;可以浏览内容&#xff0c;也可以删除 所有的用户共享一个目录&#xff0c;只能浏览内容&#xff0c;不能删 安装samba服务 1、准备环境 setenforce 0 2、安装软件包 yum -y install samba 3、修改配置文件 /etc/s…

python练习,随机数字 函数,循环,if,格式化输出

# double ball game import random count 10000000000 # 设置多少注 blue_start 1 blue_end 5 a [] def make_surprise():i 0while i < 6:i 1number random.randrange(1, 32, 1)a.append(format({:02d}.format(number)))a.append(format({:02d}.format(rando…

notify()唤醒线程,不会立即释放锁对象,需要等到当前同步代码块都执行完后才能释放锁对象

notify()唤醒线程&#xff0c;不会立即释放锁对象&#xff0c;需要等到当前同步代码块都执行完后才能释放锁对象 public class Test3 {public static void main(String[] args) {List<String> list new ArrayList<>();Thread thread1 new Thread(new Runnable(…

LINUX下的APACHE的配置

今天写一下LINUX下的APACHE的配置方法。APACHE是作为WEB服务器的。它的优点在于用缓存方式来加快网页的搜索速度。APACHE缺省只支持静态网页LINUX下有APACHE的RPM包安装上第一张盘里的httpd-2.0.40-21.i386.rpm 包1 /etc/httpd/conf.d 放在这里的都是动态网页的配置文件2 /etc/…

程序实践:命令行之连连看

命令行之连连看 程序实践周课题&#xff0c;VC6.0上可编译执行 游戏截图&#xff1a; #include <cstdio>#include <cstring> #include <iostream> #include <windows.h> #include <time.h> #include <algorithm> using namespace std; in…

interrupt()会中断线程的wait等待

public class Thread5 {public static void main(String[] args) {SubThread subThread new SubThread();subThread.start();try {//主线程睡眠2秒&#xff0c;确保子线程处于wait状态Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}subThread.i…

在ASP.Net 2.0中实现多语言界面的方法

1&#xff0e; 跟以前一样做界面&#xff0c;只是注意&#xff0c;把所有需要有多语言界面的文字都用label来做 2&#xff0e; 做完以后&#xff0c;在Solution Explorer里选中这个文件&#xff0c;选Tools-&#xff1e;Generate Local Resource3&#xff0e; 你会发现生成了一…

Qt 使用代码编写的自定义控件类

Qt 使用代码编写的自定义控件类 首先需要完成继承QWidget 或者Qt 原生控件类的类编写实现在需要使用自定义控件类的 UI 文件中添加一个 自定义类的控件&#xff08;也就是自定义类继承的控件&#xff09;将这个控件进行提升&#xff08;promote) 为自定义类&#xff0c;记得设…

mac使用word怎么显示左侧目录树

1&#xff0c;点击”视图” 2&#xff0c;点击“导航窗口” 3&#xff0c;点击如图所示图标