判断两条线段是否相交
2016-05-28 11:15
471 查看
题目:给定两条线段,判断这两条线段是否相交,线段AB的表示形式是A(x1,y1)B(x2,y2),线段CD的表示形式为C(x3,y3)D(x4,y4)。那么我们如何判断线段AB与线段CD是否相交。 解析:在介绍如何解决线段相交问题之前,我们先介绍向量的叉积。如下图所示:
下面的图(1)表示p1向量在p2向量的顺时针方向,图(2)表示p1向量在p2向量逆时针方向,图(3)表示p1向量与p2向量共线,我们只画出了同向共线的情况,反向共线的情况同理可得。
有了上面的叉积运算,很容易判断两条线段是否相交,比如说我们要判断线段p1p2与线段p3p4是否相交。(1)计算p1p3向量与p1p2向量的叉积值。(2)计算p1p4向量与p1p2向量的叉积值。(3)判断这两个叉积值是否为异号。(4)计算p3p1向量与p3p4向量的叉积值。(5)计算p3p2向量与p3p4向量的叉积值。(6)判断这两个叉积值是否为异号。(7)如果这两对叉积值都为异号,则说明两条线段相交,否则则不想交。如下图所示:
有一种特殊情况:比如说下图中的左图中线段p1p2与线段p3p4相交。向量p1p3与向量p1p2的叉积值为零。右图中线段p1p2与线段p3p4不相交。但是向量p1p3与向量p1p2的叉积值也为零。那么我们如何处理这种情况:我们只需要判断p3点在p1点与p2点之间即可,也就是说x1<=x3<=x2且y1<=y3<=y2。
#include<iostream> #include<vector> using namespace std; struct Point { int x; int y; Point(int myX, int myY) :x(myX), y(myY) {} Point(){} }; bool isIntersect(vector<Point> &line1, vector<Point> &line2) { int x1 = line1[0].x; int y1 = line1[0].y; int x2 = line1[1].x; int y2 = line1[1].y; int x3 = line2[0].x; int y3 = line2[0].y; int x4 = line2[1].x; int y4 = line2[1].y; int num1 = (x4 - x1)*(y2 - y1) - (y4 - y1)*(x2 - x1); int num2 = (x3 - x1)*(y2 - y1) - (y3 - y1)*(x2 - x1); int num3 = (x1 - x3)*(y4 - y3) - (y1 - y3)*(x4 - x3); int num4 = (x2 - x3)*(y4 - y3) - (y2 - y3)*(x4 - x3); if (num1*num2 < 0 && num3*num4 < 0) { return true; } if (num1 == 0) { if ((x4 > x1 && x4 > x2) || (x4 < x1 && x4 < x2)) { return false; } } if (num2 == 0) { if ((x3 > x1 && x3 > x2) || (x3 < x1 && x3 < x2)) { return false; } } if (num3 == 0) { if ((x2 > x3 && x2 > x4) || (x2 < x3 && x2 < x4)) { return false; } } if (num4 == 0) { if ((x1 > x3 && x1 > x4) || (x1 < x3 && x1 < x4)) { return false; } } return true; } int main(void) { system("pause"); return 0; }
相关文章推荐
- 基础总结--Activity的四种launchMode
- 用Cookie实现web网站您浏览过其他的商品
- 两个已经有序的表的并集
- JSP编程--基本语法
- 华为MSTP负载均衡配置示例
- 哈理工OJ 1192 追逐(贪心算法)
- 第十四周实践项目1————排序函数模板
- nginx启动脚本和配置文件
- 人生若只如初见
- 2016春季练习——树状数组
- Maven-Standard Directory Layout
- js中的闭包之我理解
- PRML Ch3: Linear Models For Regression 线性回归模型
- vim 文本编辑器的使用法则
- 多Web服务器之间共享Session的解决方案
- Check failed: error == cudaSuccess (8 vs. 0) invalid device function
- java之io之file类的常用操作
- LruCache源码的理解
- 关于cocoa框架,你所要知道的一切(苹果官方文档,cocoa框架核心竞争力,必须收藏!)
- EditText UI 修改