forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Основной форум (http://forum.boolean.name/forumdisplay.php?f=49)
-   -   360 Градусов (http://forum.boolean.name/showthread.php?t=14167)

Gector 03.02.2011 12:50

360 Градусов
 
Код:

    DX:=pointer_x-first_pointer_x;
    DY:=pointer_y-first_pointer_y;
    angle:=ToDegrees(atan2(DY,DX));

Вот этот вобщем-то простейший код нахождения угла отрезка выдает какой то непонятный результат. Угол 180 градусов который по смыслу должен быть параллелен оси Х проходит диагональю:4to:.
Можно ли вернуть угол отрезка в градусах от 0 до 360? Или от 0 до 180(-180)

Mr_F_ 03.02.2011 15:56

Ответ: 360 Градусов
 
не знаю что за мидлет и что за ToDegrees, atan2 сам по себе возвращает угол, возможно тебе надо ещё нормализовать DX и DY

ViNT 03.02.2011 16:00

Ответ: 360 Градусов
 
Зачем используете Atan2? Он служит для конвертирования прямоугольных координат в полярные.
Нужно использовать Atan, он как раз выдает угол от -pi/2 до pi/2 (в радианах).

Gector 06.02.2011 01:08

Ответ: 360 Градусов
 
Вложений: 1
Всё). Не могу больше). Не получается применить старые проверенные еще флешем коды... Не пойму в чем дело.
Как сделать полет снаряда через координаты двух точек?)
Вроде того что на картинке.

impersonalis 06.02.2011 02:33

Ответ: 360 Градусов
 
1. определить тип аппроксимирующей кривой, описвающей траекторию.
2. вычислить праметры, задающие кривую
3. записать уравнения координат тела.

1. прямая линия. уравнение вида y(x)=kx+b
2. два параметра, две заданных точки
y1=k*x1+b
y2=k*x2+b
решаем систему, находим k и b.
3. y(t)=yn+sin(a)*t
x(t)=xn+cos(a)*t
a=k, хn=x1, yn=y1
b нужно для решения системы (2), в дальнейшем компенсируется значениями (xn;yn), т.к. характеризует вертикальный сдвиг прямой (перенос по оси 0Y). [можно перписать в виде y(t)=xn+sin(a)*t+b].
3.1. а можно сразу выразить как atan2[(y2-y1),(x2-x1)]. Внимание: в разных языках значение первого и второго аругмента может быть инвертировано (т.е. где-то f(x,y), а где-то f(y,x) - обязательно прочесть инструкцию).
Примечание: надо отметить, что знак зависимой части в уравнении для ординаты, завист от ориентации вертикальной оси интерфейса вывода (как правило, не совпадает с классической математической).
Примечание: ряд задач может требовать рекурентное задние уравнений (3).

Gector 06.02.2011 10:09

Ответ: 360 Градусов
 
Цитата:

Сообщение от impersonalis (Сообщение 178038)
1. определить тип аппроксимирующей кривой, описвающей траекторию.
2. вычислить праметры, задающие кривую
3. записать уравнения координат тела.

1. прямая линия. уравнение вида y(x)=kx+b
2. два параметра, две заданных точки
y1=k*x1+b
y2=k*x2+b
решаем систему, находим k и b.
3. y(t)=yn+sin(a)*t
x(t)=xn+cos(a)*t
a=k, хn=x1, yn=y1
b нужно для решения системы (2), в дальнейшем компенсируется значениями (xn;yn), т.к. характеризует вертикальный сдвиг прямой (перенос по оси 0Y). [можно перписать в виде y(t)=xn+sin(a)*t+b].
3.1. а можно сразу выразить как atan2[(y2-y1),(x2-x1)]. Внимание: в разных языках значение первого и второго аругмента может быть инвертировано (т.е. где-то f(x,y), а где-то f(y,x) - обязательно прочесть инструкцию).
Примечание: надо отметить, что знак зависимой части в уравнении для ординаты, завист от ориентации вертикальной оси интерфейса вывода (как правило, не совпадает с классической математической).
Примечание: ряд задач может требовать рекурентное задние уравнений (3).

