How I calculate the angles projected (plane xy, yz, xz) of a human segment in space?
29 views (last 30 days)
Show older comments
Hello, I need calculate the angles projections of a segment in space by planes. For example the segment foot and shank, where the foot is defined by P1 and P2 and shank is defined by P2 and P3 in the space, I need obtain the angle between the segments, but I need too of your projections, anyone help me? Thanks for your attention. Best wishes.
% Example:
P1(68,7910000000000 -79,5270000000000 18,0130000000000)
P2(40,3690000000000 57,5610000000000 -86,0590000000000)
P3(-94,3560000000000 109,322000000000 78,3600000000000)
If you see the image, I need the angle projection in xy, xz and yz plane. Do you understand my question?
0 Comments
Accepted Answer
Jan
on 21 Dec 2013
No, I do not understand the question.
Do you want to project the two vectors into a specified plane an determine the angle between the projected vectors? This would equal the view through a 2D X-ray image.
Such "projection angles" can be calculated by the following code:
function Angle = ProjAngleV(L1, L2, LP)
% Angle between 2 vectors projected into plane
% Angle = ProjAngleV(L1, L2, LP)
% INPUT:
% L1, L2, LP: Vectors of dimension [T x 3] or [1 x 3].
% They need not be normalized.
% OUTPUT:
% Angle: Angle between L1 and L2 projected into the plane orthogonal to LP.
% In other words: the angle between L1 and L2 when looking along LP.
% The sign of the angle is positive, if [L1, L2, LP] is a right handed
% system, so the sign changes if L1 and L2 are interchanged.
% Range of output: -180 < Angle <= 180:
% L1 = L2 => Angle = 0
% L1 ~= L2, L1 <-> L2 => Angle <-> -Angle
% Discontinuity at antiparallel lines:
% L1 = -L2 => Angle = 180
% L1 = -L2 + [0,eps,0] => Angle = -180
% Author: Jan Simon, Heidelberg, (C) 2005-2013 matlab.2010@n-simon.de
% License: Use, copy, modify as you like, don't blame me for troubles
% General algorithm:
% A = L1 x LP;
% B = L2 x LP;
% Angle = ATAN2(Norm(A x B), Dot(A, B)) * sign(Dot(L1 x L2, LP))
% Project L1 and L2 into plane perpendicular to LP:
A = CrossTx3(L1, LP);
B = CrossTx3(L2, LP);
% Dot product between projected lines:
AdotB = A(:,1).*B(:,1) + A(:,2).*B(:,2) + A(:,3).*B(:,3);
AxB = [A(:, 2) .* B(:, 3) - A(:, 3) .* B(:, 2), ...
A(:, 3) .* B(:, 1) - A(:, 1) .* B(:, 3), ...
A(:, 1) .* B(:, 2) - A(:, 2) .* B(:, 1)];
Angle = atan2(NormTx3(AxB), AdotB);
% Sign(LX) is zero for LX==0, but this would destroy Inf values.
negS = (DotTx3(AxB, LP) < 0);
Angle(negS) = -Angle(negS);
% Care for infinite values:
% Angle(isinf(AdotB)) = Inf; % -Inf -> Inf
Angle(~isfinite(AdotB)) = Inf; % NaN and -Inf -> Inf
% No valid angle for to0 short input vectors::
Small = 1.490116119384766e-008; % SQRT(EPS)
Angle(sum(L1 .* L1, 2) < Small) = Inf;
Angle(sum(L2 .* L2, 2) < Small) = Inf;
Angle(sum(LP .* LP, 2) < Small) = Inf;
function R = CrossTx3(X, Y)
R = [ X(:,2) .* Y(:,3) - X(:,3) .* Y(:,2), ...
X(:,3) .* Y(:,1) - X(:,1) .* Y(:,3), ...
X(:,1) .* Y(:,2) - X(:,2) .* Y(:,1)];
function R = NormTx3(X)
R = sqrt(X(:, 1) .* X(:, 1) + X(:, 2) .* X(:, 2) + X(:, 3) .* X(:, 3));
function R = DotTx3(X, Y)
R = X(:, 1) .* Y(:, 1) + X(:, 2) .* Y(:, 2) + X(:, 3) .* Y(:, 3);
More Answers (0)
See Also
Categories
Find more on Image Processing Toolbox in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!