Я храню угол в виде размера смещений по x,y. Подпрограмма установки угла делает просто: ставит в x,y соответственно cos sin угла. Получается, что обе составляющие <=1 && >=-1. Благодаря этому можно также получить угол обратно, взяв arccos или arcsin от соответствующих составляющих.
Но что, если хранить в этим смещениях больший вектор? Не 1;0, а, скажем, 147;-678 ? Как тогда посчитать угол такого вектора?
У меня было два варианта:
- Через тангенс-арктангенс. Но чёт не получилось, там же идёт деление на x, а он может быть нулевым. Ещё -y,x и y,-x для него одно и тоже.
- Каким-то образом сделать так, чтобы было 1>= x^2+y^2 >=-1
Мне больше нравится второй вариант, но как я могу привести случайные величины к такому неравенству?
оспа этого времени сказал(а):↑1. обработать исключение - деление на ноль?? проблемы решена
Нажмите, чтобы раскрыть...Он начал выдавать значения типа 0...89 -90 -85 -27 -3 0 1 2...89 -90 короче бред какой-то.
П.С, я кажется нашёл решения для второго.
Нужно делить каждую компоненту на квадрат длины вектора. ща провербю
SweetSweetLoot сказал(а):↑я как то не понимаю, что ты имеешь в виду под смещением(sin и cos или какую то длину), и как ты собрался делать косинус и синус больше 1
Нажмите, чтобы раскрыть...сейчас смещение это син и кос угла. В итоге смещение это просто син кос угла. но если хранить не просто смещение, а икс-игрек составляющие вектора, якие есть син и кос помноженные на длину вектора, то всё не работает, потому что как раз синокос не могут быть больше 1 по модулю.
SweetSweetLoot сказал(а):↑можешь попробовать использовать другую систему кординат, если можешь, например полярную
Нажмите, чтобы раскрыть...она условно включена. Проблема в том, что я на этом своём недовекторе уже 90% проги нарастил, и менять сам "вектор" уже низзя. Нужно вставить костыль в то место, которое требует хранить в "векторе" вектор, а не направление...
Kujivunia сказал(а):↑сейчас смещение это син и кос угла. В итоге смещение это просто син кос угла. но если хранить не просто смещение, а икс-игрек составляющие вектора, якие есть син и кос помноженные на длину вектора, то всё не работает, потому что как раз синокос не могут быть больше 1 по модулю.
Нажмите, чтобы раскрыть...пересчитай логистику, находи угол по x и y у тебя и не может быть синус и косинус больше 1, а тангенса и котангенс, стремятся к +-бесконечности при определеных углах, поэтому там и не будет ответа
зачем например хранить сразу и синус и косинус угла, ты можешь хранить только синус и одну из сторон, тогда вторую сторону найдешь, а раз знаешь 2 стороны и угол, то сможешь найти и 2 других угла и 3 сторону, если нужно, можешь чтобы не парится хранить и синус и косинус с одной из сторон, там в матане как то определяют, какой это угол острый или тупой и без второго углового аргумента, но я не помню как
Kujivunia сказал(а):↑Я храню угол в виде размера смещений по x,y. Подпрограмма установки угла делает просто: ставит в x,y соответственно cos sin угла. Получается, что обе составляющие <=1 && >=-1. Благодаря этому можно также получить угол обратно, взяв arccos или arcsin от соответствующих составляющих.
Но что, если хранить в этим смещениях больший вектор? Не 1;0, а, скажем, 147;-678 ? Как тогда посчитать угол такого вектора?
У меня было два варианта:
- Через тангенс-арктангенс. Но чёт не получилось, там же идёт деление на x, а он может быть нулевым. Ещё -y,x и y,-x для него одно и тоже.
- Каким-то образом сделать так, чтобы было 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, то угол равен полтора пи, ну и так далее. А если нет значений, равных нулю, то считать угол через арктангенс.
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); //теперь, когда компоненты снова стали синокосами, этот метод может их обработать.Нажмите, чтобы раскрыть...
Но за ссылку спасибо, может понадобится потом, когда даже костыли перестанут работать.
Тут понятно, ты получаешь значение вектора.Kujivunia сказал(а):↑ay.Vector := Second - First; //Вектор - это разница конца и начала. Впихувываем в мой синокосный вектор невпихуемый случайный вектор.
Нажмите, чтобы раскрыть...Kujivunia сказал(а):↑temp:= power(ray.Vector.x, 2) + power(ray.Vector.y, 2); //Квадрат модуля вектора
Нажмите, чтобы раскрыть...С точки зрения математики, как я понял, это отображение теоремы Пифагора, что в прямоугольном трегольнике сумма квадратов катетов равна квадрату гипотенузы. У тебя x^2 типа "длина" в квадрате плюс y^2 типа "высота" в квадрате равны квадрату дины вектора, что в полярных координатах обозначается r как одна из координат (у тебя r^2).
А вот тут я не понимаю, почему у тебя ray.Vector.x функция от ray.Vector.x и ray.Vector.y функция от ray.Vector.y, то есть само от себя зависит. Такое вроде как не должно считать, когда само на себя ссылается. Но если считает.Kujivunia сказал(а):↑ray.Vector.x := power(ray.Vector.x, 2) / temp; //Я не шарю в математике, но таким образом сумма квадратов компонент становится равной квадрату модуля вектора.
ray.Vector.y := power(ray.Vector.y, 2) / temp;Нажмите, чтобы раскрыть...С точки зрения математики, ты находишь sin^2 и cos^2, так как сторона, делённая на гипотенузу дают синус или косинус. И sin^2+cos^2=1, поэтому у тебя сумма квадратов компонент и равна квадрату модуля вектора. И Пифагор тоже от этого. Я тут могу причину и следствие перепутать, но совершенно точно, что все эти вещи взаимосвязаны.
А тут не понял, что за функция. Типа найти угол? Как?Kujivunia сказал(а):↑ray.SetA(ray.getA); //теперь, когда компоненты снова стали синокосами, этот метод может их обработать.
Нажмите, чтобы раскрыть...
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 точно не будут
nonfactor сказал(а):↑Ну это по теореме Пифагора уже Вообще я не очень понял, что ты делаешь.
Можно вектор нормализовать, то есть сделать его модуль = 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, т.е. получился единичный вектор, что и требовалось.
Всем спасибо!
Kujivunia сказал(а):↑Я храню угол в виде размера смещений по x,y. Подпрограмма установки угла делает просто: ставит в x,y соответственно cos sin угла. Получается, что обе составляющие <=1 && >=-1. Благодаря этому можно также получить угол обратно, взяв arccos или arcsin от соответствующих составляющих.
Но что, если хранить в этим смещениях больший вектор? Не 1;0, а, скажем, 147;-678 ? Как тогда посчитать угол такого вектора?
У меня было два варианта:
- Через тангенс-арктангенс. Но чёт не получилось, там же идёт деление на x, а он может быть нулевым. Ещё -y,x и y,-x для него одно и тоже.
- Каким-то образом сделать так, чтобы было 1>= x^2+y^2 >=-1
Мне больше нравится второй вариант, но как я могу привести случайные величины к такому неравенству?
Нажмите, чтобы раскрыть...Какой яп? Заходил ли ты на литкод?
Тема закрыта
-
ЗаголовокОтветов ПросмотровПоследнее сообщение
-
Сообщений:0
Просмотров:0
-
Сообщений:4
Просмотров:5
-
Сообщений:3
Просмотров:3
-
Сообщений:2
Просмотров:2
-
Сообщений:17
Просмотров:19