计算几何算法基础————判断点是否在线段上(另附叉积的重要应用,折线段的拐向判断)
2014-08-21 17:17
726 查看
参考资料:《ACM/ICPC程序设计与分析》
判断点在线段上这个算法非常的简单,只要学过叉乘(CrossProduct)就很容易搞定
设点为Q,线段为P1P2,判断点Q是否在P1P2上。
算法依据:
1.点Q首先要在P1P2所在的直线上。
比较原始的办法是利用P1P2的坐标做出直线方程,然后代入点Q看是否满足方程,这样代码稍微麻烦些。
简单点就是用叉乘,如果点Q在P1P2直线上,那么:
P1Q x P1P2 = 0(x代表叉乘)
这个代码实现很容易。
P x Q = P.x * Q.y - P.y * Q.x(交叉相乘)PS:叉积的结果还是一个向量,二维向量的叉积是垂直于两个向量形成的平面的一个向量。这行公式实际上求的是标量。
2.Q要在以P1P2为对角线的平行矩形内
这个就更简单了,做一下比较即可
下面给出伪代码:
这里在说一下矢量叉乘的一个重要应用!
如果给出三点ABC,其位置关系如下:
![](http://img.blog.csdn.net/20140821162613437?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzU0ODUzMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
给出求AB x AC叉乘的伪代码
有了这些基础,就可以对折线段的拐向进行判断
对于有公共端点的线段AB,BC,通过计算AB x AC可以确定AB的拐向
![](http://img.blog.csdn.net/20140821171546720?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzU0ODUzMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
图示情况为AB x AC > 0 即AB在B点向左侧拐向C
![](http://img.blog.csdn.net/20140821170944437?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzU0ODUzMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
图示情况为AB x AC < 0 即AB在B点拐向右侧后到C
不要忘了AB x AC == 0 的情况,此时ABC共线。
判断点在线段上这个算法非常的简单,只要学过叉乘(CrossProduct)就很容易搞定
设点为Q,线段为P1P2,判断点Q是否在P1P2上。
算法依据:
1.点Q首先要在P1P2所在的直线上。
比较原始的办法是利用P1P2的坐标做出直线方程,然后代入点Q看是否满足方程,这样代码稍微麻烦些。
简单点就是用叉乘,如果点Q在P1P2直线上,那么:
P1Q x P1P2 = 0(x代表叉乘)
这个代码实现很容易。
P x Q = P.x * Q.y - P.y * Q.x(交叉相乘)PS:叉积的结果还是一个向量,二维向量的叉积是垂直于两个向量形成的平面的一个向量。这行公式实际上求的是标量。
2.Q要在以P1P2为对角线的平行矩形内
这个就更简单了,做一下比较即可
下面给出伪代码:
<span style="font-family:Microsoft YaHei;font-size:14px;">bool On_Segment(Point P1,Point P2,Point Q) { int condition1 = condition2 = 0 if(CrossProduct(P1Q,P1P1) == 0)//条件1 condition1 = 1; if((min(P1.x,P2.x) <= Q.x) && (Q.x <= max(P1.x,P2.x)) && (min(P1.y,P2.y) <= Q.y) && (Q.y <= max(P1.y,P2.y)))//条件2 condition2 = 1; if(condition1 && condition2) return true; else return false; }</span>
这里在说一下矢量叉乘的一个重要应用!
如果给出三点ABC,其位置关系如下:
给出求AB x AC叉乘的伪代码
<span style="font-family:Microsoft YaHei;font-size:14px;">double CrossProduct(Point A,Point B,Point C) { return (B.x - A.x) * (C.y - A.y) - (C.x - A.x) * (B.y - A.y); } </span>
有了这些基础,就可以对折线段的拐向进行判断
对于有公共端点的线段AB,BC,通过计算AB x AC可以确定AB的拐向
图示情况为AB x AC > 0 即AB在B点向左侧拐向C
图示情况为AB x AC < 0 即AB在B点拐向右侧后到C
不要忘了AB x AC == 0 的情况,此时ABC共线。
相关文章推荐
- POJ3304---Segments (基础计算几何:叉积判断线段相交)
- 计算几何基础——矢量和叉积 && 叉积、线段相交判断、凸包(转载)
- 计算几何基础——矢量和叉积 && 叉积、线段相交判断、凸包(转载)
- pku 1556 The Doors 计算几何 之 叉积判断线段是否相交
- [caioj]【计算几何】判断线段相交(跨立实验) 计算几何 叉积
- POJ 3304 Segments (计算几何、判断直线与线段是否相交)
- (计算几何)判断一个点是否在线段上
- POJ 1127 基础计算几何(判断两线段相交)+并查集
- HOJ1102 计算几何 判断两个线段是否会相交
- POJ 2398 Toy Storage(计算几何,叉积判断点和线段的关系)
- 计算几何 --- 判断两条线段是否相交(平面内)
- COJ 1645计算几何:判断线段是否相交
- 算法中的基础几何知识-叉积,线段,点
- 平行x 轴的线段 是否 遮掩 计算几何的扩大数据运算的典型应用,扩大根号2倍之后就避免了小数。 poj 3347 Kadj Squares
- 计算几何 模板 (判断点是否在线段上)
- 判断两条线段是否相交 计算几何
- 地理信息系统基础算法(二)判断两线段是否相交
- 【计算几何】 POJ 1127 Jack Straws 判断线段是否相交
- 计算几何---判断点是否在线段上
- POJ1556---The Doors (计算几何基础:判断线段相交(快速排斥实验+跨立实验))