Из всех форумов решил помучать именно вас. Нужно реализовать обратную кинематику. Подумав, остановился на алгоритме пропорциональных треугольников, когда между любыми 2-мя соседними костями - одинаковый угол. Пока задача чисто математическая. Углы alpha и beta - одинаковы. Нужно найти эти углы, зная только длины всех сторон. Знаю что сумма углов многоугольника = (N - 2) * 180, а в нашем случае N = кол-во костей + 1. Как решить такую задачу?
Метод в лоб. Вычисляете матрицу вращения по углу между прямыми, вычисляете вектор по первой прямой, длиной равной второй прямой. Далее трансформируете вычисленный вектор вычисленной матрицей, получаете искомый вектор. Повторяете алгоритм (n - 1) раз.
Тоже кажется, что это "матричная задача". Исходная фигура может быть разложена в сумму трех симметричных - выпуклого N-угольника, N-звезды и смещение барицентра. Обратное преобразование и даст все искомые значения. Кстати, поищите книжку по теме - вдруг там что и готовое найдется
AndreyMust19 Приведите значения сторон Судя по тому что углы одинаковые наверное фигура симметричная? Может быть нужно строить треугольники от середины А1А5 и "плясать" от них?
AndreyMust19 У тебя все точки лежат на на окружности, и если посмотреть на это дела из центра, то получаются три несложных уравнения, которые легко сводятся к одному: n*a=b 2*R*sin(a/2)=L 2*R*sin(b/2)=M n - число отрезков L - длина отрезка M - длина A1A5 a - угол под которым отрезки видны из центра окружности b - угол под которым A1A5 виден из центра окружности
Black_mirror Любите вы придумывать сложности, находить проблемы в какую сторону от угла расположены прямые.
Насколько я (не)помню ВУЗовскую математику, с тем же успехом это может быть парабола или эллипс или пара ветвей гиперболы. А если точек будет не пять, а шесть, то кривой второго порядка, в общем случае их уже не описать. Хотя именно для пяти точек, возможно, действительно проще будет приведение к каноническому виду кривой втогого порядка (в симметричной форме), нахождение барицентра и обратное преобразование даст искомые углы.
Booster Если я не ошибаюсь, уже предлагаете алгоритм расчета координат сочленения для инверсной кинематики? Я не совсем понял, вы поворачиваете конечную кость на цель, двигаете ее к цели, затем переходите к след. кости и за цель считаете корень предыдущей кости? Не привязывайтесь к количеству сторон многоугольника, оно может быть разное. И кости могут быть разной длины! Это на рисунке их 4 и визуально они одинаковые. Еще можно добавить что: C < A12 + A23 + A34 + A45 + ... AN,N+1 С - длина самой большой стороны с углами beta, A - длина стороны между точками, N - количество этих сторон. В противном случае (C больше) костям никак не дотянуться до цели.
Возвращаясь к #3. Мне кажется, очарование равенства углов мешает правильно взглянуть на вашу задачу. Представьте, что центр тяжести вашей фигуры находится в центре комплексной плоскости, а два набора переменных: "длины и углы" - соответствуют двум наборам переменных, названных "токи и напряжения". Тогда перед вами классическая электрическая многофазная несимметричная цепь, для которой с 1918 года известен (классический) метод расчета, предложенный Чарльзом Фортескью (матрица Фортескью): "Метод симметричных составляющих", детали которого можно найти в любом учебнике электротехники.
Забыл добавить, а отредактировать не удается. Если зеркально отразить вашу фигуру относительно основания, то для "удвоенной" фигуры барицентр будет находиться на его середине, что еще больше упростит расчет.
, где n+1 — число сторон a0...an-1 — длины примыкающих сторон, образующих углы альфа an — длина стороны, образующей углы бета со сторонами a0 и an-1.
Решил найти корень в Маткаде методом Given, Find. Как только маткад встречает суммирование в уравнении, бросает решать и говорит что "нет решения". Если расписать сумму, то на n = 3 (когда количество слагаемых в сумме = 3), он долго думает и в конце выдает что "уравнение не может здесь поместиться". При n = 1,2 выводит корень в символьном виде.
А для n > 2? Обратная кинематика для 3-х костей (0, 1, 2) у меня есть, интересует вариант с большим числом костей.