У меня как раз с третьим методом проблема. Код выглядит примерно так(без паскалевского синтаксиса)
Код:

DelthaY=y2-y1
DelthaY=x2-x1
Angle=Atan2(DelthaY,DelthaX)*180/Pi
SpeedX=cos(Angle)*10;
SpeedY=sin(Angle)*10;
ProjectileX=ProjectileX+SpeedX
ProjectileY=ProjectileY+SpeedY

Вот этим кодом я пользовался еще с флеша. В паскале с ним какая то фигня. Угол получается мягко говоря странным.
Первые два метода еще не пробовал, спасибо. Надо над ними подумать.

Gector 06.02.2011 10:35

Ответ: 360 Градусов
 
Вложений: 1
Во вложении jar файл с той фигней которую он мне выдает.
З.ы. Извините, но нормальный выход из приложения еще не готов).

Igor 06.02.2011 11:18

Ответ: 360 Градусов
 
Цитата:

1. прямая линия. уравнение вида y(x)=kx+b
2. два параметра, две заданных точки
y1=k*x1+b
y2=k*x2+b
Есть исключение-вертикальная линия
С точки зрения матаматики более точно было бы ax+by+c=0
Получаются 2 уравнения с 3 неизвестными, но они решаются.

Второй вариант-сделать вектор из первой точки во вторую.
Процедура даёт координаты точки(тебе ведь точка нужна?) на векторе, на расстоянии K от x1,y1
procedure xy_point(x1,y1,x2,y2,k:integer);
var L,mn:real;
x,y:real;
begin
//находим длину вектора
L:=sqrt(sqr(x1-x2)+sqr(y1-y2));
//смотрим во сколько раз длина больше нужной
mn:=K/L;
x:=x1+(x2-x1)*mn;
y:=y1+(y2-y1)*mn;
//х и у - координаты точки, делай с ними что хочешь)
end;

Инструкция:
запусти несколько раз, увеличивая k - точка полетит от x1,y1 до (и дальше тоже) x2,y2. При отрицательном К полетит в другую сторону.

Gector 06.02.2011 11:29

Ответ: 360 Градусов
 
Спасибо. Попробую с точкой. Но вообще так мне нужна скорость. Мой метод основывается на поиске множителя скорости от 0 до 1 с помощью синуса угла между первой и второй точкой. Но не получилось. Угол не тот выдает.

Gector 06.02.2011 15:55

Ответ: 360 Градусов
 
Вы будете смеяться но я нашел изящное до тупости решение проблемы.
Код:

YSpeed:=(pointer_y-first_pointer_y)/10;
YSpeed:=(pointer_x-first_pointer_x)/10;

Капец:crazy:

impersonalis 06.02.2011 16:06

Ответ: 360 Градусов
 
Код:

Angle=Atan2(DelthaY,DelthaX)*180/Pi
SpeedX=cos(Angle)*10;

не бывает в нормальных ЯП такого, что обратные функции возвращают угол в градусах, а прямые принимают его в радианах и наоборот.
Код:

Angle=Atan2(DelthaY,DelthaX)
...cos(Angle)...

И твоё "решение" это просто использование масштабного коэффициента, компенсирующего предшествующее (ненужное!) умножение.

Цитата:

Сообщение от Igor (Сообщение 178054)
Есть исключение-вертикальная линия
С точки зрения матаматики более точно было бы ax+by+c=0

1.А для кого я про Атан2 написал?
2.Не "более точно", а в "каноническом виде"

Gector 06.02.2011 16:15

Ответ: 360 Градусов
 
Это решение(Предыдущее моё с арктангенсом) было в книге Джоба Макара по флешу. Использовал я его просто как проверенное. В любом случае всем спасибо).

impersonalis 06.02.2011 16:16

Ответ: 360 Градусов
 
Ну я же написал
Цитата:

не бывает в нормальных ЯП

Gector 06.02.2011 16:32

Ответ: 360 Градусов
 
Если честно мне это ни о чем не говорит. Например?


Часовой пояс GMT +4, время: 19:11.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot