MATLAB

您所在的位置:网站首页 迷宫游戏说明书怎么写 MATLAB

MATLAB

#MATLAB | 来源: 网络整理| 查看: 265

游戏效果

在这里插入图片描述 在这里插入图片描述

使用键盘上方向键↑向前移动使用键盘左右方向键调整← →朝向 游戏原理说明

原理很简单,如效果图所示,主要就是以角色视角方向发射大量的直线模拟视线,并计算直线与墙壁交点,获取每一条视线方向下,角色到墙壁的距离,然后根据近大远小的原理绘制不同长度的竖向直线模拟墙壁。

第一代程序计算交点方法

第一代程序是使用的polyshape对象(二维多边形对象)制作墙壁,polyshape对象重载了函数intersect,可以直接求出直线与多边形的交集,程序编写更加简洁方便,给个检测直线和多边形交点的官方例子:

创建一个矩形多边形和一个线段:

poly1=polyshape([0 0 1 1],[1 0 0 1]); lineseg=[-1 -1;1.5 1.5];

计算该多边形与线段的交集,并确定线段的哪些部分在多边形的内部,哪些在其外部。

[in,out] = intersect(poly1,lineseg); plot(poly1) hold on plot(in(:,1),in(:,2),'b',out(:,1),out(:,2),'r') legend('Polygon','Inside','Outside','Location','NorthWest')

我们可以把内部第一个点和最后一个点看作与多边形边缘的交点:

intersectPnt=[in(1,:);in(end,:)]

intersectPnt = 0 0 1 1

但是!:这样的计算方法较缓慢,而且polyshape对象推出时间较晚(至少需要R2017B), 于是该方案被舍弃!! 于是该方案被舍弃!! 于是该方案被舍弃!!

第二代程序计算交点方法

假设角色当前位置为 p 0 = ( x 0 , y 0 ) p_0=(x_0,y_0) p0​=(x0​,y0​),角色当前面向方向为 θ 0 \theta_0 θ0​,将所有的墙壁边缘离散成点集合,其点到角色位置方向向量为: V = [ x 1 − x 0 y 1 − y 0 x 2 − x 0 y 2 − y 0 ⋮ ⋮ x N − x 0 y N − y 0 ] V=\left[\begin{array}{cc}x_1-x_0&y_1-y_0\\x_2-x_0&y_2-y_0\\\vdots&\vdots\\x_N-x_0&y_N-y_0\end{array}\right] V=⎣⎢⎢⎢⎡​x1​−x0​x2​−x0​⋮xN​−x0​​y1​−y0​y2​−y0​⋮yN​−y0​​⎦⎥⎥⎥⎤​

每个视线方向向量 T = [ cos ⁡ ( θ 1 + θ 0 ) sin ⁡ ( θ 1 + θ 0 ) cos ⁡ ( θ 2 + θ 0 ) sin ⁡ ( θ 3 + θ 0 ) ⋮ ⋮ cos ⁡ ( θ M + θ 0 ) sin ⁡ ( θ M + θ 0 ) ] T=\left[\begin{array}{cc}\cos(\theta_1+\theta_0)&\sin(\theta_1+\theta_0)\\\cos(\theta_2+\theta_0)&\sin(\theta_3+\theta_0)\\\vdots&\vdots\\\cos(\theta_M+\theta_0)&\sin(\theta_M+\theta_0)\end{array}\right] T=⎣⎢⎢⎢⎡​cos(θ1​+θ0​)cos(θ2​+θ0​)⋮cos(θM​+θ0​)​sin(θ1​+θ0​)sin(θ3​+θ0​)⋮sin(θM​+θ0​)​⎦⎥⎥⎥⎤​

做内积: I N N = V T ′ INN=VT' INN=VT′ 那么INN矩阵的每个数值都是角色到一个墙壁点方向向量与角色某一视线方向做内积,要考虑到视线为单方向射线,因此将内积为负数的值置为无穷大:INN(INN10)=10; PLINE.plotLine3(i).Color=[1,1,1]./10.*tLen; PLINE.plotLine3(i).YData=[5-tLen/2,5+tLen/2]; PLINE.plotLine2(i).XData=[RP.xpos,RP.xpos+cos(thetaList(i))*abs(minList(i))]; PLINE.plotLine2(i).YData=[RP.ypos,RP.ypos+sin(thetaList(i))*abs(minList(i))]; end end %% ======================================================================== % 数据旋转角度 function [X,Y]=rotateData(X,Y,theta) rotateMat=[cos(theta),-sin(theta);sin(theta),cos(theta)]; XY=rotateMat*[X;Y]; X=XY(1,:);Y=XY(2,:); end end

在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3