Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2013, 16:44   #21
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 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.
Abstraction вне форума Ответить с цитированием
Старый 28.03.2013, 17:31   #22
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Abstraction, ну в таком случае тогда проще поставить бульку, как Sciv говорил. Пусть и не так элегантно, зато нет геморроя.
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 28.03.2013, 17:37   #23
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 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.
phomm вне форума Ответить с цитированием
Старый 28.03.2013, 17:46   #24
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 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 - кол-во итераций до столкновения
Код:
пока Iter > 1 begin
  рисум окружность в новой точке через dt
  Iter = Iter - 1
end
через (dt * Iter) рисуем окружность в точке X
5. Определяем вектор отражения
6. Начинаем заново с пункта 2

Последний раз редактировалось Sibedir; 28.03.2013 в 17:57.
Sibedir вне форума Ответить с цитированием
Старый 28.03.2013, 18:12   #25
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Цитата:
Останется только из 2 нормалей к прямой выбрать нужную.
Вот теперь загвоздка в этом - как выбрать нужную.

Цитата:
Может есть смысл заранее рассчитать время соударения.
Возможно, есть смысл. Но тут добавляется проблема в виде того, что за это время шарик может столкнуться с другим движущимся шариком. И это все надо отследить.
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 28.03.2013, 18:28   #26
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Выбрать нужную можно по тому, что я сейчас грубо опишу:
у самого шарика помимо скорости должно быть и размещение. У самой прямой (стены) тоже есть размещение. Берём любую точку на ней, складываем с одной нормалью и со второй, получаем 2 точки в пространстве (возле стены/прямой как бы, с разных сторон от неё), находим 2 расстояния меж каждой из них и размещением шарика, какое меньше - та точка значит получена из нужной нормали, т.е. шарик с этой стороны.

Вот кстати даже интересная мысль появилась - если найти вектор перпендикуляра опущенного на прямую из размещения шарика, то прямо с ним и "дотить", ведь он также
будет нормалью (ну или антинормалью, направленной в прямую). И надобность в выборе нормали отпадает.

Последний раз редактировалось phomm; 28.03.2013 в 18:35.
phomm вне форума Ответить с цитированием
Старый 28.03.2013, 18:44   #27
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 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.
Sibedir вне форума Ответить с цитированием
Старый 28.03.2013, 20:03   #28
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от ACE Valery Посмотреть сообщение
Возможно, есть смысл. Но тут добавляется проблема в виде того, что за это время шарик может столкнуться с другим движущимся шариком. И это все надо отследить.
Как раз мысль о просчете времени соударения, по сути, описывает единственно верный алгоритм перемещения объекта в пространстве с учетом его взаимодействия с препятствиями.
Естественно, нужно просчитывать и возможность столкновения с другими объектами - тем же способом.
Каждое время возможного столкновения (с каждым из объектов, включая стены) нужно сравнить с шагом по времени. Если больше - игнорируем. Если меньше - запоминаем (в массиве, списке, очереди...), а потом, после перебора всех объектов, выбираем наименьшее и по нему считаем движение.
s-andriano вне форума Ответить с цитированием
Старый 29.03.2013, 13:03   #29
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Чейто я снова туплю. Есть шар с радиусом 10 пикселей. Есть расстояние до прямой - 13 пикселей. На следующем ходу шар подвинется на сколько-то по х и на сколько-то по у, что расстояние от центра до прямой станет 8 пикселей. Т.е. я знаю, что на следующем ходу у меня будет столкновение со стеной. Чтоб не заходить за нее, мне нужно подвинуть шар на столько, чтоб расстояние до прямой было 10 пикселей, отразиться и "уплыть" в другую сторону на оставшееся число пикселей.
Как узнать координаты центра шара, при котором расстояние между ним и прямой будет равно радиусу?
Думала, сделать это с помощью прямоугольного треугольника (действие, обратное поиску расстояния), но не могу нигде найти, можно ли вообще узнать координаты вершины, зная длину стороны, координаты одной точки и угол...


З.Ы. Ребят, может, я сейчас и глупость сморожу, но я не считаю правильным высчитывать, через сколько времени что-то столкнется с чем-то. Потому что во-первых, скорость каждого из шаров постоянно меняется, во-вторых, какого-то из шариков может не стать, в-третьих, юзверь может послать шарик по другой траектории. Не вижу смысла нагружать этими бесконечными вычислениями проц.
Я делаю так: смотрю, а столкнемся ли мы на следующем ходу с кем-то из существующих на сцене предметов. Нет - двигаю, отрисовываю. Да - показываю столкновение, отражаю, двигаю дальше, отрисовываю. Для чего каждый момент времени пересчитывать время столкновения всех со всеми, если это столкновение, возможно, даже и не произойдет?
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать

Последний раз редактировалось ACE Valery; 29.03.2013 в 13:12.
ACE Valery вне форума Ответить с цитированием
Старый 29.03.2013, 13:21   #30
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

1.
Цитата:
узнать координаты вершины, зная длину стороны, координаты одной точки и угол
Код:
x := L*cos(a)
y := L*sin(a)
2.
Цитата:
Как узнать координаты центра шара, при котором расстояние между ним и прямой будет равно радиусу?
см. выше
Цитата:
Внутри исходного контура рисуем параллельный ему контур ABC... с отступом R.
Т.е. точка пересечения траектории движения центра окружности и нового контура и есть точка отражения.
3.
Цитата:
Чтоб не заходить за нее, мне нужно подвинуть шар на столько, чтоб расстояние до прямой было 10 пикселей, отразиться и "уплыть" в другую сторону на оставшееся число пикселей.
Для этого и делаем
Цитата:
Iter = L/dL - кол-во итераций до столкновения
Код:
пока Iter > 1 begin
  рисум окружность в новой точке через dt
  Iter = Iter - 1
end
через (dt * Iter) рисуем окружность в точке X
Было 13, стало 8 -> dL = 5
L = 13-10 = 3
Iter = 3/5 = 0.6
Если, скажем, за 100 мс шар сдвигается на 5, то за 100*0,6=60 мс он сдвинется на 3 -> следующее положение шара нужно показать ч/з 60 мс, а не ч/з 100.
Sibedir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
векторная алгебра 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