Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
matlab中的碰撞问题_Matlab_Collision Detection_Matlab Figure_Collision - Fatal编程技术网

matlab中的碰撞问题

matlab中的碰撞问题,matlab,collision-detection,matlab-figure,collision,Matlab,Collision Detection,Matlab Figure,Collision,我正试图写一个程序,在环境中反弹一个正方形 当它与“墙”和中心广场碰撞时,它应该改变它的速度 我相当肯定我已经接近正确的方向了,但碰撞检测似乎有一个真正的问题,我无法解决 如果有人能看一看并给出一些建议,我将不胜感激 fps = 40; dt = 1/fps; tmax = 10; t = 0; theta = 0; dtheta = 1/20; p = transpose([20,20,1]); v = transpose([50,25,1]); Vobj = transpo

我正试图写一个程序,在环境中反弹一个正方形

当它与“墙”和中心广场碰撞时,它应该改变它的速度

我相当肯定我已经接近正确的方向了,但碰撞检测似乎有一个真正的问题,我无法解决

如果有人能看一看并给出一些建议,我将不胜感激

fps = 40; 
dt = 1/fps; 

tmax = 10; 
t = 0; 
theta = 0;
dtheta = 1/20;

p = transpose([20,20,1]); 
v = transpose([50,25,1]); 

Vobj = transpose([2, -2, 1; 2,2,1; -2, 2, 1; -2, -2, 1]);
Vobj2 = transpose([60,60,1; 60,40,1; 40, 40, 1; 40, 60, 1]);

while t < tmax
    x = p + t*v;
    if x(1)<= 5 || x(1) >= 95
      v(1)=-v(1);
    elseif x(2)<= 5 || x(2) >= 95
      v(2)=-v(2);
    elseif ((40<=x(1)) && (x(1)<= 60)) && ((x(2) == 40) || (x(2) == 60))
        v(2)=-v(2);
    elseif ((40<=x(2)) && (x(2)<= 60)) && ((x(1) == 40) || (x(1) == 60))
        v(1)=-v(1);
    end
    p = x;

    % Transformations
    T = [1,0,p(1);0,1,p(2);0,0,1];
    S = [1+0.2*sin(2*t),0,0; 0,1+0.2*sin(2*t),0;0,0,1];
    R = [cos(theta),sin(theta),0 ;-sin(theta),cos(theta),0;0,0,1];
    L = R*S*T;

    % Application of Transformations
    V = L*Vobj;

    fill(V(1,:),V(2,:),'r')

    hold on
    fill(Vobj2(1,:),Vobj2(2,:),'g')
    axis([0,100,0,100])
    hold off

    shg;
    pause(0.1);

    % Updates
    t = t + dt;
    theta = theta + dtheta;
end
fps=40;
dt=1/fps;
tmax=10;
t=0;
θ=0;
dtheta=1/20;
p=转置([20,20,1]);
v=转置([50,25,1]);
Vobj=转置([2,-2,1;2,2,1;-2,2,1;-2,-2,1]);
Vobj2=转置([60,60,1;60,40,1;40,40,1;40,60,1]);
而telseif((40有几件事不完全正确

如果使用正向欧拉方法,则数值积分应与
dt
相乘,而不是与
t
相乘

现在,您正在检查移动块的中心是否存在碰撞,但可能您实际上想要检查块角的碰撞。如果是这种情况,您可以循环检查块角的坐标,并使用正在工作的碰撞检测If语句单独检查它们。因此,不要只检查一次,而是执行以下操作检查四次角点。如果通过插值块的边添加点,甚至检查多次

块的变换不正确。
V
的位置不是以位置
p
为中心的。如果您试图简化问题,只取块的中心,您将看到碰撞检测实际上正在工作

fps = 40; 
dt = 1/fps; 

tmax = 10; 
t = 0; 
theta = 0;
dtheta = 1/20;

p = transpose([20,20,1]); 
v = transpose([50,25,1]); 

Vobj2 = transpose([60,60,1; 60,40,1; 40, 40, 1; 40, 60, 1]);

while t < tmax
    x = p + dt*v;
    if x(1)<= 5 || x(1) >= 95
      v(1)=-v(1);
    elseif x(2)<= 5 || x(2) >= 95
      v(2)=-v(2);
    elseif ((40<=x(1)) && (x(1)<= 60)) && ((x(2) == 40) || (x(2) == 60))
        v(2)=-v(2);
    elseif ((40<=x(2)) && (x(2)<= 60)) && ((x(1) == 40) || (x(1) == 60))
        v(1)=-v(1);
    end
    p = x;


    % plot the center of the block
    scatter(p(1),p(2))

    % plot the obstacle
    hold on
    fill(Vobj2(1,:),Vobj2(2,:),'g')
    axis([0,100,0,100])
    hold off

    shg;
    pause(0.1);

    % Updates
    t = t + dt;
    theta = theta + dtheta;
end
fps=40;
dt=1/fps;
tmax=10;
t=0;
θ=0;
dtheta=1/20;
p=转置([20,20,1]);
v=转置([50,25,1]);
Vobj2=转置([60,60,1;60,40,1;40,40,1;40,60,1]);
而t埃尔塞夫((40)为什么你认为这是错误的?它应该做什么?它做什么?请详细说明,直到你有了答案。你在第16行使用t而不是dtheta。你可以在动画中观察它的结果,box移动得越来越快。此外,通过你检测碰撞的方式,如果dtheta或速度太大,box可以飞出边界区域。或者,它可以几年前,我在大学的一位教授建议,这是matlab中最好的共谋检测方法:“您在第16行使用t”D这只是我的旋转角度,它需要每秒1度,我认为你的位置在探测方式上。速度不应该太大,虽然它从来没有改变过值,只是在x和y方向上改变。说实话,不确定发生了什么。Andreas代码是最小的正如我所能做到的,它是完整的,它做了我想让它做的事情,而不是检测不可靠这一事实,这是问题所在。我没有整合anything@Dead_Ling0是的,事实上你是,你在数值积分你的运动方程。看我的编辑。我觉得我对我的任务和我的头脑太过复杂了我无法理解,我确实理解你现在说的话,我想我以前从来没有这样想过,因为它是在一个计算机程序中。碰撞甚至不适用于街区的中心,它只是直接穿过墙壁,我不知道为什么…非常感谢你,我会尝试使用你给我的指针,你一直在使用真正的帮助:)