边界判断处理

修正了坦克上下移动时到边界的判断条件和处理方法

增添了坦克旋转时碰到边界的处理

均由之前将图片近似成圆后使用半径判断改为用实体的四个顶点判断是否越界,视觉效果和玩家体验有明显改变。

今天上完数据结构课,搞Huffman压缩文件看代码看的头晕,回来一通乱改…有几个在循环里变量用忘记重置值了,导致坦克在屏幕上跳跃,找了好久的bug。

转载于:https://www.cnblogs.com/jwmeng/p/6045493.html

### 使用Matlab实现图像处理中的边界追踪算法 #### 边界追踪的基本原理 边界追踪的目标是从给定的二值图像中提取物体的轮廓。这一过程通常始于检测到的一个边界点,随后通过特定的方向移动来定位后续的边界像素,直到返回起始位置形成闭合路径[^2]。 #### 实现方法概述 对于一幅仅含单个连通白色区域的二值图像而言,可以采用如下方式获取其外部轮廓上的所有点,并确保这些点依照顺时针方向排列: 1. 寻找初始边界点; 2. 定义搜索模式(如8邻域)用于决定下一步走向; 3. 循环迭代直至回到起点完成一圈扫描; 4. 输出最终得到的一系列坐标作为结果。 #### 具体代码实例 下面提供了一段基于上述思路编写的MATLAB函数`boundaryTrace`,它接收一个更新后的分割图以及原始图片的高度和宽度作为输入参数,能够有效地执行边界追踪操作并返回所获得的边界点集合。 ```matlab function boundaryPoints = boundaryTrace(out_seg_img_update, X_image, Y_image) % 初始化变量 boundaryPoints = []; % 查找第一个边界点 (这里假设使用find函数找到的第一个非零元素的位置) [rows, cols] = find(out_seg_img_update); if isempty(rows) || isempty(cols) disp('未发现任何边界'); return; end startRow = rows(1); startCol = cols(1); currentPoint = [startRow, startCol]; direction = 0; % 初始朝向设定为正上方 nextDirection = mod(direction + 7, 8); % 下一步尝试逆时针旋转最大角度前进 while true boundaryPoints(end+1,:) = currentPoint; foundNext = false; for i=nextDirection:-1:mod(nextDirection-7+8,8)+1 neighborPosition = getNeighbor(currentPoint,i); if isValidBoundaryPixel(out_seg_img_update,neighborPosition,X_image,Y_image) currentPoint = neighborPosition; direction = mod(i+2,8); % 更新当前朝向 nextDirection = mod(direction + 7, 8); foundNext = true; break; end nextDirection = mod(nextDirection - 1 + 8, 8); end if ~foundNext || isequal(currentPoint,[startRow,startCol]) break; end end end % 获取邻居节点位置辅助函数定义 function pos=getNeighbor(p,direction) switch direction case 0,pos=[p(1)-1,p(2)]; case 1,pos=[p(1)-1,p(2)+1]; case 2,pos=[p(1),p(2)+1]; case 3,pos=[p(1)+1,p(2)+1]; case 4,pos=[p(1)+1,p(2)]; case 5,pos=[p(1)+1,p(2)-1]; case 6,pos=[p(1),p(2)-1]; case 7,pos=[p(1)-1,p(2)-1]; end end % 验证是否有效边界的辅助函数定义 function validFlag=isValidBoundaryPixel(imgData,currentPos,maxX,maxY) row=currentPos(1); col=currentPos(2); if row<1||row>maxX||col<1||col>maxY validFlag=false; return; elseif imgData(row,col)==0 validFlag=true;% 黑白反转考虑内外侧情况 else validFlag=false; end end ``` 此代码片段展示了完整的边界追踪逻辑及其组成部分——包括主循环结构、寻找下一个合适边界点的过程以及两个重要的支持功能:计算相邻单元格的具体坐标的子程序 `getNeighbor()` 和判断候选像素是否属于合法边界部分的验证器 `isValidBoundaryPixel()`.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值