首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Octave/Matlab中运动2d图的旋转

在Octave/Matlab中运动2d图的旋转
EN

Stack Overflow用户
提问于 2017-04-06 20:03:12
回答 1查看 468关注 0票数 1

我必须创建一个模拟真空吸尘器机器人的程序。我们得用八度来做。

代码语言:javascript
运行
复制
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

代码的问题是,当“机器人”撞到墙上时,他会随机生成一个新的天使,然后以这种方式移动。问题是机器人在角度和速度上有相同的变量。所以速度随角度而变化。我现在的问题是,如果有人知道如何以同样的速度移动我的观点,但当机器人撞到墙上时,它会改变速度以外的方向。我已经寻找了一个旋转矩阵,但是我无法用它来工作。希望你能帮上忙!

费利克斯

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-06 22:13:17

解决办法有点棘手。当你在笛卡尔坐标系中设置机器人的新位置时,角度和速度总是同时变化的,因为x和y坐标控制着两个参数。但是有一个非常简单的解,如果你把笛卡尔坐标转换成极坐标,你就会得到角度和幅度。用恒速因子代替震级,再计算h和t值,即笛卡尔坐标。因此,您只需要在代码中添加这三行。

代码语言:javascript
运行
复制
angle = atan2(t,h);
t = speedFactor*sin(angle);
h = speedFactor*cos(angle);

您的代码将类似于:

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43264798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档