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

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

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2018, 08:30   #11
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
или знакомый волновой алгоритм
Посмотрите ещё в сторону алгоритма A* (А стар) Ваша задача напоминает компьютерную игру, а алгоритм А* чаще всех используется для поиска пути в компьютерных играх. Наверное, не случайно. Возможно алгортм А* более эффективный раз его применяют чаще всех. Особенно, если объектов, которым нужно расчитать путь, несколько десятков или сотен.
8Observer8 вне форума Ответить с цитированием
Старый 11.03.2018, 23:56   #12
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Посмотрите ещё в сторону алгоритма A*
Посмотрел ... Из того, что я понял, я могу из точки {x0;y0} брать соседние, и смотреть в какой точке будет наименьшая разница координат с точкой {x;y}. И так до тех пор, пока не доберусь до пункта назначения. С такой реализацией можно обойтись без общей матрицы координат. Получается эдакий вариант жадного алгоритма.
И в принципе, для моей задачи такой метод тоже подходит. Он даже возможно будет проще уравнения прямой.

Но я немного отойду от темы, и пройдусь по некоторым моментам ...
1. Подобная реализация пришла мне в голову исходя из анимации на странице статьи в википедии.
2. Я так и не понял, как оценивать расстояние с учётом препятствий (в мою задачу это не входит), я не зря упомянул жадный алгоритм.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 12.03.2018, 00:33   #13
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
предварительное вычисление приращений может увести довольно далеко
Действительно ...
Цитата:
Сообщение от kvitaliy Посмотреть сообщение
рассчитываются приращения к координатам
Цитата:
Сообщение от kvitaliy Посмотреть сообщение
Пока X1 и Y1 не равны X и Y выполнять в таймере:
X1 = Xo + Xd:
Y1 = Yo + Yd:
С каким нибудь float/double при целочисленных координатах картинка может уйти налево, ну или направо, как повезёт. Я только вот дошёл до написания кода маршрута картинки, и сейчас походу буду заниматься вот этим:
Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
я могу из точки {x0;y0} брать соседние, и смотреть в какой точке будет наименьшая разница координат с точкой {x;y}
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 12.03.2018, 03:15   #14
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Чёто я сейчас прозрел ... У меня из этого получился волновой алгоритм без учёта препятствий. Картинка выравнивается по оси Y, двигаясь по кратчайшему пути к оси X по диагонали (45 градусов), а оставшийся маршрут держит прямой путь по оси X.
Вот код:
Код:
private Point NextPoint()
{
	int i=0,pCount=8;
	Point[] beside=new Point[pCount];
	beside[0]=new Point(location.X-1,location.Y-1);
	beside[1]=new Point(location.X-1,location.Y);
	beside[2]=new Point(location.X-1,location.Y+1);
	beside[3]=new Point(location.X,location.Y-1);
	beside[4]=new Point(location.X,location.Y+1);
	beside[5]=new Point(location.X+1,location.Y-1);
	beside[6]=new Point(location.X+1,location.Y);
	beside[7]=new Point(location.X+1,location.Y+1);
	double difference,min=Double.MaxValue;
	Point result=new Point();
	for (;i<pCount;i++)
	{
		difference=Math.Sqrt(
			Math.Pow(Math.Abs(beside[i].X-destination.X),2)+
			Math.Pow(Math.Abs(beside[i].Y-destination.Y),2));
		if (difference<min)
		{
			result.X=beside[i].X;
			result.Y=beside[i].Y;
			min=difference;
		} else {}
	}
	return result;
}
location - текущая позиция перед вызовом функции.
После вызова этой функции результат выбрасывается в location и в позицию контрола.
Все данные варятся в глобалке класса.
Что тут нужно поправить ?
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 12.03.2018, 09:12   #15
kvitaliy
Участник клуба
 
Регистрация: 17.05.2011
Сообщений: 1,660
По умолчанию

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
С каким нибудь float/double при целочисленных координатах картинка может уйти налево, ну или направо, как повезёт.
Ни куда не уходит. В коде используется double.
Видео в архиве
Вложения
Тип файла: zip bandicam-2018-03-12-09-57-56-602.zip (296.0 Кб, 12 просмотров)
kvitaliy вне форума Ответить с цитированием
Старый 12.03.2018, 10:35   #16
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от kvitaliy Посмотреть сообщение
Ни куда не уходит. В коде используется double.
Хорошо ... А если я вдруг захочу, что бы моя переменная destination стала вдруг меняться ?
Перед каждым приращением пересчитывать приращение норм будет ?
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 12.03.2018, 14:05   #17
kvitaliy
Участник клуба
 
