Я пытаюсь вычислить точку в трехмерном пространстве, которая перпендикулярна / перпендикулярна вектору линии.
Итак, у меня есть P1 и P2, которые образуют линию. Затем я пытаюсь найти точку с радиусом в центре P1, который ортогонален линии.
Я хотел бы сделать это с помощью тригонометрии, без какого-либо языка программирования, определяющего c функции.
В данный момент я проверяю, насколько точна эта функция, нанося окружность вокруг вектора линии.
Я также поворачиваю вектор линии в трехмерном пространстве, чтобы увидеть, что происходит с нанесенным на окружность кругом, вот где мои результаты меняются.
Некоторые из нежелательных эффектов включают в себя: Круг, вращающийся и проходящий через вектор линии. Радиус круга, по-видимому, уменьшается до нуля, а затем растет, когда вектор линии меняет направление.
Я использовал этот вопрос , чтобы начать работу, и с тех пор внес некоторые коррективы в код.
Любая помощь с этим была бы очень признательна - я потратил 3 дня на рисование кругов. Вот мой код до сих пор
//Define points which form the line vector
dx = p2x - p1x;
dy = p2y - p1y;
dz = p2z - p1z;
// Normalize line vector
d = sqrt(dx*dx + dy*dy + dz*dz);
// Line vector
v3x = dx/d;
v3y = dy/d;
v3z = dz/d;
// Angle and distance to plot point around line vector
angle = 123 * pi/180 //convert to radians
radius = 4;
// Begin calculating point
s = sqrt(v3x*v3x + v3y*v3y + v3z*v3z);
// Calculate v1.
// I have been playing with these variables (v1x, v1y, v1z) to try out different configurations.
v1x = s * v3x;
v1y = s * v3y;
v1z = s * -v3z;
// Calculate v2 as cross product of v3 and v1.
v2x = v3y*v1z - v3z*v1y;
v2y = v3z*v1x - v3x*v1z;
v2z = v3x*v1y - v3y*v1x;
// Point in space around the line vector
px = p1x + (radius * (v1x * cos(angle)) + (v2x * sin(angle)));
py = p1y + (radius * (v1y * cos(angle)) + (v2y * sin(angle)));
pz = p1z + (radius * (v1z * cos(angle)) + (v2z * sin(angle)));
EDIT
После нескольких дней борьбы с этим во время блокировки, мне наконец-то удалось заставить это работать. Я хотел бы поблагодарить MBo и Futurologist за их неоценимый вклад.
Хотя я не смог заставить их примеры работать (скорее всего из-за моей ошибки), их ответы указали мне верное направление и тот момент эврики!
Ключ был в обмене правильными векторами.
Так что спасибо вам обоим, вы действительно помогли мне в этом. Это мой окончательный (рабочий) код:
//Set some vars
angle = 123 * pi/180;
radius = 4;
//P1 & P2 represent vectors that form the line.
dx = p2x - p1x;
dy = p2y - p1y;
dz = p2z - p1z;
d = sqrt(dx*dx + dy*dy + dz*dz)
//Normalized vector
v3x = dx/d;
v3y = dy/d;
v3z = dz/d;
//Store vector elements in an array
p = [v3x, v3y, v3z];
//Store vector elements in second array, this time with absolute value
p_abs = [abs(v3x), abs(v3y), abs(v3z)];
//Find elements with MAX and MIN magnitudes
maxval = max(p_abs[0], p_abs[1], p_abs[2]);
minval = min(p_abs[0], p_abs[1], p_abs[2]);
//Initialise 3 variables to store which array indexes contain the (max, medium, min) vector magnitudes.
maxindex = 0;
medindex = 0;
minindex = 0;
//Loop through p_abs array to find which magnitudes are equal to maxval & minval. Store their indexes for use later.
for(i = 0; i < 3; i++) {
if (p_abs[i] == maxval) maxindex = i;
else if (p_abs[i] == minval) minindex = i;
}
//Find the remaining index which has the medium magnitude
for(i = 0; i < 3; i++) {
if (i!=maxindex && i!=minindex) {
medindex = i;
break;
}
}
//Store the maximum magnitude for now.
storemax = (p[maxindex]);
//Swap the 2 indexes that contain the maximum & medium magnitudes, negating maximum. Set minimum magnitude to zero.
p[maxindex] = (p[medindex]);
p[medindex] = -storemax;
p[minindex] = 0;
//Calculate v1. Perpendicular to v3.
s = sqrt(v3x*v3x + v3z*v3z + v3y*v3y);
v1x = s * p[0];
v1y = s * p[1];
v1z = s * p[2];
//Calculate v2 as cross product of v3 and v1.
v2x = v3y*v1z - v3z*v1y;
v2y = v3z*v1x - v3x*v1z;
v2z = v3x*v1y - v3y*v1x;
//For each circle point.
circlepointx = p2x + radius * (v1x * cos(angle) + v2x * sin(angle))
circlepointy = p2y + radius * (v1y * cos(angle) + v2y * sin(angle))
circlepointz = p2z + radius * (v1z * cos(angle) + v2z * sin(angle))