判断两线段是否相交 模板
2015-08-10 19:58
507 查看
struct point { double x, y; point( double _x = 0, double _y = 0 ) { x = _x; y = _y; } point operator-( point t ) { return point( x - t.x, y - t.y ); } double operator*( point t ) { return x * t.y - y * t.x; } }; //快速排斥试验模板 bool quickExclude( point a, point b, point c, point d ) { int x1 = a.x, x2 = b.x, x3 = c.x, x4 = d.x; int y1 = a.y, y2 = b.y, y3 = c.y, y4 = d.y; if ( min(x1,x2) <= max(x3,x4) && min(x3,x4) <= max(x1,x2) && min(y1,y2) <= max(y3,y4) && min(y3,y4) <= max(y1,y2) ) return true; else return false; } //跨立试验模板(两线段是否相交) bool ifIntersect( point a, point b, point c, point d ) { if ( quickExclude( a, b, c, d ) ) { if ( ( ( a - c ) * ( c - d ) ) * ( ( b - c ) * ( c - d ) ) <= 0 && ( ( c - a ) * ( a - b ) ) * ( ( d - a ) * ( a - b ) ) <= 0 ) return true; } return false; } //若已判断两线段相交求交点或者求两相交直线交点模板(四个点为a, b, c, d),a1, b1, c1, a2, b2, c2为方程系数,交点为x0和y0 double a1 = a.y - b.y; double b1 = b.x - a.x; double c1 = a.x * b.y - b.x * a.y; double a2 = c.y - d.y; double b2 = d.x - c.x; double c2 = c.x * d.y - d.x*c.y; double x0 = ( b1 * c2 - b2 * c1 ) / ( a1 * b2 - a2 * b1 ); double y0 = ( a2 * c1 - a1 * c2 ) / ( a1 * b2 - a2 * b1 );
View Code
相关文章推荐
- 单例模式:Instance
- 08-10 数据库操作
- 优先队列——重载运算符
- Apache HTTP Server .htaccess文件详解
- 使用 Zend_Form_Element 生成表单元素 --(手册)
- Android四大基本组件介绍与生命周期
- DataStructure-6-树
- HNU13383:The Big Painting
- csu1655 文本计算器 与 hdu1237 简单计算器 解题报告
- 并查集 HDU1558
- Java反射学习笔记
- android开发中遇到的一些bug
- HDU1823-Luck and Love-二维线段树(模板)
- PCA人脸识别
- [SDOI2011][BZOJ2243] 染色|线段树|树链剖分
- HDU 5268 ZYB loves Score——BestCoder Round #44(模拟)
- ObjC第一节:OC类、消息
- 结构体排序
- C语言-Function
- CentOS搭建Gitosis服务器