Здравствуйте, vadimcher, Вы писали:
V>Здравствуйте, inok-etude, Вы писали:
IE>>Имеются два движущихся навстречу прямоугольника с вершинами А1(x1, y1) и A2(x2, y2), размерами H1, W1 и H2, W2 а также скоростями движения V1 и V2. Стороны прямоугольников параллельны осям координат. IE>>Рассчитать время столкновения двух прямоугольников.
V>Для начала проверим, что они не пересекаются. Пусть это так.
V>Тогда пусть x1 <= x2 (иначе все то же самое, только поменять 1<->2). Представим, что второй стоит на месте, а первый движется со скоростью V=(Vx,Vy)=V1-V2. Первый может въехать только в верхнюю, левую или нижнюю сторону второго. Причем, грани, в которые он может въехать зависят от его скорости по x и по y (я считаю, что ось y направлена ВНИЗ): V>* Vx <= 0 -- верхняя, нижняя V>* Vx > 0 -- все три V>* Vy < 0 -- левая, нижняя V>* Vy = 0 -- левая V>* Vy > 0 -- верхняя, левая V>Например, если его скорость Vx<=0, Vy<0, то он может въехать только в нижнюю грань.
V>Осталось проверить, въедет ли он в каждую из возможных граней. На примере левой грани (заметим, ее имеет смысл проверять только при Vx>0): если он в нее въезжает в момент t, то его правая сторона имеет ту же координату x, что и левая сторона второго квадрата: (x1+W1) + Vx*t == x2, т.е. t = (x2-x1-W1)/Vx, при этом он действительно въехал тогда и только тогда, когда его верхняя сторона не ниже нижней стороны второго квадрата, а нижняя сторона не выше верхней стороны второго квадрата: y1 + Vy*t <= y2 + H2, y1 + H1 + Vy * t >= y2, т.е. надо, чтобы H2 + H1 >= (x2 — x1 — W1) * Vy/Vx + y1 — y2 + H1 >= 0. Аналогично для двух других сторон.
Ну и забыл, конечно, добавить, что если он может "въехать" в более чем одну из возможных граней, то он въедет в ту, для которой рассчитанное время меньше.