Расчет расстояния в параллельной плоскости до вектора нормали - PullRequest
0 голосов
/ 01 мая 2020

Моя математика (и matlab) просто не до этого, и поэтому я смиренно прошу вашей помощи:

У меня есть модель потока через затрубное пространство. Я хочу получить радиус точки пика потока и радиус кольца к центральной линии.

Итак, у меня есть 3 точки, AB C, в трехмерной модели, координаты которой мы знаем, но не выровнен к XYZ. Я хочу, чтобы AB была двумя точками на плоскости, а точка A - началом координат (центром кольца). Точка C находится на плоскости, параллельной предыдущей плоскости (точка максимального потока). Я хотел бы знать, как рассчитать расстояние между C на его плоскости и вектором нормали плоскости AB, которая проходит через точку A.

Вот фотографии модели: Flow through кольцо Точки в модели

Теперь у меня есть друг, который умнее меня, придумал код Matlab для перевода и поворота модели, а затем вычислил величины AB и Anorm C. Тем не менее, он не работает, поскольку он ставит C на большем радиусе, чем B. Я также понимаю, что есть несколько способов решения этой проблемы.

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

Спасибо.

Тоби

%Origin
O = [0 0 0]';           Ox = [O' 1]';
%Vector co-ordinates of 1 (A - Origin centreline), ...
% 2 (B - Radius of artery), and 3 (C - Radius of Peak Velocity)
A = [13.3856 -60.0377 15.8443]';           Ax = [A' 1]';
B = [26.9486 -51.0653 20.9265]';           Bx = [B' 1]';
C = [16.2240 -92.5594 40.8687]';           Cx = [C' 1]';
%Find the new i unit vector in the old co-ords (the unit vector along the new x axis)
AB = B - A;
magAB = sqrt(sum(AB.^2));
new_i=AB./magAB;
%Calculate the angle to rotate through Z when transforming
thetaZ = atan(new_i(2)/new_i(1));
%Hence, define the translation matrix (to move the origin to A) and ...
% the rotation matrixes (to align the new x axis with AB and new_i)
T = [1 0 0 -A(1) ; 0 1 0  -A(2) ; 0 0 1 -A(3) ; 0 0 0 1];
Rz = [cos(thetaZ) sin(thetaZ) 0 0 ; -sin(thetaZ) cos(thetaZ) 0 0 ; 0 0 1 0 ; 0 0 0 1];
Transform = Rz * T;
%transform Cx to the new co-ordinates by translation and rotation in Z
A_dash = round(Transform * Ax,10);
B_dash = round(Transform * Bx,10);
C_dash = round(Transform * Cx,10);
new_i_t = round(Transform * [new_i' 1]',4); new_i_t = new_i_t(1:3);
new_O = round(Transform * Ox,4); new_O = new_O(1:3);
A_dash = A_dash(1:3); B_dash = B_dash(1:3); C_dash = C_dash(1:3);
%Perform a final rotation in Y
thetaY = atan(B_dash(3)/B_dash(1));
Ry = [cos(thetaY) 0 sin(thetaY) ; 0 1 0 ; -sin(thetaY) 0 cos(thetaY)];
B_dash = Ry * B_dash;
C_dash = Ry * C_dash;
%Taking point C onto the plane of AB
C_dashflat = C_dash.*[1 1 0]';
%Find Radius of Peak Flow 
Radius_Peak_Flow = sqrt(sum(C_dashflat.^2));
%Find Radius of Artery  
Radius_Artery = magAB;
%Ratio (between 0 -1)
Ratio = Radius_Peak_Flow/Radius_Artery
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...