|
Основной форум Сюда все проблемы связанные с программированием. |
03.02.2011, 12:50
|
#1
|
Легенда
Регистрация: 14.10.2007
Сообщений: 3,878
Написано 2,012 полезных сообщений (для 5,072 пользователей)
|
360 Градусов
DX:=pointer_x-first_pointer_x;
DY:=pointer_y-first_pointer_y;
angle:=ToDegrees(atan2(DY,DX));
Вот этот вобщем-то простейший код нахождения угла отрезка выдает какой то непонятный результат. Угол 180 градусов который по смыслу должен быть параллелен оси Х проходит диагональю .
Можно ли вернуть угол отрезка в градусах от 0 до 360? Или от 0 до 180(-180)
__________________
Ибо как сказал Бгдн:
|
(Offline)
|
|
03.02.2011, 15:56
|
#2
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: 360 Градусов
не знаю что за мидлет и что за ToDegrees, atan2 сам по себе возвращает угол, возможно тебе надо ещё нормализовать DX и DY
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
03.02.2011, 16:00
|
#3
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Ответ: 360 Градусов
Зачем используете Atan2? Он служит для конвертирования прямоугольных координат в полярные.
Нужно использовать Atan, он как раз выдает угол от -pi/2 до pi/2 (в радианах).
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
06.02.2011, 01:08
|
#4
|
Легенда
Регистрация: 14.10.2007
Сообщений: 3,878
Написано 2,012 полезных сообщений (для 5,072 пользователей)
|
Ответ: 360 Градусов
Всё). Не могу больше). Не получается применить старые проверенные еще флешем коды... Не пойму в чем дело.
Как сделать полет снаряда через координаты двух точек?)
Вроде того что на картинке.
__________________
Ибо как сказал Бгдн:
|
(Offline)
|
|
06.02.2011, 02:33
|
#5
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: 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).
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
06.02.2011, 10:09
|
#6
|
Легенда
Регистрация: 14.10.2007
Сообщений: 3,878
Написано 2,012 полезных сообщений (для 5,072 пользователей)
|
Ответ: 360 Градусов
Сообщение от impersonalis
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
Вот этим кодом я пользовался еще с флеша. В паскале с ним какая то фигня. Угол получается мягко говоря странным.
Первые два метода еще не пробовал, спасибо. Надо над ними подумать.
__________________
Ибо как сказал Бгдн:
|
(Offline)
|
|
06.02.2011, 10:35
|
#7
|
Легенда
Регистрация: 14.10.2007
Сообщений: 3,878
Написано 2,012 полезных сообщений (для 5,072 пользователей)
|
Ответ: 360 Градусов
Во вложении jar файл с той фигней которую он мне выдает.
З.ы. Извините, но нормальный выход из приложения еще не готов).
__________________
Ибо как сказал Бгдн:
|
(Offline)
|
|
06.02.2011, 11:18
|
#8
|
Мастер
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений (для 790 пользователей)
|
Ответ: 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. При отрицательном К полетит в другую сторону.
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
06.02.2011, 11:29
|
#9
|
Легенда
Регистрация: 14.10.2007
Сообщений: 3,878
Написано 2,012 полезных сообщений (для 5,072 пользователей)
|
Ответ: 360 Градусов
Спасибо. Попробую с точкой. Но вообще так мне нужна скорость. Мой метод основывается на поиске множителя скорости от 0 до 1 с помощью синуса угла между первой и второй точкой. Но не получилось. Угол не тот выдает.
__________________
Ибо как сказал Бгдн:
|
(Offline)
|
|
06.02.2011, 15:55
|
#10
|
Легенда
Регистрация: 14.10.2007
Сообщений: 3,878
Написано 2,012 полезных сообщений (для 5,072 пользователей)
|
Ответ: 360 Градусов
Вы будете смеяться но я нашел изящное до тупости решение проблемы.
YSpeed:=(pointer_y-first_pointer_y)/10;
YSpeed:=(pointer_x-first_pointer_x)/10;
Капец
__________________
Ибо как сказал Бгдн:
|
(Offline)
|
|
06.02.2011, 16:06
|
#11
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: 360 Градусов
Angle=Atan2(DelthaY,DelthaX)*180/Pi
SpeedX=cos(Angle)*10;
не бывает в нормальных ЯП такого, что обратные функции возвращают угол в градусах, а прямые принимают его в радианах и наоборот.
Angle=Atan2(DelthaY,DelthaX)
...cos(Angle)...
И твоё "решение" это просто использование масштабного коэффициента, компенсирующего предшествующее (ненужное!) умножение.
Сообщение от Igor
Есть исключение-вертикальная линия
С точки зрения матаматики более точно было бы ax+by+c=0
|
1.А для кого я про Атан2 написал?
2.Не "более точно", а в "каноническом виде"
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
06.02.2011, 16:15
|
#12
|
Легенда
Регистрация: 14.10.2007
Сообщений: 3,878
Написано 2,012 полезных сообщений (для 5,072 пользователей)
|
Ответ: 360 Градусов
Это решение(Предыдущее моё с арктангенсом) было в книге Джоба Макара по флешу. Использовал я его просто как проверенное. В любом случае всем спасибо).
__________________
Ибо как сказал Бгдн:
|
(Offline)
|
|
06.02.2011, 16:16
|
#13
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: 360 Градусов
Ну я же написал
не бывает в нормальных ЯП
|
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
06.02.2011, 16:32
|
#14
|
Легенда
Регистрация: 14.10.2007
Сообщений: 3,878
Написано 2,012 полезных сообщений (для 5,072 пользователей)
|
Ответ: 360 Градусов
Если честно мне это ни о чем не говорит. Например?
__________________
Ибо как сказал Бгдн:
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:17.
|