Я предполагаю следующее: у вас есть трехмерная система координат Oxyz и правый круговой цилиндр с радиусом a
, ось которого, проходящая вдоль середины цилиндра, совпадает с осью Oy.Тогда круговое основание цилиндра перпендикулярно оси Oy и поэтому параллельно (или совпадает с) координатной плоскостью Oxz.В этой системе координат цилиндр можно описать как все трехмерные точки со свойством
[x; y; z] such that x^2 + z^2 = a^2, while y is arbitrary or D <= y < = U.
. Я предполагаю, что цилиндр проецируется из системы координат 3D Oxyz на плоскость координат Oxy, так что полученная окружностьпо пересечению цилиндра с координатной плоскостью Oxz, проецируется как эллипс с большой осью длины a
, выровненной с осью Ox, и малой осью длины b
, выровненной с осью Oz.На твоей картинке a = cylinder rx
и b = ry
.
Эта информация позволяет нам определить направление проекции:
direction = [0; b; a]
, т.е. для любой точки P = [x_3D;y_3D;z_3D] в трехмерной системе Oxyz мы берем прямую через P и параллельны вектору direction
, а ее пересечение с Oxy является проекцией P на Oxy.Формула для этого:
[x_3D; y_3D; z_3D] ---> [x_3D; y_3D - (b/a)*z_3D]
i.e.
x = x_3D
y = y_3D - (b/a)*z_3D
(есть еще один вариант для направления: direction = [0; - b; a]
, если проекция выполняется «из-под» оси Oxz вместо «над», но давайте придерживаться «над»") И наоборот, если нам дана точка [x;y] на плоскости координат Oxy 2D можно восстановить две точки на поверхности цилиндра, которые выступают на [x;y]:
[x; y] ---> [x; y + (b/a)*sqrt(a^2 - x^2); sqrt(a^2 - x^2)]
, которая является точкой на цилиндре в полупространстве, где ось O положительна, и
[x; y] ---> [x; y - (b/a)*sqrt(a^2 - x^2); - sqrt(a^2 - x^2)]
, которая находится на цилиндре в полупространстве, гдеось) z отрицательна.
Поверхность цилиндра можно параметризовать, взяв плоский плоский прямоугольник и согнув его в 3D, склеив два параллельных ребра, чтобы образовать правильный круговой цилиндр.Это преобразование можно записать в виде
[s; y] ---> [a*cos(s/a); y; a*sin(s/a)]
i.e.
x = a*cos(s/a)
y = y
z = a*sin(s/a)
Тогда общая прямая линия на плоском квадрате
y = y0 + m*(s - s0)
превращается в трехмерную кривую, лежащую на поверхности цилиндра
x = a*cos(s/a)
y = y0 + m*(s - s0)
z = a*sin(s/a)
, который является спиралью.
Теперь, вы задаетесь как
a, b, A = [xA; yA], B = [xB; yB]
Ваша цель - найти уравнение кривой в Окси, которая проходит через А и Ви которая является проекцией спирали на цилиндр в 3D.
Шаг 1: Восстановите трехмерные точки A_3D и B_3D на цилиндре, которые проецируются на A и B соответственно.Используя формулы выше (и предположим, что, скажем, A_3D и B_3D находятся на положительной стороне унции)
A_3D = [xA; yA + (b/a)*sqrt(a^2 - xA^2); sqrt(a^2 - xA^2)];
B_3D = [xB; yB + (b/a)*sqrt(a^2 - xB^2); sqrt(a^2 - xB^2)];
Step2: Представляет A_3D и B_3D в [s;y] координаты поверхности цилиндра:
s_A = a*arccos(xA);
y_A = yA + (b/a)*sqrt(a^2 - xA^2);
s_B = a*arccos(xB);
y_B = yB + (b/a)*sqrt(a^2 - xB^2);
Шаг 3: Построить прямую линию в [с;y] координаты:
m = (y_B - y_A) / (s_B - s_A)
= (yB + (b/a)*sqrt(a^2-xB^2) - yA - (b/a)*sqrt(a^2-xA^2)) / (a*arccos(xB) - a*arccos(xA))
= ((yB - yA) + (b/a)*(sqrt(a^2-xB^2) - sqrt(a^2-xA^2))) / (a*arccos(xB) - a*arccos(xA));
y = y_A + m*(s - s_A);
Шаг 4: Представьте его в 3D в виде спирали:
x_3D = a*cos(s/a)
y_3D = y_A + m*(s - s_A)
z_3D = a*sin(s/a)
Шаг 5: Проецируйтеспираль из цилиндра на координатную плоскость Окси, вдоль direction = [0; b; a]
:
x = a*cos(s/a)
y = y_A + m*(s - s_A) - b*sin(s/a)