Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Из т.А в т.В двигаясь по Sin


Автор: СерегаГоляков 2.10.2013, 15:17
Есть две известные точки х0,у0 и х1,у1

Необходимо из  х0,у0 попасть в х1,у1, двигаясь змейкой.

Максимум на что меня хватило это вычислить угол между точками и горизонталью:

Код

double A = Math.Atan2( y-y0, x - x0) * 180/ Math.PI ;
A = (A < 0) ? A + 360 : A;

И то вычисляется против часой стрелки, наверно для каждой четверти надо по своему считать.

Подскажите формулки, пожалуйста.

Автор: Pavia 2.10.2013, 15:51
v=(x1-x0)/(t1-t0); // вычисляем скорость от заданного времени
Alfa=Math.Atan2( y1-y0, x1 - x0); // вычисляем угол поворота.

dt=(GetTickCount()-LastTickCount)/1000; // измеряем время, так как оно течёт не равномерно

// Вычисляем наши координаты относительно точки старта.
p.x=v*dt;
p.y=sin(x);

Вращаем относительно этой точки

Rotate(p,Alfa);

// Переносим систему координат из системы объекта в мировую.
p.x=p.x+x0;
p.y=p.y+y0;

t=t+dt;
if (t>=t1) { // проверяем время
p.x=x1;
p.y=y1;

  

Здесь
Rotate(p,Alfa);
//Обычное вращение точки относительно начала координат.
// Заполняем матрицу вращения
M[0,0]=+cos(Alfa); M[0,1]=-Sin(Alfa);
M[1,0]=+Sin(Alfa); M[1,1]=+cos(Alfa);
// запоминаем временную переменную.
tempP=p;
// Умножаем матрицу на вектор 
p.x:=tempP.x*M[0,0]+tempP.y*M[1,0];
p.y:=tempP.x*M[0,1]+tempP.y*M[1,1];

Автор: _Y_ 2.10.2013, 16:28
Задача поставлена как-то некорректно. По двум точкам можно провести чертову уйму синусоидал'ных змеек. Например, прямая, соединяющая 2 точки тоже может быт' описана синусом, но с очен' бол'шим периодом.

Какая змейка нужна-то?

Автор: Lipetsk 3.10.2013, 08:34
может быть речь о http://ru.wikipedia.org/wiki/%D0%95%D1%81%D1%82%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F?

Автор: СерегаГоляков 5.10.2013, 05:38
Необходимо постепенно измерять координаты, чтобы в результате переместиться из точки А в точку В двигаясь не по прямой, а красиво змейкой.

Автор: _Y_ 5.10.2013, 11:59
Ну, есил Вам все равно какая будет змейка, лишь бы красиво, то можно сделать очень просто. Примерно так.
  • Разворачиваете систему координат так, чтобы обе точки лежали на оси X.
  • Строите в этой новой системе координат синусоиду, выбрав ее период так, чтобы между двумя точками поместилось целое число полупериодов.
  • Разворачиваете построенную синусоиду в исходную систему координат.
  • Выводите результат поточечно - плавно и красиво.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)