Столкновение проблем в Matlab - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь написать программу, которая окружает квадрат вокруг окружающей среды.

Он должен менять свою скорость, когда сталкивается со «стенами» и центральным квадратом.

Я вполне уверен, что близок к тому, чтобы сделать это правильно, но, похоже, существует реальная проблема с обнаружением столкновений, которую я не могу понять.

Буду очень признателен всем, кто посмотрит и даст несколько указаний.

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

1 Ответ

0 голосов
/ 02 ноября 2018

Есть пара вещей, которые не совсем верны.

Ваша числовая интеграция должна умножаться на 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

Попытайтесь исправить свое преобразование, просто применив некоторый угол и перевод, к точке, где вы знаете, где должны заканчиваться ваши углы (например, поворот на 90 градусов или перевод известного значения). Таким образом, вы можете проверить правильность преобразования. Затем включите это снова в симуляции.

...