在 Octave/Matlab 中旋转移动的 2d 图
Rotation of a moving 2d plot in Octave/Matlab
我必须创建一个模拟真空吸尘器机器人的程序。我们必须用 Octave 来做。
Main()
clear all;
%Initalisierung der Raummatrix, damit nachher abgefragt werden kann
XMatrix = 0;
YMatrix = 0;
%"Winkel festsetzten"
t=1;
h=1;
hold on
%Startpunkte vom Punkt
x = 20;
y = 15;
alpha = 45;
xalt= 10;
yalt= 10;
%Hier die Methode ändern um verschiedene Räume einzulesen
[XMatrix,YMatrix] = RaummitsechsEcken();
%plot Funktion wird gespeichert
p = plot(x,y,'*');
%p1 = plot(x,y,xalt,yalt);
while(true)
pause(0.001)
%alte Position speichern
xalt = get(p,'XData');
yalt = get(p,'YData');
%Bewegungsberechnung
set(p,'YData',get(p,'YData')+0.1*t);
set(p,'XData',get(p,'XData')+0.1*h);
% Strich plot
%Kollisionabfrage
if(inpolygon(get(p,'XData'),get(p,'YData'),XMatrix,YMatrix) == false)
%Alte Position zurückspielen
set(p,'XData',xalt);
set(p,'YData',yalt);
%Neue Winkelberechnung(random)
t = -1+rand(1)*(1-(-1));
h = -1+rand(1)*(1-(-1));
endif
endwhile
endfunction
function[X,Y] = RaummitsechsEcken()
X = [10 18 10 30 22 30 10];
Y = [1 16 30 30 16 1 1];
plot(X,Y)
hold on
endfunction
代码的问题是当 "robot" 撞到墙上时,他会随机生成一个新的天使并以这种方式移动。这里的问题是机器人具有相同的角度和速度变量。所以速度随角度变化。我现在的问题是,是否有人知道如何以相同的速度移动我的点,但在机器人撞墙时改变方向而不是速度。我已经搜索了一个旋转矩阵,但我不能让它工作。
希望对您有所帮助!
菲利克斯
解决方案有点棘手。当您在笛卡尔坐标系中设置机器人的新位置时,角度和速度总是会同时变化,因为 x 和 y 坐标控制这两个参数。但是有一个非常简单的解决方案,如果您使用将笛卡尔坐标转换为极坐标,您将获得角度和大小。用恒定速度因子替换大小并再次计算 h 和 t 值,即笛卡尔坐标。所以你只需要在代码中添加这些 three 行。
angle = atan2(t,h);
t = speedFactor*sin(angle);
h = speedFactor*cos(angle);
您的代码将如下所示:
Main()
clear all;
% You can control speed by increasing or decreasing this parameter.
speedFactor = 0.1;
%Initalisierung der Raummatrix, damit nachher abgefragt werden kann
XMatrix = 0;
YMatrix = 0;
%"Winkel festsetzten"
t=1;
h=1;
hold on
%Startpunkte vom Punkt
x = 20;
y = 15;
alpha = 45;
xalt= 10;
yalt= 10;
%Hier die Methode ändern um verschiedene Räume einzulesen
[XMatrix,YMatrix] = RaummitsechsEcken();
%plot Funktion wird gespeichert
p = plot(x,y,'*');
%p1 = plot(x,y,xalt,yalt);
while(true)
pause(0.001)
%alte Position speichern
xalt = get(p,'XData');
yalt = get(p,'YData');
%Bewegungsberechnung
set(p,'YData',get(p,'YData')+0.1*t);
set(p,'XData',get(p,'XData')+0.1*h);
% Strich plot
%Kollisionabfrage
if(inpolygon(get(p,'XData'),get(p,'YData'),XMatrix,YMatrix) == false)
%Alte Position zurückspielen
set(p,'XData',xalt);
set(p,'YData',yalt);
%Neue Winkelberechnung(random)
t = -1+rand(1)*(1-(-1));
h = -1+rand(1)*(1-(-1));
angle = atan2(t,h);
t = speedFactor*sin(angle);
h = speedFactor*cos(angle);
endif
endwhile
endfunction
function[X,Y] = RaummitsechsEcken()
X = [10 18 10 30 22 30 10];
Y = [1 16 30 30 16 1 1];
plot(X,Y)
hold on
endfunction
除了仅使用角度外,您还应该将轴设置为 "equal" 以获得速度的正确视觉印象。
p = plot (x, y, '*');
axis ("equal");
并在计算新位置
set(p,'YData',get(p,'YData')+0.2*sin(alpha));
set(p,'XData',get(p,'XData')+0.2*cos(alpha));
碰撞后
alpha = 2*pi*rand ();
这给了(我还修改了你的房间,让它更有趣)
我必须创建一个模拟真空吸尘器机器人的程序。我们必须用 Octave 来做。
Main()
clear all;
%Initalisierung der Raummatrix, damit nachher abgefragt werden kann
XMatrix = 0;
YMatrix = 0;
%"Winkel festsetzten"
t=1;
h=1;
hold on
%Startpunkte vom Punkt
x = 20;
y = 15;
alpha = 45;
xalt= 10;
yalt= 10;
%Hier die Methode ändern um verschiedene Räume einzulesen
[XMatrix,YMatrix] = RaummitsechsEcken();
%plot Funktion wird gespeichert
p = plot(x,y,'*');
%p1 = plot(x,y,xalt,yalt);
while(true)
pause(0.001)
%alte Position speichern
xalt = get(p,'XData');
yalt = get(p,'YData');
%Bewegungsberechnung
set(p,'YData',get(p,'YData')+0.1*t);
set(p,'XData',get(p,'XData')+0.1*h);
% Strich plot
%Kollisionabfrage
if(inpolygon(get(p,'XData'),get(p,'YData'),XMatrix,YMatrix) == false)
%Alte Position zurückspielen
set(p,'XData',xalt);
set(p,'YData',yalt);
%Neue Winkelberechnung(random)
t = -1+rand(1)*(1-(-1));
h = -1+rand(1)*(1-(-1));
endif
endwhile
endfunction
function[X,Y] = RaummitsechsEcken()
X = [10 18 10 30 22 30 10];
Y = [1 16 30 30 16 1 1];
plot(X,Y)
hold on
endfunction
代码的问题是当 "robot" 撞到墙上时,他会随机生成一个新的天使并以这种方式移动。这里的问题是机器人具有相同的角度和速度变量。所以速度随角度变化。我现在的问题是,是否有人知道如何以相同的速度移动我的点,但在机器人撞墙时改变方向而不是速度。我已经搜索了一个旋转矩阵,但我不能让它工作。 希望对您有所帮助!
菲利克斯
解决方案有点棘手。当您在笛卡尔坐标系中设置机器人的新位置时,角度和速度总是会同时变化,因为 x 和 y 坐标控制这两个参数。但是有一个非常简单的解决方案,如果您使用将笛卡尔坐标转换为极坐标,您将获得角度和大小。用恒定速度因子替换大小并再次计算 h 和 t 值,即笛卡尔坐标。所以你只需要在代码中添加这些 three 行。
angle = atan2(t,h);
t = speedFactor*sin(angle);
h = speedFactor*cos(angle);
您的代码将如下所示:
Main()
clear all;
% You can control speed by increasing or decreasing this parameter.
speedFactor = 0.1;
%Initalisierung der Raummatrix, damit nachher abgefragt werden kann
XMatrix = 0;
YMatrix = 0;
%"Winkel festsetzten"
t=1;
h=1;
hold on
%Startpunkte vom Punkt
x = 20;
y = 15;
alpha = 45;
xalt= 10;
yalt= 10;
%Hier die Methode ändern um verschiedene Räume einzulesen
[XMatrix,YMatrix] = RaummitsechsEcken();
%plot Funktion wird gespeichert
p = plot(x,y,'*');
%p1 = plot(x,y,xalt,yalt);
while(true)
pause(0.001)
%alte Position speichern
xalt = get(p,'XData');
yalt = get(p,'YData');
%Bewegungsberechnung
set(p,'YData',get(p,'YData')+0.1*t);
set(p,'XData',get(p,'XData')+0.1*h);
% Strich plot
%Kollisionabfrage
if(inpolygon(get(p,'XData'),get(p,'YData'),XMatrix,YMatrix) == false)
%Alte Position zurückspielen
set(p,'XData',xalt);
set(p,'YData',yalt);
%Neue Winkelberechnung(random)
t = -1+rand(1)*(1-(-1));
h = -1+rand(1)*(1-(-1));
angle = atan2(t,h);
t = speedFactor*sin(angle);
h = speedFactor*cos(angle);
endif
endwhile
endfunction
function[X,Y] = RaummitsechsEcken()
X = [10 18 10 30 22 30 10];
Y = [1 16 30 30 16 1 1];
plot(X,Y)
hold on
endfunction
除了仅使用角度外,您还应该将轴设置为 "equal" 以获得速度的正确视觉印象。
p = plot (x, y, '*');
axis ("equal");
并在计算新位置
set(p,'YData',get(p,'YData')+0.2*sin(alpha));
set(p,'XData',get(p,'XData')+0.2*cos(alpha));
碰撞后
alpha = 2*pi*rand ();
这给了(我还修改了你的房间,让它更有趣)