![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 23.03.2015
Сообщений: 24
|
![]()
Приветствую!
Собственно сабж: есть поле, на котором в определенных точках появляются объекты (шарики), соответственно у них есть координаты х и у, заданные изначально. Вот я не могу сообразить, какую функцию можно использовать, чтобы шарики двигались в случайно заданном направлении, так же случайно меняя направление движения через некоторое время. Собственно сам код не нужен, нужен алгоритм движения на любом языке, дальше сам разберусь. Пока что шарик или катается туда-сюда (при использовании синуса) или прыгает туда-сюда, постепенно продвигаясь в одном направлении (при использовании рандомных чисел). |
![]() |
![]() |
![]() |
#2 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]()
Я бы сделал шары объектом. Задавал случайно (x,y) точки назначения, и навесил бы событие на достижение этой точки, которое бы генерировало новую точку случайным образом и запускало механизм движения.
I'm learning to live...
|
![]() |
![]() |
![]() |
#3 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,899
|
![]()
Задавать случайно точку назначения не совсем корректно - одна из координат должна повторять координату точки, на которой стоим сейчас, если движение только по ортогоналям, а если ещё и по диагоналям, то генерировать случайно надо не точку а две дельты координат с одной длиной, иначе же путь движения по клеткам придётся рассчитывать ещё по , например, алгоритму Брезенхема.
Я бы предложил немного другой вариант: на старте и на событии смены движения выбираем случайно либо длину либо направление (в зависимости от того, какую модель хотим приоретизировать), если длину, то можно сразу предусмотреть невыход за границы поля, отсеивая недоступные направления, если же направление, то бросать случайное число ходов в данном направлении, опять же с учётом невыхода за границы поля. На втором шаге рандомизируем то, что не выбрали на первом шаге - дальность или направление. Как выбирать направление - я предлагаю оператором выбора, требуется одна вводная для такого алгоритма - только ортогонали или ещё и диагонали надо (ещё есть редкий вариант - только диагонали, кстати). Рассмотрим общий (все направления) - кидаем от целое 0 до 1 - выбираем первичную координату (тоже зависит от желаемой модели, можно и зафиксировать, что хотим сперва х или у), этот приём просто позволит не перебрасывать случчисло, если выпадет 0\0. На выбранную первичную координату кидаем целое от -1 до 1 (0-2), в случае 0 на вторую кидаем на -1 или на 1 (0-1) , иначе тоже от -1 до 1. (для только ортогоналей ислючаем вариант когда дельты одновременно 0 или одновременно не ноль) В итоге получаем две дельты координат, их запоминаем со счётчиком ходов (дальности), запоминаем в структуру\объект, и каждый ход двигаем шарик на эти дельты, уменьшая счетчик, на 0 счетчика снова производим расчёт. Случайно число кидать стандартными функциями языка, учитывая какой диапазон нужен, и обрабатываем, например вычитать единицу, или для варианта -1 или 1 можно (0 или 1)*2-1 Последний раз редактировалось phomm; 31.08.2015 в 15:37. |
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 30.06.2015
Сообщений: 353
|
![]() Код:
![]() |
![]() |
![]() |
![]() |
#5 |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,328
|
![]()
Проще, быстрее и безопаснее (в плане ошибок) сделать с применением физического движка. Например, я сделал на игровом движке Unity, который использует физический движок PhysX от NVIDIA.
Сделал быстро: - добавил шариков - растянул квадраты, чтобы сделать границы - поставил гравитацию в ноль - написал скрипт на C#, который висит на каждом шарике и меняет ему компоненты вектора скорости на случайную величину: [1, 10], через случайное время: [2, 10] секунд.
Последний раз редактировалось 8Observer8; 01.09.2015 в 15:03. |
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 09.02.2013
Сообщений: 60
|
![]()
Генерируешь число от 0 до 360 - вот тебе и направление.
Чтоб менять направление делаешь таймер(например каждые 2 секунды), также таймер тоже можно реализовать через рандомное значение(чтоб каждый раз был новый интервал), например: от 3 до 7 секунд) Или можно завести отдельную переменную, которая инкрементится когда шарик перемещается и проверку типа: если а > 100 (метод перемещения вызвался больше сто раз) тогда: { а = 0 генерируем новый угол } |
![]() |
![]() |
![]() |
#7 |
Участник клуба
Регистрация: 30.07.2008
Сообщений: 1,609
|
![]()
x, y натуральные или вещественные?
Если x,y натуральные, то решение такое Код:
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
|
![]() |
![]() |
![]() |
#8 |
Участник клуба
Регистрация: 30.07.2008
Сообщений: 1,609
|
![]()
Если x,y вещественные, то решение такое
Код:
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
|
![]() |
![]() |
![]() |
#9 |
Участник клуба
Регистрация: 30.07.2008
Сообщений: 1,609
|
![]()
Строить алгоритмы без проверки в программе, я не умею.
Алгоритмы на псевдокоде же пишутся. Если почитаете книгу "дискретная математика для программиста" Новикова, то увидите, что там используется псевдокод для описания алгоритма. То есть реальный код это способ описания алгоритма. А чем реальный код хуже псевдокода? В winapi система координат целочисленная. Вещественная модель может потребоваться в компьютерных играх или в двухмерной графике. Дано: точка с координатами x, y, угол alpha [0,360]. Задача: переместить точку в направлении луча, определяемого углом alpha. Что за угол alpha? Каким образом отсчитывается угол alpha? Что является нулевым углом alpha? Построить систему координат. Центр системы координат - точка x, y. Каким образом задаются оси Ox, Oy системы координат, нулем которой является точка x,y относительно системы координат окна OX, OY? Пусть OX, OY - система координат окна. Пусть Ox, Oy - новая система координат, относительно которой будет отсчитываться угол alpha. Какие векторы определяют оси Ox, Oy новой системы координат относительно системы координат OX, OY? Если длина вектора оси Ox имеет единичный размер (0, 0) в (Ox, Oy) отображается в (x,y) в (OX, OY) (0, 1) в (Ox, Oy) отображается в (x,y-1) в (OX, OY) // вектор (0, 1) (1, 0) в (Ox, Oy) отображается в (x+1,y) в (OX, OY) // вектор (1, 0) Угол alpha отсчитывается от положительного направления оси Ox в направлении оси Oy. Нулевой угол alpha - ось Ox. Если рассматриваем единичную окружность, то один катет будет sin(alpha), а другой катет будет cos(alpha). При использовании gdi координатная сетка целочисленная, поэтому производится округление до целой части вверх или вниз. sin(alpha) и cos(alpha) это координаты перемещения изначально заданной точки. Длину гипотенузы берем произвольно, тогда один катет будет равен r* sin(alpha), а другой r*cos(alpha).
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Движение картинки по форме при нажатии клавиши (любой) | mihaillo | Общие вопросы Delphi | 3 | 04.03.2018 19:18 |
Актуальный язык программирования или в каком направлении развиваться | cristianoman | Свободное общение | 11 | 09.06.2014 00:12 |
Программа кластеризации ( язык любой) | Payten | Фриланс | 0 | 12.05.2014 08:46 |
решить задачу, используя любой алгоритм и любой язык программирования | oncheva | Помощь студентам | 0 | 24.12.2012 18:07 |
Интересная задача, реализация временных логик (любой логики), язык любой. | Flyym | Помощь студентам | 1 | 05.01.2011 03:10 |