Kak посчитать угол?

avatar Kujivunia

585

17

Kujivunia

Пользователь

Регистрация: 10.01.2015

Сообщения: 5530

Рейтинг: 1006

Kujivunia

Регистрация: 10.01.2015

Сообщения: 5530

Рейтинг: 1006

Я храню угол в виде размера смещений по x,y. Подпрограмма установки угла делает просто: ставит в x,y соответственно cos sin угла. Получается, что обе составляющие <=1 && >=-1. Благодаря этому можно также получить угол обратно, взяв arccos или arcsin от соответствующих составляющих. 

Но что, если хранить в этим смещениях больший вектор? Не 1;0, а, скажем, 147;-678 ? Как тогда посчитать угол такого вектора? 

У меня было два варианта: 

  1. Через тангенс-арктангенс. Но чёт не получилось, там же идёт деление на x, а он может быть нулевым. Ещё -y,x и y,-x для него одно и тоже. 
  2. Каким-то образом сделать так, чтобы было  1>= x^2+y^2 >=-1

Мне больше нравится второй вариант, но как я могу привести случайные величины к такому неравенству? 

оспа этого времени

Пользователь

Регистрация: 20.08.2018

Сообщения: 1374

Рейтинг: 317

оспа этого времени

Регистрация: 20.08.2018

Сообщения: 1374

Рейтинг: 317

1. обработать исключение - деление на ноль?? проблема решена

 

Kujivunia

Пользователь

Регистрация: 10.01.2015

Сообщения: 5530

Рейтинг: 1006

Kujivunia

Регистрация: 10.01.2015

Сообщения: 5530

Рейтинг: 1006

оспа этого времени сказал(а):

1. обработать исключение - деление на ноль?? проблемы решена

 

Нажмите, чтобы раскрыть...

Он начал выдавать значения типа 0...89 -90 -85 -27 -3 0 1 2...89 -90 короче бред какой-то. 

 

П.С, я кажется нашёл решения для второго. 

Нужно делить каждую компоненту на квадрат длины вектора. ща провербю

SweetSweetLoot

Пользователь

Регистрация: 06.07.2015

Сообщения: 4739

Рейтинг: 1149

SweetSweetLoot

Регистрация: 06.07.2015

Сообщения: 4739

Рейтинг: 1149

img

я как то не понимаю, что ты имеешь в виду под смещением(sin и cos или какую то длину), и как ты собрался делать косинус и синус больше 1

оспа этого времени

Пользователь

Регистрация: 20.08.2018

Сообщения: 1374

Рейтинг: 317

оспа этого времени

Регистрация: 20.08.2018

Сообщения: 1374

Рейтинг: 317

Kujivunia сказал(а):

Он начал выдавать значения типа 0...89 -90 -85 -27 -3 0 1 2...89 -90 короче бред какой-то. 

 

П.С, я кажется нашёл решения для второго. 

Нужно делить каждую компоненту на квадрат длины вектора. ща провербю

Нажмите, чтобы раскрыть...

интересно а что за проект?

 

 

SweetSweetLoot

Пользователь

Регистрация: 06.07.2015

Сообщения: 4739

Рейтинг: 1149

SweetSweetLoot

Регистрация: 06.07.2015

Сообщения: 4739

Рейтинг: 1149

img

можешь попробовать использовать другую систему кординат, если можешь, например полярную

Kujivunia

Пользователь

Регистрация: 10.01.2015

Сообщения: 5530

Рейтинг: 1006

Kujivunia

Регистрация: 10.01.2015

Сообщения: 5530

Рейтинг: 1006

SweetSweetLoot сказал(а):

я как то не понимаю, что ты имеешь в виду под смещением(sin и cos или какую то длину), и как ты собрался делать косинус и синус больше 1

Нажмите, чтобы раскрыть...

сейчас смещение это син и кос угла. В итоге смещение это просто син кос угла. но если хранить не просто смещение, а икс-игрек составляющие вектора, якие есть син и кос помноженные на длину вектора, то всё не работает, потому что как раз синокос не могут быть больше 1 по модулю. 

stupiz0r

Пользователь

Регистрация: 19.09.2014

Сообщения: 5129

Рейтинг: -98

stupiz0r

Регистрация: 19.09.2014

Сообщения: 5129

Рейтинг: -98

Вы че типо умные все тут? Ботаны дофига? А раз на раз хочет кто?

Kujivunia

Пользователь

Регистрация: 10.01.2015

Сообщения: 5530

Рейтинг: 1006

Kujivunia

Регистрация: 10.01.2015

Сообщения: 5530

Рейтинг: 1006

SweetSweetLoot сказал(а):

можешь попробовать использовать другую систему кординат, если можешь, например полярную

Нажмите, чтобы раскрыть...

