判断两线段是否相交并计算交点坐标
来源:互联网 发布:手机淘宝模块怎么设置 编辑:程序博客网 时间:2024/05/21 09:17
判断两条线段是否相交
跨立试验
如果两线段相交,则两线段必然相互跨立对方。若P1P2跨立Q1Q2 ,则矢量 ( P1 - Q1 )和( P2 - Q1 )位于矢量( Q2 - Q1 ) 的两侧,即( P1 - Q1 ) × ( Q2 - Q1 ) * ( P2 - Q1 ) × ( Q2 - Q1 ) < 0。上式可改写成( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) > 0。当 ( P1 - Q1 ) × ( Q2 - Q1 ) = 0 时,说明 ( P1 - Q1 ) 和 ( Q2 - Q1 )共线,但是因为已经通过快速排斥试验,所以 P1 一定在线段 Q1Q2上;同理,( Q2 - Q1 ) ×(P2 - Q1 ) = 0 说明 P2 一定在线段 Q1Q2上。所以判断P1P2跨立Q1Q2的依据是:( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 -Q1 ) >= 0。同理判断Q1Q2跨立P1P2的依据是:( Q1 - P1 ) × ( P2 - P1 ) * ( P2 - P1 ) × ( Q2 - P1 ) >= 0。
实现代码如下:
bool intersection_exists(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4)
{// It's less expensive but you can't control the
// boundary conditions: Less or LessEqual
double dx1 = x2 - x1;
double dy1 = y2 - y1;
double dx2 = x4 - x3;
double dy2 = y4 - y3;
return ((x3 - x2) * dy1 - (y3 - y2) * dx1 < 0.0) !=
((x4 - x2) * dy1 - (y4 - y2) * dx1 < 0.0) &&
((x1 - x4) * dy2 - (y1 - y4) * dx2 < 0.0) !=
((x2 - x4) * dy2 - (y2 - y4) * dx2 < 0.0);
// It's is more expensive but more flexible
// in terms of boundary conditions.
//--------------------
//double den = (x2-x1) * (y4-y3) - (y2-y1) * (x4-x3);
//if(fabs(den) < intersection_epsilon) return false;
//double nom1 = (x4-x3) * (y1-y3) - (y4-y3) * (x1-x3);
//double nom2 = (x2-x1) * (y1-y3) - (y2-y1) * (x1-x3);
//double ua = nom1 / den;
//double ub = nom2 / den;
//return ua >= 0.0 && ua <= 1.0 && ub >= 0.0 && ub <= 1.0;
}
求两线段的交点
如果存在交点,则返回true,交点坐标为(x, y);否则返回false。
bool calc_intersection(double ax, double ay, double bx, double by, double cx, double cy, double dx, double dy, double* x, double* y)
{
double num = (ay-cy) * (dx-cx) - (ax-cx) * (dy-cy);
double den = (bx-ax) * (dy-cy) - (by-ay) * (dx-cx);
double intersection_epsilon = 1.0e-30;
if(fabs(den) < intersection_epsilon) return false;
double r = num / den;
*x = ax + r * (bx-ax);
*y = ay + r * (by-ay);
return true;
}
代码摘自:agg_math.h
- 判断两线段是否相交并计算交点坐标
- 判断两线段是否相交,并求交点
- 判断两线段是否相交求交点
- 判断两线段相交,并求交点
- 判断线段是否相交...并求出交点。
- 两直线四坐标点判断相交并求交点
- 两条线段是否相交,计算交点公式。
- 两条线段是否相交,计算交点公式。
- C++ 实现两线段是否相交、相交情况、若相交求出交点坐标
- C++ 实现两线段是否相交、相交情况、若相交求出交点坐标
- 判断两条线段/直线相交,并求交点
- 判断两条线段/直线相交,并求交点
- 判断直线与线段是否相交,相交则输出交点x轴坐标
- 两条线段知道端点line1(x1,y1)(x2,y2)line2(x3,y3)(x4,y4),判断两条线段是否相交,交点坐标(x,y)
- 判断线段相交并求交点
- 判断两链表是否相交,并求出交点
- 判断两线段是否相交
- 判断两线段是否相交
- 百度地图V2.0.2项目配置详解
- 无题
- dbms_xplan.display_cursor查看低效的执行计划
- 在Excel2007中设置表格与原来的表格格式一样
- 北大POJ 1001 (Java实现)
- 判断两线段是否相交并计算交点坐标
- SAN, DAS and NAS
- Storyboard----解析
- 增加root用户
- 利用 Java 实现组合式解析器
- Zookeeper集群的安装部署
- MyEclipse快捷键设置
- 网页设计学习之着陆页的设计
- 6