顶角判别法识别多边形的凸凹性,并将凹多边形近似处理为凸多边形

顶角判别法:    该算法首先在顶点数据集中找J坐标值最大的点,若J坐标值最大的点不止一个,则在J坐标值最大的这些点中找,坐标值最大的点,这样找出的顶

点一定显凸性;然后,以该凸顶点为支点顺时针方向旋转后一个顶点到支点与前一个顶点的射线上,若旋转角度小于7T,则记为“+”号,大于7T则记为“一”号;遍历

其他顶点,以该顶点为支点顺时针方向旋转后一个顶点到支点与前一个顶点的射线上,旋转的角度小于7T则记为“+”号,大于7T则记为“一”号(凸凹点的判断);最后,

如果该点和顶点的符号相同则为凸点,否则为凹点。

效果图:           

              

处理后:

             

代码实现:

          

/**
 * 顶点判决法,并将凹多边形近似处理为凸多边形
 */
void MyPainterWidget::apexAngle(){
  //1.找顶角
  int maxIndex = 0 ;
  int maxY = points[0].y();
  int maxX;
  for(int i = 1;i < points.size();i++){
      if(points[i].y() < maxY){
          maxY = points[i].y();
          maxX = points[i].x();
          maxIndex = i;
      }else if(points[i].y() == maxY){
          //y值相同
          if(points[i].x() > maxX){
              maxX = points[i].x();
              maxIndex = i;
          }
      }
  }

 // qDebug()<<"maxIndex:"<<maxIndex;
  //2.1 找到顶角后,判断是否是凹点如果是,则移除
  // 逐次的往后求sin  sin < 0 :凸点:凹点;
  preIndex = maxIndex;
  for(int i = maxIndex + 1;i + 1 < points.size() && i - 1 >= 0;i++){
      filter(preIndex,i,i + 1);
  }


  if(points.size() > 2){
      //2.2 求最后一个角
      filter(preIndex,points.size() - 1,0);

      //2.3求第0个角
      filter(preIndex,0,1);

  }

  //2.4 找出顶角前面的凹点
  for(int i = 1;i < maxIndex + 1;i++){
      filter(preIndex,i,i+1);
  }
}

/**
 * @brief MyPainterWidget::filter
 * @param pre 前一个凸点
 * @param cur 当前点
 * @param next 下一个点
 * 记录最新凸点,剔除凹点
 */
void MyPainterWidget::filter(int pre,int cur,int next){
    if(!isBump(&points[pre],&points[cur],&points[next])){
        //更新前面最新的一个凸点
        preIndex = cur;
    }else{
        //从容器中移除当前凹点
        points.erase(points.begin() + cur);
         qDebug()<<"delete:"<< cur;
    }
}

//三个点组成的夹角,判断该点是否是凸点
bool MyPainterWidget::isBump(QPoint *p1,QPoint *p2,QPoint *p3){
    int sin = ((p1->x() - p2->x())*(p3->y() - p2->y()) - (p3->x() - p2->x())*(p1->y() - p2->y()));

    return sin < 0;

}

完整工程下载地址:http://download.csdn.net/detail/buqulinghun/9715040

参考论文:平面多边形凹凸性的顶角判别法,万书亭,韩庆瑶

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要安装Matlab中的光学工具箱。然后按照以下步骤进行仿真: 1. 定义高斯光束的参数:波长λ、光斑半径w0、光束腰的位置z0、光束在z轴方向的传输距离L。 2. 通过GaussBeam函数生成高斯光束。 3. 定义轴棱锥的参数:切比雪夫多项式的阶数N、轴棱锥顶角α、轴棱锥高h、轴棱锥底面半径r。 4. 通过Axicon函数生成轴棱锥。 5. 将生成的高斯光束和轴棱锥相乘,得到贝塞尔光束。 6. 分别计算高斯光束和贝塞尔光束的三维光强分布图,使用Matlab中的surf函数绘制。 以下是Matlab代码示例: ```matlab % 定义高斯光束参数 lambda = 1e-6; % 波长(m) w0 = 0.5e-3; % 光斑半径(m) z0 = 0; % 光束腰位置(m) L = 1e-3; % 传输距离(m) % 生成高斯光束 [x,y,z,E0] = GaussBeam(lambda,w0,z0,L); % 定义轴棱锥参数 N = 10; % 切比雪夫多项式阶数 alpha = 10; % 轴棱锥顶角(度) h = 50e-6; % 轴棱锥高(m) r = 10e-6; % 轴棱锥底面半径(m) % 生成轴棱锥 [rho,phi,z] = meshgrid(linspace(0,r,100),linspace(0,2*pi,100),linspace(0,h)); Ax = Axicon(N,alpha,rho,phi,z); % 将高斯光束和轴棱锥相乘得到贝塞尔光束 E = E0 .* Ax; % 计算高斯光束和贝塞尔光束的三维光强分布 I0 = abs(E0).^2; Ix = abs(E).^2; % 绘制高斯光束的三维光强分布 figure; surf(x,y,z,I0); xlabel('x (m)'); ylabel('y (m)'); zlabel('Intensity'); title('Gaussian Beam'); % 绘制贝塞尔光束的三维光强分布 figure; surf(x,y,z,Ix); xlabel('x (m)'); ylabel('y (m)'); zlabel('Intensity'); title('Bessel Beam'); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值