она условно включена. Проблема в том, что я на этом своём недовекторе уже 90% проги нарастил, и менять сам "вектор" уже низзя. Нужно вставить костыль в то место, которое требует хранить в "векторе" вектор, а не направление...

SweetSweetLoot

Пользователь

Регистрация: 06.07.2015

Сообщения: 4739

Рейтинг: 1149

SweetSweetLoot

Регистрация: 06.07.2015

Сообщения: 4739

Рейтинг: 1149

img

Kujivunia сказал(а):

сейчас смещение это син и кос угла. В итоге смещение это просто син кос угла. но если хранить не просто смещение, а икс-игрек составляющие вектора, якие есть син и кос помноженные на длину вектора, то всё не работает, потому что как раз синокос не могут быть больше 1 по модулю. 

Нажмите, чтобы раскрыть...

пересчитай логистику, находи угол по x и yFeelsOkayMan.png?1553740655 у тебя и не может быть синус и косинус больше 1, а тангенса и котангенс, стремятся к +-бесконечности при определеных углах, поэтому там и не будет ответа 

 

 

 

зачем например хранить сразу и синус и косинус угла, ты можешь хранить только синус и одну из сторон, тогда вторую сторону найдешь, а раз знаешь 2 стороны и угол, то сможешь найти и 2 других угла и 3 сторону, если нужно, можешь чтобы не парится хранить и синус и косинус с одной из сторон, там в матане как то определяют, какой это угол острый или тупой и без второго углового аргумента, но я не помню как

Pro100 Bot

Пользователь

Регистрация: 11.07.2015

Сообщения: 7018

Рейтинг: 1616

Pro100 Bot

Регистрация: 11.07.2015

Сообщения: 7018

Рейтинг: 1616

Kujivunia сказал(а):

Я храню угол в виде размера смещений по x,y. Подпрограмма установки угла делает просто: ставит в x,y соответственно cos sin угла. Получается, что обе составляющие <=1 && >=-1. Благодаря этому можно также получить угол обратно, взяв arccos или arcsin от соответствующих составляющих. 

Но что, если хранить в этим смещениях больший вектор? Не 1;0, а, скажем, 147;-678 ? Как тогда посчитать угол такого вектора? 

У меня было два варианта: 

  1. Через тангенс-арктангенс. Но чёт не получилось, там же идёт деление на x, а он может быть нулевым. Ещё -y,x и y,-x для него одно и тоже. 
  2. Каким-то образом сделать так, чтобы было  1>= x^2+y^2 >=-1

Мне больше нравится второй вариант, но как я могу привести случайные величины к такому неравенству? 

Нажмите, чтобы раскрыть...

https://www.mathsisfun.com/polar-cartesian-coordinates.html Посмотри здесь, похоже, решают твою проблему. Как я понял, тебе надо было писать в полярной системе координат, но ты начал в картезианской и на нахождении угла (по сути, перевод в полярную систему) проблемы, так как функуция арктангенса работает криво. Ну да, так оно и есть.

Само нахождение угла смотри в разделе To Convert from Cartesian to Polar (но ты это всё знаешь).

А конкретно твою проблему решают в разделе But What About Negative Values of X and Y?

По сути, квадрант определяется знаками, то есть если x=147>0 и y=-678<0, то какой это квадрант? Понятно, что IV. Смотришь табличку. Если x>0 и если y<0, то к полученному значению прибавляем 2*пи. Ну и с остальными квадрантами расписать.

А то что на ноль не делит - по идее, тут написано, что у функции арктангенса есть специальные значения (арктанг бесконечности равен половине пи, арктанг нуля равен нулю и т.д.), и, по идее, должно считаться. Ну можно тогда перед исчислением угла добавить исключение, что если x=0 и y>0, то угол равен нулю и если y=0 и x<0, то угол равен полтора пи, ну и так далее. А если нет значений, равных нулю, то считать угол через арктангенс.

Kujivunia

Пользователь

Регистрация: 10.01.2015

Сообщения: 5530

Рейтинг: 1006

Kujivunia

Регистрация: 10.01.2015

Сообщения: 5530

Рейтинг: 1006

Pro100 Bot сказал(а):

https://www.mathsisfun.com/polar-cartesian-coordinates.html Посмотри здесь, похоже, решают твою проблему. Как я понял, тебе надо было писать в полярной системе координат, но ты начал в картезианской и на нахождении угла (по сути, перевод в полярную систему) проблемы, так как функуция арктангенса работает криво. Ну да, так оно и есть.

Само нахождение угла смотри в разделе To Convert from Cartesian to Polar (но ты это всё знаешь).

А конкретно твою проблему решают в разделе But What About Negative Values of X and Y?

По сути, квадрант определяется знаками, то есть если x=147>0 и y=-678<0, то какой это квадрант? Понятно, что IV. Смотришь табличку. Если x>0 и если y<0, то к полученному значению прибавляем 2*пи. Ну и с остальными квадрантами расписать.

