Положение связанных точек в пространстве - PullRequest
2 голосов
/ 23 октября 2009

A-B-C-D - это 4 очка. Определим r = длину (B-C), угол, ang1 = (A-B-C) и угол ang2 = (B-C-D), а также угол кручения tors1 = (A-B-C-D). Что мне действительно нужно сделать, так это найти координаты C и D, при условии, что у меня есть новые значения r, ang1, ang2 и tors1. Дело в том, что точки A и B жестко связаны друг с другом, а точки C и D также связаны, так сказать, жестким соединителем. То есть расстояние (C-D) остается фиксированным, а также расстояние A-B остается фиксированным. Не существует такой жесткой связи между точками B и C.

У нас есть старые координаты 4 точек для некоторого другого набора (r, ang1, ang2, tors1), и нам нужно найти новые координаты, когда этот определяющий набор переменных изменится на какое-то произвольное значение.

Буду благодарен за любые полезные комментарии. Большое спасибо.

Я не могу опубликовать фотографию, потому что я новый пользователь: (

Дополнительная информация: итеративное решение не будет полезным, потому что мне нужно сделать это в симуляции "много раз O (10 ^ 6)".

Ответы [ 5 ]

1 голос
/ 23 октября 2009

Я думаю, что лучший способ подойти к этой проблеме - думать с точки зрения аналитической геометрии . Каждая точка A, B, C, D имеет несколько трехмерных координат (x, y, z), и между их (например, расстояние B-C равно r означает, что

r = sqrt[ (x_b - x_c)^2 + (y_b - y_c)^2 + (z_b - z_c)^2 ]

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

Это общий подход, если вы лучше описываете проблему (может быть, картину?), Может быть легко найти некоторые эффективные способы решения таких систем из-за некоторых особых свойств, которыми обладает ваша проблема.

1 голос
/ 23 октября 2009

Вы не упомянули систему координат. Даже если (r, a1, a2, t) не изменится, «координаты» изменятся, если вся структура может быть отправлена ​​вихревой в космос. Поэтому я сделаю некоторые предположения:

Поместите B в начало координат, C на положительную ось X и A в плоскости XY с y & gt0. Если вы не знаете расстояние AB, рассчитайте его по старым координатам. Точно так же CD.

A: (-AB cos(a1), AB sin(a1), 0)
B: (0, 0, 0)
C: (r, 0, 0)
D: (r + CD cos(a2), CD sin(a2) cos(t), CD sin(a2) sin(t))

(Просто следите за условными обозначениями в углах.)

0 голосов
/ 24 октября 2009

Это решение отличается от того, которое я уже дал. Здесь я предполагаю, что положения A и B не могут изменяться (то есть положения A и B являются константами), подобно решению Беты. Обратите внимание, что существует еще бесконечное количество решений, так как мы можем вращать структуру вокруг оси, определенной A-B, и все ваши ограничения по-прежнему выполняются.

Пусть координаты A будут A [0], A [1] и A [2], и аналогично для B. Вам нужны явные уравнения для C и D, как вы упоминали в ответе на решение Беты, поэтому они:

Сначала найдите позицию C. Как упоминалось ранее, существует бесконечное количество возможностей, поэтому я выберу подходящую для вас.

Vector AB = A-B
Normalize(AB)

int best_i = 0;
for i = 1 to 2
    if AB[i] < AB[best_i]
       best_i = i
// best_i contains dimension in which AB is smallest

Vector N = Cross(AB, unit_vec[best_i]) // A good normal vector to AB
Normalize(N)

Vector T = Cross(N, AB) // AB, N, and T form an orthonormal frame
Normalize(T) // redundant, but just in case

C = B + r*AB*cos(ang1) + r*N*sin(ang1)

// Assume s is the known, fixed distance between C and D
// Update the frame
Vector BC = B-C, Normalize(BC)
N = Cross(BC, T), Normalize(N)

D = C + s*cos(tors1)*BC*cos(ang2) + s*cos(tors1)*N*sin(ang1) +/- s*sin(tors1)*T

Последний плюс или минус зависит от того, как вы определяете ортонормированный фрейм. Попробуйте один и посмотрите, хотите ли вы, иначе это другой знак. Обозначения выше довольно неформальны, но они дают определенный рецепт того, как генерировать C и D из A, B и ваших параметров. Он также выбирает хороший C (который зависит от хорошего невырожденного N). unit_vec[i] относится к вектору всех нулей, кроме 1 в индексе i. Как обычно, я не проверял псевдокод выше:)

0 голосов
/ 24 октября 2009

Вы запрашиваете решение нелинейной системы уравнений. Для математически наклонных я выпишу уравнения ограничений:

Предположим, у вас есть позиции точек A, B, C, D. Мы определяем векторы AB = A-B и т. Д., И, кроме того, мы используем обозначение nAB для обозначения нормализованного вектора AB / | AB |. С этим обозначением имеем:

AB.AB = fixed
CD.CD = fixed
CB.CB = r*r
nAB.nCB = cos(ang1)
nDC.nBC = cos(ang2)
Let E = D - DC.(nCB x nAB) // projection of D onto plane defined by ABC
nEC.nDC = cos(tors1)
nEC x nDC = sin(tors1) // not sure if your torsion angle is signed (if not, delete this)

где точка (.) Обозначает скалярное произведение, а крестик (x) обозначает перекрестное произведение. Каждая точка определяется 3-мя координатами, поэтому существует 12 неизвестных и 6 уравнений ограничения, оставляя 6 степеней свободы без ограничений. Это DOF 6 калибров из поступательной и вращательной инвариантности пространства.

Предполагая, что у вас есть старые точечные позиции A ', B', C 'и D', и вы хотите найти новое решение, которое "ближе всего" (в определенном смысле, которое я определил) к этим старым позициям, тогда вы решение задачи оптимизации:

minimize: AA'.AA' + BB'.BB' + CC'.CC' + DD'.DD'
subject to the 4-5 constraints above.

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

Если это звучит хорошо для вас, я могу остановиться на мельчайших подробностях выполнения численной оптимизации.

0 голосов
/ 23 октября 2009

вы описываете набор ограничений.

что вам нужно сделать для каждой проверки ограничений, если они все еще выполняются, и, если нет, рассчитать наиболее эффективный способ получить его снова.

Например,

, если длина b-c = r, если b-c больше не является r, сделайте его снова r, переместив b и c в или из друг друга, чтобы снова было выполнено ограничение.

для каждого ограничения одно за другим сделайте это. Затем повторите несколько раз, пока система снова не стабилизируется (например, все ограничения будут выполнены).

Вот и все

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...