Регистрация: 17.05.2011
Сообщений: 1,660
По умолчанию

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
переменная destination стала вдруг меняться
На видео видно, как я меняю конечную точку (кликом мышки по экрану) и объект сразу же меняет направление движения к новой цели по кратчайшему пути.
Естественно, после каждой смены цели движения новый пересчет.
kvitaliy вне форума Ответить с цитированием
Старый 12.03.2018, 15:22   #18
kvitaliy
Участник клуба
 
Регистрация: 17.05.2011
Сообщений: 1,660
По умолчанию

А вообще, если надо искать кратчайший путь, то есть специальные алгоритмы.
Вот волновой, как раз для C# есть код
kvitaliy вне форума Ответить с цитированием
Старый 13.03.2018, 11:32   #19
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Но всё же, я хочу разобраться, почему эта функция в итоге даёт не прямую, а сначала выравнивает по ближайшей оси ...
Код:
private Point NextPoint()
{
	int i=0,pCount=8;
	Point[] beside=new Point[pCount];
	beside[0]=new Point(location.X-1,location.Y-1);
	beside[1]=new Point(location.X-1,location.Y);
	beside[2]=new Point(location.X-1,location.Y+1);
	beside[3]=new Point(location.X,location.Y-1);
	beside[4]=new Point(location.X,location.Y+1);
	beside[5]=new Point(location.X+1,location.Y-1);
	beside[6]=new Point(location.X+1,location.Y);
	beside[7]=new Point(location.X+1,location.Y+1);
	double sideA,sideB,difference,min=Double.MaxValue;
	Point result=new Point();
	for (;i<pCount;i++)
	{
		sideA=Math.Abs(beside[i].X-destination.X);
		sideB=Math.Abs(beside[i].Y-destination.Y);
		difference=Math.Sqrt(sideA*sideA+sideB*sideB);
		if (difference<min)
		{
			result.X=beside[i].X;
			result.Y=beside[i].Y;
			min=difference;
		} else {}
	}
	return result;
}
Ведь по сути, я для каждого соседа смотрю, кто ближе всего к цели, причём по длинам гипотенуз (на каждом шаге новый треугольник).
Передавая привет Валерию:
Цитата:
Сообщение от waleri Посмотреть сообщение
вам надо двигаться по гипотенузе
А вообще, я вижу в этом движение по гипотенузе, упрощённую реализацию A* (наименьшая стоимость, оценивается расстоянием), а так же частный случай волнового алгоритма (там тоже соседей опрашивают).
Вот мне интересно: почему это не работает как предполагается ?

Оффтопп: программист предполагает, а компьютер располагает.
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 13.03.2018 в 11:36.
OmegaBerkut вне форума Ответить с цитированием
Старый 13.03.2018, 12:21   #20
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Но всё же, я хочу разобраться, почему эта функция в итоге даёт не прямую, а сначала выравнивает по ближайшей оси ...
потому что вы сразу же забываете об исходной точке(откуда НАЧАТО движение). Всегда используете "текущее" положение.
а так все верно. САМАЯ ближайшая (первая) точка ВСЕГДА будет лежать на ближайшей оси (кроме случая РАВНОудаленных осей, т.е. диагонали )
и только следующая итерация(накопление НЕЦЕЛОГО <0.5 ) смещения может привести к НЕНУЛЕВОМУ смещению по "дальней" оси.
позицию надо рассчитывать ВСЕГДА от начальной точки (точки смены направления движения).
00.PNG
вторая точка окажется лучшей для движения по прямой соединяющей текущую(ее САМУ) и конечную, но ... это совсем ДРУГАЯ прямая.
и только когда прямая соединяющая ТЕКУЩУЮ и конечную точки "доcтигнет" диагонали начнется движение СТРОГО по ней.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 13.03.2018 в 12:47.
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
JavaScript:движение объекта по траектории Ayanami Помощь студентам 8 18.11.2014 21:45
Движение объектов по траектории Vladlena Общие вопросы C/C++ 0 19.05.2013 18:38
Движение объекта по квадратной траектории oblomok C# (си шарп) 5 08.07.2012 23:13
Движение объекта по искривленной траектории ZvEr_HaCkEr Gamedev - cоздание игр: Unity, OpenGL, DirectX 6 25.06.2011 05:36