MATLAB 中加一条直线
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB 中加一条直线相关的知识,希望对你有一定的参考价值。
共三个问题
1. 我想在MATLAB做出的图中加一条y=0 的直线, 请问如何添加?
2. 如何用命令改变坐标轴的刻度? 比如,现在x轴的刻度是每格30, 我想改成每格为45,如何改变?
3. 在作图中如何把Y轴去掉?
现在很着急第一问啊
如y=0 的直线,选取(-5,0)和(5,0)两个点,组成的数组X = [-5 5],Y = [0 0],用语句line(X,Y)或者plot(X,Y)即可。如果是把直线加在另外一个图中,还需在画直线前加“hold on”语句,画直线后加“hold off”语句。
2.选择坐标轴的范围之后,利用set函数进行设置。
比如x坐标的范围是0:450,每格代表30,语句如下:
j = 0:30:450;
set(gca,'XTickLabel',j)
%gca为当前坐标轴句柄
如果是每格改为45,则为
j = 0:45:450;
set(gca,'XTickLabel',j)
如是改变y轴的,只需要把'XTickLabel'改为'YTickLabel'。本回答被提问者采纳
MATLAB | 我用MATLAB制作了一款伪3D第一视角迷宫小游戏
游戏效果
- 使用键盘上方向键
↑
向前移动 - 使用键盘左右方向键调整
←
→
朝向
游戏原理说明
原理很简单,如效果图所示,主要就是以角色视角方向发射大量的直线模拟视线,并计算直线与墙壁交点,获取每一条视线方向下,角色到墙壁的距离,然后根据近大远小的原理绘制不同长度的竖向直线模拟墙壁。
第一代程序计算交点方法
第一代程序是使用的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[\\beginarrayccx_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\\endarray\\right]
V=⎣⎢⎢⎢⎡x1−x0x2−x0⋮xN−x0y1−y0y2−y0⋮yN−y0⎦⎥⎥⎥⎤
每个视线方向向量
T
=
[
cos
(
θ
1
+
θ
0
)
sin
(
θ
1
+
θ
0
)
cos
(
θ
2
+
θ
0
)
sin
(
θ
3
+
θ
0
)
⋮
⋮
cos
(
θ
M
+
θ
0
)
sin
(
θ
M
+
θ
0
)
]
T=\\left[\\beginarraycc\\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)\\endarray\\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(INN<0)=inf
,之后因为明显和视线越垂直算出的距离越短,但这不是我们想要的,因此要添加新的约束,就是内积值和实际的点到角色的距离差值要小于一定阈值1e-5
,添加这个约束后,找到INN
矩阵每一列的最小值即可找到每一视线方向最近的墙壁点。
距离转换为线段长度
使用的如下公式:
l
e
n
=
α
L
∣
cos
(
θ
)
∣
len=\\frac\\alphaL|\\cos(\\theta)|
len=L∣cos(θ)∣α
其中
α
\\alpha
α为常数,
L
L
L为墙壁点到角色距离,
θ
\\theta
θ为视线和角色面朝方向的夹角。
完整代码
function maze2_5D_v2
% @author : slandarer
% @公众号 : slandarer随笔
% @知乎 : hikari
help maze2_5D
%% ========================================================================
% figure窗口创建
fig=figure();
fig.Position=[50,60,1200,600];
fig.Name='maze 2.5D by slandarer';
fig.NumberTitle='off';
fig.MenuBar='none';
% 俯视图axes坐标区域
ax2D=axes('Parent',fig);
ax2D.XTick=[];ax2D.XColor='none';
ax2D.YTick=[];ax2D.YColor='none';
ax2D.XLim=[0,15];
ax2D.YLim=[0,15];
ax2D.Color=[0,0,0];
ax2D.Position=[0,0,1/2,1];
hold(ax2D,'on')
% 伪3D图axes坐标区域
ax3D=axes('Parent',fig);
ax3D.XTick=[];ax2D.XColor='none';
ax3D.YTick=[];ax2D.YColor='none';
ax3D.XLim=[0,10];
ax3D.YLim=[0,10];
ax3D.Color=[0,0,0];
ax3D.Position=[1/2,0,1/2,1];
hold(ax3D,'on')
%% ========================================================================
% 左侧俯视地图初始化
mazeMat=[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1;
1 0 0 0 0 0 1 0 1 0 1 0 0 0 1;
1 1 1 1 1 0 1 0 以上是关于MATLAB 中加一条直线的主要内容,如果未能解决你的问题,请参考以下文章