|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
28.03.2013, 16:44 | #21 | |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
Цитата:
Скажем, у нас есть линия 4x-3y+7=0 и шар в норме в положительной полуплоскости. Тогда для вектора (Vx,Vy) всегда 4Vx-3Vy<0 означает, что шарик идёт в "неправильном" направлении. Если текущие координаты шарика (x0,y0) и удар фиксируется на расстоянии 0.5 от стены, то условие того, что пора отбивать - шарик идёт в "неправильном" направлении и 0.8*x0-0.6*y0+1.4 < 0.5. |
|
28.03.2013, 17:31 | #22 |
Сама себе режиссер
Старожил
Регистрация: 27.04.2007
Сообщений: 3,365
|
Abstraction, ну в таком случае тогда проще поставить бульку, как Sciv говорил. Пусть и не так элегантно, зато нет геморроя.
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
|
28.03.2013, 17:37 | #23 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,882
|
Ну вот, всё таки пришли к выводу, что прямая и вектор не пересекаются, а либо вне прямой, либо касается её.
Тогда можно сделать довольно просто. Знак скалярного произведения вектора скорости шарика на нормаль к стене даст полную картину. Беря за пример Ваш рисунок, видим, что вектор на стену -1;1 а нормаль к стене 0;-1 , посчитаем: Dot (new Vector(-1, 1), new Vector(0, -1)) == -1 это значит разнонаправлены, и шарик летит к стене. Для второго вектора, от стены который, будет Dot (new Vector(-1, -1), new Vector(0, -1)) == 1, что значит сонаправленны, т.е. летит от стены. 0 – перпендикулярны соответственно. Останется только из 2 нормалей к прямой выбрать нужную. Ибо на том же рисунке вторая нормаль это 0;1 и будет давать противоположные результаты. Саму нормаль считать даже особо не надо: это вектора из коэффициентов A;B и -A;-B (для обоих нормалей) из уравнения прямой Ax+By+C=0 . Для удобства можно пронормировать - поделить на длину получаемого вектора нормали. Ezhik Kihze , не понимаю Ваших претензий ) Вектор он без размещения, о чём я непосредственно указал, добавив про 0/0, я, конечно, не имел ввиду что он именно там, а указал оное для простоты представления о его "начальной точке", в том каюсь. Остальные вопросы видимо были для случая касания «вектора» и прямой, но я специально указал и подчеркнул, что у меня вопросы и ответы именно про случай пересечения, а не касания. Последний раз редактировалось phomm; 28.03.2013 в 17:46. |
28.03.2013, 17:46 | #24 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
Может есть смысл заранее рассчитать время соударения.
Пусть есть контур точек (для просторы - выпуклый), окружность радиуса R с центром в точке P0(x0,y0) (внутри контура) и вектор её движения (dx,dy). Задан интервал времени dt, ч/з который отображается положение окружности. Т.е. ч/з единицу времени dt координаты центра станут P1.x = P0.x + dx, P1.y = P0.y + dy). 1. Внутри исходного контура рисуем параллельный ему контур ABC... с отступом R. 2. Определяем c какой из граней нового контура пересекается луч (P0, P1). точка пересечения X. - берем грань AB - ищем точку пересечения X = прямая (A, B) пересекает прямую (P0, P1) - если A и B по одну сторону от X, то нет пересечения прямой (P0, P1) с гранью (A, B) и ищем дальше, иначе есть - если X и P1 по одну сторону от P0, то есть пересечение луча (P0, P1) с гранью (A, B), иначе нет и ищем дальше 3. dL = (dx^2 + dy^2)^0.5 - путь за время dt L = ((X.x-P0.x)^2 + (X.y-P0.y)^2)^0.5 - расстояние до пересечения 4. Iter = L/dL - кол-во итераций до столкновения Код:
6. Начинаем заново с пункта 2 Последний раз редактировалось Sibedir; 28.03.2013 в 17:57. |
28.03.2013, 18:12 | #25 | ||
Сама себе режиссер
Старожил
Регистрация: 27.04.2007
Сообщений: 3,365
|
Цитата:
Цитата:
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
|
||
28.03.2013, 18:28 | #26 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,882
|
Выбрать нужную можно по тому, что я сейчас грубо опишу:
у самого шарика помимо скорости должно быть и размещение. У самой прямой (стены) тоже есть размещение. Берём любую точку на ней, складываем с одной нормалью и со второй, получаем 2 точки в пространстве (возле стены/прямой как бы, с разных сторон от неё), находим 2 расстояния меж каждой из них и размещением шарика, какое меньше - та точка значит получена из нужной нормали, т.е. шарик с этой стороны. Вот кстати даже интересная мысль появилась - если найти вектор перпендикуляра опущенного на прямую из размещения шарика, то прямо с ним и "дотить", ведь он также будет нормалью (ну или антинормалью, направленной в прямую). И надобность в выборе нормали отпадает. Последний раз редактировалось phomm; 28.03.2013 в 18:35. |
28.03.2013, 18:44 | #27 | |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
Цитата:
1. Для каждой пары шариков определяем уравнение сближения L(t) 2. Решаем L(t) - 2R = 0. 3. Полученное t сравниваем со временем до соударения полученным ранее (t_min) Если 0 < t < t_min, то это соударение произойдет раньше (t_min := t) 4. Исследуем следующую пару. Можно упростить задачу отбрасывая заведомо несостоятельные соударения. Последний раз редактировалось Sibedir; 28.03.2013 в 20:30. |
|
28.03.2013, 20:03 | #28 | |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
Цитата:
Естественно, нужно просчитывать и возможность столкновения с другими объектами - тем же способом. Каждое время возможного столкновения (с каждым из объектов, включая стены) нужно сравнить с шагом по времени. Если больше - игнорируем. Если меньше - запоминаем (в массиве, списке, очереди...), а потом, после перебора всех объектов, выбираем наименьшее и по нему считаем движение. |
|
29.03.2013, 13:03 | #29 |
Сама себе режиссер
Старожил
Регистрация: 27.04.2007
Сообщений: 3,365
|
Чейто я снова туплю. Есть шар с радиусом 10 пикселей. Есть расстояние до прямой - 13 пикселей. На следующем ходу шар подвинется на сколько-то по х и на сколько-то по у, что расстояние от центра до прямой станет 8 пикселей. Т.е. я знаю, что на следующем ходу у меня будет столкновение со стеной. Чтоб не заходить за нее, мне нужно подвинуть шар на столько, чтоб расстояние до прямой было 10 пикселей, отразиться и "уплыть" в другую сторону на оставшееся число пикселей.
Как узнать координаты центра шара, при котором расстояние между ним и прямой будет равно радиусу? Думала, сделать это с помощью прямоугольного треугольника (действие, обратное поиску расстояния), но не могу нигде найти, можно ли вообще узнать координаты вершины, зная длину стороны, координаты одной точки и угол... З.Ы. Ребят, может, я сейчас и глупость сморожу, но я не считаю правильным высчитывать, через сколько времени что-то столкнется с чем-то. Потому что во-первых, скорость каждого из шаров постоянно меняется, во-вторых, какого-то из шариков может не стать, в-третьих, юзверь может послать шарик по другой траектории. Не вижу смысла нагружать этими бесконечными вычислениями проц. Я делаю так: смотрю, а столкнемся ли мы на следующем ходу с кем-то из существующих на сцене предметов. Нет - двигаю, отрисовываю. Да - показываю столкновение, отражаю, двигаю дальше, отрисовываю. Для чего каждый момент времени пересчитывать время столкновения всех со всеми, если это столкновение, возможно, даже и не произойдет?
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
Последний раз редактировалось ACE Valery; 29.03.2013 в 13:12. |
29.03.2013, 13:21 | #30 | |||||
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
1.
Цитата:
Код:
Цитата:
Цитата:
3. Цитата:
Цитата:
L = 13-10 = 3 Iter = 3/5 = 0.6 Если, скажем, за 100 мс шар сдвигается на 5, то за 100*0,6=60 мс он сдвинется на 3 -> следующее положение шара нужно показать ч/з 60 мс, а не ч/з 100. |
|||||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
векторная алгебра | KIRILOW | Помощь студентам | 61 | 31.10.2012 15:45 |
LNK1561 (векторная программа) | finz | Помощь студентам | 6 | 20.05.2011 18:01 |
Векторная графика | AnReykfi | Помощь студентам | 0 | 15.05.2010 14:10 |
векторная графика. квадрат | varelik | Мультимедиа в Delphi | 18 | 07.09.2009 22:25 |
Векторная графика в C++ Builder 6 | Max2114 | C++ Builder | 3 | 19.01.2009 14:56 |