判断一个点是否在线段上
2015-12-22 15:50
197 查看
判断点是否在线段上:
设点为Q,线段为P1P2 ,判断点Q在该线段上的依据是:( Q - P1 ) × ( P2 - P1 ) = 0 且 Q 在以 P1,P2为对角顶点的矩形内。前者保证Q点在直线P1P2上,后者是保证Q点不在线段P1P2的延长线或反向延长线上,对于这一步骤的判断可以用以下过程实现:
特别要注意的是,由于需要考虑水平线段和垂直线段两种特殊情况,
设点为Q,线段为P1P2 ,判断点Q在该线段上的依据是:( Q - P1 ) × ( P2 - P1 ) = 0 且 Q 在以 P1,P2为对角顶点的矩形内。前者保证Q点在直线P1P2上,后者是保证Q点不在线段P1P2的延长线或反向延长线上,对于这一步骤的判断可以用以下过程实现:
ON-SEGMENT(pi,pj,pk) if min(xi,xj) <= xk <= max(xi,xj) and min(yi,yj) <= yk <= max(yi,yj) then return true; else return false;
特别要注意的是,由于需要考虑水平线段和垂直线段两种特殊情况,
min(xi,xj)<=xk<=max(xi,xj)和
min(yi,yj)<=yk<=max(yi,yj)两个条件必须同时满足才能返回真值。
#include<stdio.h> struct point { double x,y; }; double direction( point p1,point p2,point p ) { return ( p1.x -p.x )*( p2.y-p.y) - ( p2.x -p.x )*( p1.y-p.y) ; } int on_segment( point p1,point p2 ,point p ) { double max=p1.x > p2.x ? p1.x : p2.x ; double min =p1.x < p2.x ? p1.x : p2.x ; double max1=p1.y > p2.y ? p1.y : p2.y ; double min1=p1.y < p2.y ? p1.y : p2.y ; if( p.x >=min && p.x <=max && p.y >=min1 && p.y <=max1 ) return 1; else return 0; } int main() { point p1,p2,q; while( 1 ) { scanf("%lf %lf %lf %lf %lf %lf",&q.x ,&q.y ,&p1.x ,&p1.y , &p2.x ,&p2.y ) ; if( !on_segment( p1,p2,q ) ) { printf("no\n"); continue; } if( direction( q,p1,p2 )==0 ) printf("yes\n"); else printf("no\n"); } return 0; }
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析