А то что на ноль не делит - по идее, тут написано, что у функции арктангенса есть специальные значения (арктанг бесконечности равен половине пи, арктанг нуля равен нулю и т.д.), и, по идее, должно считаться. Ну можно тогда перед исчислением угла добавить исключение, что если x=0 и y>0, то угол равен нулю и если y=0 и x<0, то угол равен полтора пи, ну и так далее. А если нет значений, равных нулю, то считать угол через арктангенс.

Нажмите, чтобы раскрыть...

Я решил просто запихувать этот вектор пинками в тот формат, которым мой "вектор" оперировал. Выглядит это так: 

 

Цитата:

    ray.Vector := Second - First; //Вектор - это разница конца и начала. Впихувываем в мой синокосный вектор невпихуемый случайный вектор.

    temp:= power(ray.Vector.x, 2) + power(ray.Vector.y, 2); //Квадрат модуля вектора

    ray.Vector.x := power(ray.Vector.x, 2) / temp; //Я не шарю в математике, но таким образом сумма квадратов компонент становится равной квадрату модуля вектора. 

    ray.Vector.y := power(ray.Vector.y, 2) / temp;

    ray.SetA(ray.getA); //теперь, когда компоненты снова стали синокосами, этот метод может их обработать. 

Нажмите, чтобы раскрыть...

 

Но за ссылку спасибо, может понадобится потом, когда даже костыли перестанут работать. 

Pro100 Bot

Пользователь

Регистрация: 11.07.2015

Сообщения: 7018

Рейтинг: 1616

Pro100 Bot

Регистрация: 11.07.2015

Сообщения: 7018

Рейтинг: 1616

Kujivunia сказал(а):

ay.Vector := Second - First; //Вектор - это разница конца и начала. Впихувываем в мой синокосный вектор невпихуемый случайный вектор.

Нажмите, чтобы раскрыть...
Тут понятно, ты получаешь значение вектора. 

Kujivunia сказал(а):

    temp:= power(ray.Vector.x, 2) + power(ray.Vector.y, 2); //Квадрат модуля вектора

Нажмите, чтобы раскрыть...

С точки зрения математики, как я понял, это отображение теоремы Пифагора, что в прямоугольном трегольнике сумма квадратов катетов равна квадрату гипотенузы. У тебя x^2 типа "длина" в квадрате плюс y^2 типа "высота" в квадрате равны квадрату дины вектора, что в полярных координатах обозначается r как одна из координат (у тебя r^2). 

Kujivunia сказал(а):

    ray.Vector.x := power(ray.Vector.x, 2) / temp; //Я не шарю в математике, но таким образом сумма квадратов компонент становится равной квадрату модуля вектора. 

    ray.Vector.y := power(ray.Vector.y, 2) / temp;

Нажмите, чтобы раскрыть...
А вот тут я не понимаю, почему у тебя ray.Vector.x функция от ray.Vector.x и ray.Vector.y функция от ray.Vector.y, то есть само от себя зависит. Такое вроде как не должно считать, когда само на себя ссылается. Но если считает.

С точки зрения математики, ты находишь sin^2 и cos^2, так как сторона, делённая на гипотенузу дают синус или косинус. И sin^2+cos^2=1, поэтому у тебя сумма квадратов компонент и равна квадрату модуля вектора. И Пифагор тоже от этого. Я тут могу причину и следствие перепутать, но совершенно точно, что все эти вещи взаимосвязаны.

Kujivunia сказал(а):

    ray.SetA(ray.getA); //теперь, когда компоненты снова стали синокосами, этот метод может их обработать. 

Нажмите, чтобы раскрыть...
А тут не понял, что за функция. Типа найти угол? Как?

flatte

Пользователь

Регистрация: 12.01.2013

Сообщения: 218

Рейтинг: 197

flatte

Регистрация: 12.01.2013

Сообщения: 218

Рейтинг: 197

Kujivunia сказал(а):

Но что, если хранить в этим смещениях больший вектор? Не 1;0, а, скажем, 147;-678 ? Как тогда посчитать угол такого вектора? 

Нажмите, чтобы раскрыть...

 

Друг, объясни точнее, в чём у тебя проблема. Тебе не нравится, что угол отрицательный выходит или что?

nonfactor

Почетный пользователь

Регистрация: 02.05.2014

Сообщения: 1340

Рейтинг: 1923

nonfactor

Регистрация: 02.05.2014

Сообщения: 1340

Рейтинг: 1923

Kujivunia сказал(а):

    ray.Vector.x := power(ray.Vector.x, 2) / temp; //Я не шарю в математике, но таким образом сумма квадратов компонент становится равной квадрату модуля вектора. 

Нажмите, чтобы раскрыть...

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

 

 

