如何判断一个点是否在三角形内

 
设   ap×ab   代表矢量ap与ab的矢性积,其坐标表达式为  
        ap×ab   =   (xp-xa)*(yb-ya)-(yp-ya)*(xb-xa)  
  于是判别过程如下:  
   
  若   ap×ab>0   and   bp×bc>0   and   cp×ca>0   或   ap×ab<0   and   bp×bc<0   and   cp×ca<0  
  则可判定p在△abc内。  
   
  若   ap×ab=0   and   (bp×bc>0   and   cp×ca>0   或   bp×bc<0   and   cp×ca<0)  
  或   bp×bc=0   and   (ap×ab>0   and   cp×ca>0   或   ap×ab<0   and   cp×ca<0)  
  或   cp×ca=0   and   (ap×ab>0   and   bp×bc>0   或   ap×ab<0   and   bp×bc<0)  
  则可判定p在△abc轮廓上。  
   
  否则,p在△abc在外。  
int    inside4( const     struct    TPoint   tr[],    struct    TPoint   p)   
  
{   
  
struct   TPoint   arr[3];   
  memcpy(arr,tr,
sizeof(arr));   
  
for(int   i=0;i<3;i++)   //   求三个向量   
  {   
  arr[i].x   
=   tr[i].x   -   p.x;   
  arr[i].y   
=   tr[i].y   -   p.y;   
  }
   
  
for(i=0;i<3;i++)     //   判断是否在边界上   
  {   
  
int   j=(i+1)%3;   
  
if(   arr[i].x*arr[j].y-arr[i].y*arr[j].x==0   )     //点在边界上,向量对称   
  {   
  
if(   arr[i].x*arr[j].x>0   ||   arr[i].y*arr[j].y>0   )   return   0;//   同方向   
  return   1;                                                                   //   方向相反   
  }
   
  }
   
  
for(i=0;i<2;i++)   //   判断在内还是外,在此只需判断两个向量,下有说明【注1】   
  {   
  
int   front   =   (i+2)%3,   next   =   3-i-front;   
  
int   cnt   =   0;   
  
int   t1   =   arr[i].y*arr[front].x   -   arr[front].y*arr[i].x;   
  
int   t2   =   arr[i].y*arr[next].x     -   arr[next].y   *arr[i].x;   
  
if(   (t1>0)+(t2>0)!=1   )   return   0;   //向量分布在同一侧,则在外;否则不能确定   
  }
   
  
return   1;   //   三个向量都在不同两侧,则在内   
  
//   【注1】:如果三个向量分布在同一侧,则必定有两个向量使得另外的两个向量在该向量的同一侧   
  
//                         a   b   c   
  
//                     如   |/   三条线,b,c在a的一边,   a,b在c的一边,所以a,b,c中有两条线都可以判断   
  
//                     a,b,c三个向量对应的三个顶点在三个向量原点的一个方向,所以该点不在此三角形中   
  }
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值