Как рассчитать касательные окружности в 3D? - PullRequest
0 голосов
/ 08 мая 2011

Мне нужна помощь, чтобы рассчитать тангеты круга в трехмерном пространстве, это то, что я до сих пор enter image description here

enter image description here

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

Vec3D getTangentBetweenTwoPoint( Vec3D p1, Vec3D p2 ) {
Vec3D r = new Vec3D( p1.x - p2.x,
                     p1.y - p2.y,
                     p1.z - p2.z );
  r.normalize();
  return r;
}

void getTangents() {
  Vec3D p0, p1;
  for ( int i = 1; i < curve_length + 1; i++ ) {
    p0 = points[i % curve_length];
    p1 = points[(i+1) % curve_length];
    tangents[i % curve_length] = getTangentBetweenTwoPoint( p0, p1 );
  }
}

Любая помощь будет высоко ценится

Ответы [ 2 ]

4 голосов
/ 08 мая 2011

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

Если вы нормализуете это перекрестное произведение, вы получите вектор нормали / тангенса для этой точки.

0 голосов
/ 11 ноября 2011

Замените i на i-1 в вашем коде здесь:

p0 = points[(i-1) % curve_length];

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

...