判断两直线段是否相交
转自:http://www.cnblogs.com/shengshouzhaixing/archive/2013/03/17/2964950.html
//功能:求点在有向直线左边还是右边
//返回:0共线、1左边、-1右边
int left_right(point a,point b,double x,double y)
{
double t;
a.x -= x; b.x -= x;
a.y -= y; b.y -= y;
t = a.x*b.y-a.y*b.x;
return t==0 ? 0 : t>0?1:-1;
}
//功能:线段c,d和直线a,b是否相交
bool intersect1(point a,point b,point c,point d)
{
return left_right(a,b,c.x,c.y)^left_right(a,b,d.x,d.y)==-2;
}
//功能:判断线段c,d和线段a,b是否相交
bool intersect(point a,point b,point c,point d)
{
return intersect1(a,b,c,d) && intersect(c,d,a,b);
}
以上是一位大神的!!
//
判断两线段是否相交:
方法(1):快速排斥(两个MBR是否有交集)+跨立(一个线段的两个端点在另一线段的两端)。
给出C语言代码如下:
/** 由两个点构造一个向量*/ Vector VectorConstruct(Point A, Point B) {Vector v;v.x = B.x - A.x;v.y = B.y - A.y;return v; }// 向量的叉积 double CrossProduct(Vector a, Vector b) {return a.x * b.y - a.y * b.x; }/** 由两个点构造一个MBR*/ MBR MbrConstruct(Point A, Point B) {MBR m;if (A.x > B.x){m.xmax = A.x;m.xmin = B.x;}else{m.xmax = B.x;m.xmin = A.x;}if (A.y > B.y){m.ymax = A.y;m.ymin = B.y;}else{m.ymax = B.y;m.ymin = A.y;}return m; }/** 判断两个MBR是否有交集,有返回1,否0*/ int MbrOverlap(MBR m1, MBR m2) {double xmin, xmax, ymin, ymax;xmin = Max(m1.xmin, m2.xmin);xmax = Min(m1.xmax, m2.xmax);ymin = Max(m1.ymin, m2.ymin);ymax = Min(m1.ymax, m2.ymax);return (xmax >= xmin && ymax >= ymin) ? 1 : 0; }/** 判断两线段(线段AB和CD)是否相交,是返回1,否0* 快速排斥+跨立*/ int SegmentIntersection(Point A, Point B, Point C, Point D) {// (1)判断AB和CD所在的MBR是否相交MBR m1 = MbrConstruct(A, B);MBR m2 = MbrConstruct(C, D);if (MbrOverlap(m1, m2) == 0)return 0;// (2)跨立判断Vector CA = VectorConstruct(C, A);Vector CB = VectorConstruct(C, B);Vector CD = VectorConstruct(C, D);Vector AC = VectorConstruct(A, C);Vector AD = VectorConstruct(A, D);Vector AB = VectorConstruct(A, B);// AB跨立CD,并且,CD跨立ABif (CrossProduct(CD, CA) * CrossProduct(CD, CB) <= 0 && CrossProduct(AC, AB) * CrossProduct(AD, AB) <= 0)return 1;else return 0; }
方法(2):判断是否为凸多边形。凸多边形的判断是,当从某个点开始绕一周,要么全顺时针拐弯,要么全逆时针。
/** 判断两线段(线段AB和CD)是否相交,是返回1,否0* 判断四边形ACBD是否是一个凸四边形*/ int SegmentIntersection(Point A, Point B, Point C, Point D) {Vector AC = VectorConstruct(A, C);Vector CB = VectorConstruct(C, B);Vector BD = VectorConstruct(B, D);Vector DA = VectorConstruct(D, A);double c[4];c[0] = CrossProduct(AC, CB);c[1] = CrossProduct(CB, BD);c[2] = CrossProduct(BD, DA);c[3] = CrossProduct(DA, AC);int f1=0, f2=0; // 计算正数,负数的个数int i;for (i=0; i<4; i++){if (c[i] > 0) f1++;if (c[i] < 0) f2++;}if (f1 > 0 && f2 > 0) // 有正,有负,返回无交集return 0;elsereturn 1; }
转载于:https://www.cnblogs.com/qingsunny/p/3447915.html
判断两直线段是否相交相关推荐
- python判断两线段是否相交_c语言 判断两直线段是否相交
转了多人的放到一起比较!! //功能:求点在有向直线左边还是右边 //返回:0共线.1左边.-1右边 intleft_right(pointa,pointb,doublex,doubley) { do ...
- 判断两条线段是否相交 java_判断两个线段是否相交02
写在前面 在其他博客中看到这方面的知识,很多都是重复,并且说的总是云里雾里的,所以这里我就自己总结一下这种问题如何求解,判断两个线段是否相交在前面我们提到了会用到叉积的一点知识,那么这里就来详细说一下 ...
- 判断两个圆柱体是否相交
问题 看到有人问这个问题.然后我写了解决这个问题的一个有用的理论准备.接下来简单介绍如何使用它判断两个圆柱是否相交. 解法 问题中的圆柱假设有中轴线,lil_i, 用固定点 Xi=(ai,bi,ci) ...
- 判断两个形状是否相交(二)-GJK
判断两个形状是否相交二-GJK 原文地址 一 介绍 二凸多边形性质 三Minkowski和 四单纯形 五支持函数 六创建单纯形 七相交检测 八迭代 然后我们开始循环迭代 第二次迭代 第三次迭代 九检测 ...
- 编程之美:编程判断两个链表是否相交
1.问题描述 给出两个单向链表的头指针,比如h1.h2,判断两个链表是否相交.编程之美为了简化问题,假设两个链表均不带环. 如下图: 2.分析与解法 解法一:直观法,先判断第一个链表的每个节点是否在第 ...
- 3.6 判断两个链表是否相交
判断两个链表是否相交,若相交则求其交点(指第一个相交的点). 思路1,利用计数法: 遍历链表1,将其节点的内存地址存入map或者hashmap内.然后遍历链表2,并查询map或者hashmap,判断链 ...
- 判断两个链表是否相交
方法:获得两个链表的长度,获得长度的差值len,然后首先遍历较长的链表len次,然后再同时遍历两个链表,如果有相同部分,两个链表就相交,如果没有,则不相交,即没有公共部分. 代码: #include ...
- ]数据结构:单链表之判断两个链表是否相交及求交点(带环、不带环)
1.判断两个链表是否相交,若相交,求交点.(假设链表不带环) 两个指针同时指向两个链表,分别依次往后遍历链表到最后一个节点,如指针的值相同(即节点地址相同),反之没有交点. int IsCross(N ...
- 判断两个多边形是否相交相交
// 1 判断相交//判断两多边形线段是否相交function isSegmentsIntersectant(segA, segB) {//线线const abc = (segA[0][0] - se ...
最新文章
- 简要说明建设城市大脑三条关键标准规范
- [转]Extending the User Interface in Outlook 2010
- (三) 类图和对象图
- Windows上的音频采集技术
- Linux 2.6.32-279.el6.x86_64 ANDROID SDK碰到”LIBC.SO.6: VERSION `GLIBC_2.14′ NOT FOUND”的解决方法(2)
- PMP读书笔记(第8章)
- ubuntu更改屏幕界面大小和中文
- JavaScript,5种调用函数的方法
- 英特尔nuc能代替主机吗_拆了拆了!Intel NUC装机!小机箱退烧器啊!主机显示器合体...
- php 如何生成txt文件,PHP生成TXT文件
- 浅谈互联网寒冬Android进阶之路
- NLP 的巨人肩膀(下):从 CoVe 到 BERT
- 未来五年,保险平权的最大机会来了
- 智能分数计算机在线使用,作业帮智能计算器在线使用
- VMware Horizon 8 2209 - 虚拟桌面基础架构 (VDI) 和应用软件
- 计算机二级选择题记忆知识点
- c++基本输入输出 输出不同精度的PI(程序给出的PI值为 3.14159265358979323846)。
- AI数学基础(2)--- 霍夫丁不等式
- 华硕服务器系统安装win7系统教程,华硕光盘重装系统win7图文教程
- Oracle多列统计信息