Angle between 2 3D straight lines

20 visualizaciones (últimos 30 días)
Riccardo Rossi
Riccardo Rossi el 16 de Jul. de 2019
Editada: Jan el 21 de Oct. de 2020
Hi everybody,
i have two 3D straight lines as follow:
the line "S1" passing through the points A=[3,7,9] and B=[4,5,8]
and the line "S2" passing through the points A=[3,7,9] and C=[4,5,0].
How can i calculate the angle between S1 and S2.
Thank you very much!
Riccardo

Respuesta aceptada

Jan
Jan el 16 de Jul. de 2019
Editada: Jan el 21 de Oct. de 2020
A = [3,7,9];
B = [4,5,8];
C = [4,5,0];
S1 = B - A;
S2 = C - A;
Theta = atan2(norm(cross(S1, S2)), dot(S1, S2));
W. Kahan suggested in his paper "Mindless.pdf":
2 * atan(norm(S1 * norm(S2) - norm(S1) * S2) / ...
norm(S1 * norm(S2) + norm(S1) * S2))
Both methods are more stable than appraoches using ACOS(DOT) or ASIN(CROSS).
  4 comentarios
Anthony Dave
Anthony Dave el 15 de Oct. de 2020
Thanks, Jan. The result angle would change if I change the vector's direction. For example, S2 = A - C. And the two angles I got are mutual supplementary angles. But if it is a polygon with several lines, how can I accurately get its internal angles?
Jan
Jan el 18 de Oct. de 2020
@Anthony Dave: The unique definition of a polygon requires the defined order of its vertices. If you e.g. swap two neighboring vertices of a square, the angles are 45° instead of 90°.
This means, that you have to stay at the same order of vertices and changing the view by something like "S2 = A - C" is not allowed. But even then, the included angle is replied and this is < 180 in every case. In a polygon you can have angles > 180 between oriented edges. Then you have to include the information about the polygon's normal N also:
S1xS2 = cross(S1, S2);
Theta = atan2(norm(S1xS2), dot(S1, S2)) * sign(dot(S1xS2, N));

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Computational Geometry en Help Center y File Exchange.

Productos


Versión

R2018b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by