Большое спасибо всем за добрые советы, воспользовался каждым поочерёдно, в меру своих сил, и понял, что нужно немного "прокачаться" в математике. К сожалению, наименее понятны мне оказались сферические координаты и мысль о том, что они описывают те же самые точки пространства, что и трёхмерная декартова система координат никак не приживалась в моей голове.
Ушло несколько месяцев, чтобы наконец-то осознать, что в данном случае не уравнения задают пространство, а это лишь способ задать точку, в каком-то пространстве, и, когда мы изучаем пространства, то ищем способы задать в них точку. Наоборот, конечно, тоже возможно, как я выяснил несколько позднее, но это несколько выходило за рамки поставленной задачи, поэтому я отложил изучение обратного вопроса на неопределённый срок.
Прошу простить долгое вступление, я перейду к решению, которое дало мне искомый результат.
Как заметил господин
Geen, одно из основных условий, которых не хватало в исходных вычислениях - принадлежность вектора плоскости, я построил плоскость, проходящую через два вектора, отсекающую окружность в нашей сфере.
Пусть вектор
задан координатами
, аналогично
задан координатами
, тогда можно построить плоскость через два вектора и точку, где точка - начало координат. Далее я рассматриваю верхнюю полусферу, т.е плоский угол до 180 градусов.
1) Очевидно, что данные векторы неколлинеарны, т.к проходят через одну точку - начало координат (я вот здесь хочу сделать оговорку, я не совсем уверен, можно ли говорить, что векторы "проходят через точку", ведь на самом деле, как я выяснил, векторы - это просто некий набор чисел, имеющих направление и связанных с пространством, исходный набор чисел не содержит в себе данные о "начале", а только лишь о том, куда указывает "конец" вектора, и какие его "проекции"(?) на базисные оси).
2) У меня есть три точки: две - концы векторы, указывающие на поверхность сферы, и одна - начало координат, тогда можно построить плоскость по трём точкам (я использовал именно этот вариант, а (1) написал, потому что у меня есть насчёт его правильности сомнения, в отличие от (2), но быть может он имеет место быть).
Здесь я не нашёл обоснования этой формулы в строгом виде (поделитесь, пожалуйста, литературой, если это возможно), но для себя я доказал правомочность так:
Так как нам дана матрица, то каждый вектор-столбец этой матрицы описывает вектор в пространстве, тогда, пусть векторы:
соответственно равны:
, тогда, составим из этих векторов матрицу, и, если её определитель равен нулю, то это означает, что размерность фигуры, образованной векторами, меньше размерности пространства, в нём построенном, в моём случае это будет параллелограмм. Здесь ещё необходимо, кажется, проверить, что ранг матрицы равен двум, потому что если ранг матрицы будет единица, то я получу линию, а если ноль, то точку(?), но, кажется, я должен быть уверен в этом, так как беру заведомо не совпадающие точки.
Конечное уравнение я получу в виде
.
Немного помучившись с определителем общего вида я получил следующее:
В этот момент я понял, что мои изначальные идеи не совсем будут полезны, в том плане, что я в первую очередь решал не математическую, а программную задачу, поэтому если даже и решить, используя аркфункции, изначальным способом, то по производительности это будет неуместно, да и математически вычисления, кажется, будут очень громадными. Я задумался над тем, что значит слово "линейное преобразование", которое встретилось мне в учебнике. Как говорил мой учитель: "книги писали раньше не дураки как минимум потому, что дураки писать-то толком не умели", значит, оно должно что-то преобразовывать (это была середина сентября).
Изучив линейные преобразования я понял, что можно переходить от одного представления точки в пространстве к другому, а значит можно и представлять каждую точку пространства с помощью матриц.
Пропущу дальнейшие идеи. В общем, здесь у меня было два пути: Исследовать два вектора в плоскости, а вернее, разделить угол между ними на нужное количество частей, и двигать исходный угол на необходимый градус с помощью
матрицы поворота (спасибо, г-н
Geen, но в первый раз, читая ваше сообщения, я даже не имел представления о том, что такое линейная алгебра, слово "матрица поворота" мне тогда мало что сказало (даже с г-ном гуглом), но позже, перечитав Ваше сообщения, я понял, что нужно искать), либо найти более производительный способ. Я его нашёл:
кватернион-матричное преобразование.Изучив это преобразование, я узнал, что можно вращать точку вокруг оси, это именно то, что мне нужно. Но какую ось вращения взять, чтобы ничего не сломать? Перпендикуляр к плоскости! (осенило меня спустя неделю)
Уравнение нормали к плоскости будет иметь вид
Я могу пренебречь требование прохождения через какую-то конкретную точку, потому что моя сферы лежит в начале координат своим центром, в противном случае необходимо было бы потребовать уравнение прямой, проходящей через точку-центр сферы.
Тогда, я могу задать кватернион поворота, как
, где
, где
половина от нужного мне угла поворота.
Тогда, задав такой кватернион, я могу его преобразовать в матрицу поворота, в которой
не будет проблемы шарнирного замка (gimble lock), по следующему правилу:
Где
соответственно равны
Осталось самое главное, переход от точки к точки:
1) Беру начальную точку
2) Беру конечную точку
3) Нахожу угол между векторами в плоскости
4) Делю этот угол на нужное количество мне частей
5) Записываю координаты точки старта в виде вектор-столбца
6) Нахожу уравнение направляющего вектора (по совместительству прямой, перпендикулярной плоскости проходящей через точку 0)
7) Создаю кватернион q, в который подаю свой угол по правилу:
где
- количество частей, на которые я поделил исходный угол,
- текущая итерация цикла.
8) Умножаю вектор столбец на кватерионную матрицу поворота (вектор-столбец справа), получаю новый вектор-столбец, с координатами исходной точки. Увеличиваю
на единицу. Записываю полученные координаты в массив.
Задача, как мне кажется, решена, но, к сожалению, решение проверить некому.
Большое спасибо за мотивацию и помощь, ваши идею подтолкнули меня на мысль, в каком направлении стоит искать и размышлять, однако, я совершенно не понял ортогонализацию Грама-Шмидта, возможно, чуть позже смогу понять.
Честно говоря, я не очень глубоко понимаю, как работает кватернион, лишь представляю себе это как стереографическую проекцию четырёхмерной сферы в трёхмерное пространство, и, отсутствие шарнирного замка возникает из-за того, что для всякой точки проекции определена точка в проецируемого объекта, но не наоборот, поэтому мы можем однозначно задать любую точку без вырождений, но вот если бы мы вращали объект в четырёхмерном пространстве, то нам, вероятно, понадобился пятимерный объект для такого же трюка?
К сожалению, я не нашёл литературы, в которой излагались бы приёмы, использованные мной, возможно, у кого-то из вас будут рекомендации.
p.s Не смотря на то, что метод г-на
Geen помог мне в идее практических рассуждений, на верную мысль о представлении пространства меня натолкнула подсказка г-на
arseniiv, на которую я потратил ни многим, ни малым три недели. Именно благодаря ей я смог лучше подумать о пространстве.
Я правда благодарен обоим господам за оказанную помощь в размышлениях. Спасибо.