Можно вектор нормализовать, то есть сделать его модуль = 1

 

Как это сделать? Пусть координата начала (0;0), а конца - (x;y). Теперь мы можем поделить x и y на √(x^2 + y^2) - полученные векторы будут коллинеарны, так что угол сохранится

 

Теперь это вектор (x/√(x^2 + y^2); y/√(x^2 + y^2))

Длина полученного вектора равна 1, "новый" x - синус, "новый" y - косинус. К слову, такие x и y по модулю больше 1 точно не будут

denton

Пользователь

Регистрация: 31.10.2017

Сообщения: 21956

Рейтинг: 7034

Нарушения: 105

denton

Регистрация: 31.10.2017

Сообщения: 21956

Рейтинг: 7034

Нарушения: 105

img

Чёт не понял. Разве ты не делишь просто меньший вектор на больший, получая нужные синус и косинус? 

Kujivunia

Пользователь

Регистрация: 10.01.2015

Сообщения: 5530

Рейтинг: 1006

Kujivunia

Регистрация: 10.01.2015

Сообщения: 5530

Рейтинг: 1006

nonfactor сказал(а):

Ну это по теореме Пифагора уже HAhaa.png Вообще я не очень понял, что ты делаешь.

 

 

Можно вектор нормализовать, то есть сделать его модуль = 1

 

Как это сделать? Пусть координата начала (0;0), а конца - (x;y). Теперь мы можем поделить x и y на √(x^2 + y^2) - полученные векторы будут коллинеарны, так что угол сохранится

 

Теперь это вектор (x/√(x^2 + y^2); y/√(x^2 + y^2))

Длина полученного вектора равна 1, "новый" x - синус, "новый" y - косинус. К слову, такие x и y по модулю больше 1 точно не будут

Нажмите, чтобы раскрыть...

 

Pro100 Bot сказал(а):

Тут понятно, ты получаешь значение вектора. 

С точки зрения математики, как я понял, это отображение теоремы Пифагора, что в прямоугольном трегольнике сумма квадратов катетов равна квадрату гипотенузы. У тебя x^2 типа "длина" в квадрате плюс y^2 типа "высота" в квадрате равны квадрату дины вектора, что в полярных координатах обозначается r как одна из координат (у тебя r^2). 

А вот тут я не понимаю, почему у тебя ray.Vector.x функция от ray.Vector.x и ray.Vector.y функция от ray.Vector.y, то есть само от себя зависит. Такое вроде как не должно считать, когда само на себя ссылается. Но если считает. С точки зрения математики, ты находишь sin^2 и cos^2, так как сторона, делённая на гипотенузу дают синус или косинус. И sin^2+cos^2=1, поэтому у тебя сумма квадратов компонент и равна квадрату модуля вектора. И Пифагор тоже от этого. Я тут могу причину и следствие перепутать, но совершенно точно, что все эти вещи взаимосвязаны.

А тут не понял, что за функция. Типа найти угол? Как?

Нажмите, чтобы раскрыть...

 

Я тоже не понял, что я делал. Спасибо, что обратили внимание, а то я уже начал дальше что-то делать, думая, что тут уже всё в порядке... 

 

Синус и косинус - это отношения катетов к гипотенузе. Гипотенуза это модуль вектора, катеты - х и у. Значит, для получения цифер мне нужно поделить катеты на гипотенузу. 

 

Получается, если вектор имеет вид (-3;4), то его гипотенуза = 5. 

Значит, после приведения он будет иметь вид (-0.6;0.8)

0.36+0.64=1, т.е. получился единичный вектор, что и требовалось. 

 

Всем спасибо!

pyles

Пользователь

Регистрация: 23.06.2013

Сообщения: 19835

Рейтинг: 9945

Нарушения: 45

pyles

Регистрация: 23.06.2013

Сообщения: 19835

Рейтинг: 9945

Нарушения: 45

Kujivunia сказал(а):

Я храню угол в виде размера смещений по x,y. Подпрограмма установки угла делает просто: ставит в x,y соответственно cos sin угла. Получается, что обе составляющие <=1 && >=-1. Благодаря этому можно также получить угол обратно, взяв arccos или arcsin от соответствующих составляющих. 

Но что, если хранить в этим смещениях больший вектор? Не 1;0, а, скажем, 147;-678 ? Как тогда посчитать угол такого вектора? 

У меня было два варианта: 

  1. Через тангенс-арктангенс. Но чёт не получилось, там же идёт деление на x, а он может быть нулевым. Ещё -y,x и y,-x для него одно и тоже. 
  2. Каким-то образом сделать так, чтобы было  1>= x^2+y^2 >=-1

Мне больше нравится второй вариант, но как я могу привести случайные величины к такому неравенству? 

Нажмите, чтобы раскрыть...

Какой яп? Заходил ли ты на литкод?