点在多边形内外的逻辑判断-C

1、非完整的代码,可能您无法看懂。仅作参考

2、具体代码实现如下:内部亦含有参考坐标零点,A点到B点顺时针还是逆时针的判断。

int patch_area_cmp(str_patch_area_line *pdata)
{//0内1外2上
 unsigned int i , k1, k2;
 int m;
 int Xtimes = 0;
 double x1,y1,x2,y2;
 if((pdata->flag != 1)||(pdata->num < 1))
  return -1;

 for(i = 0 ; i < pdata->num ; i++)
 {
  k1 = 0 ; k2 = 0;
  x1 = pdata->xy[i].x1;
  y1 = pdata->xy[i].y1;
  if(i == (pdata->num - 1))
  {
   x2 = pdata->xy[0].x1;
   y2 = pdata->xy[0].y1; 
  }
  else
  {
   x2 = pdata->xy[i + 1].x1;
   y2 = pdata->xy[i + 1].y1;
  }
  printf("for tes : %d , %f %f , %f %f\n" , i,x1,y1,x2,y2);
  if((y1 > 0)||((y1 == 0)&&(x1 > 0)))
   k1 = 1;
  if((y2 > 0)||((y2 == 0)&&(x2 > 0)))
   k2 = 1;
  if(k1 == k2)
   continue;
  m = (x1 * y2) - (y1 * x2);//正逆负顺0线
  if(m > 0)
   Xtimes--;
  else if(m < 0)
   Xtimes++;
  else
   return 2;
  printf("111:%d , %d , %d\n" , i , Xtimes , m);
 } 
 
 if((Xtimes == 2)||(Xtimes == -2))
  return 0;
 return 1;
}

int patch_area_chick(double x_lo , double y_la , str_patch_area *pdata)
{//0内1外
 int i , k;
 str_patch_area_line temp;
 if(pdata->flag != 1)
 {
  printf("str_patch_area data flag != 1\n");
  return -1;
 }
 for(i = 0 ; i < Max_patch_area ; i++)
 {
  if(pdata->line[i].flag != 1)
   continue;
  patch_area_trans(x_lo , y_la , &temp , &pdata->line[i]);
  k = patch_area_cmp(&temp);
  if(k == 0)
   break;
 }
 if(i >= Max_patch_area)
  return 1;
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值