您的位置:首页 > 其它

判断一个点是否在线段上

2015-12-22 15:50 197 查看
判断点是否在线段上:

  设点为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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法