I need to draw arc through three points in three-dimensional space. Can you please help me out?

2 vues (au cours des 30 derniers jours)
x_i = [0,5,20];
y_i = [0,0,0];
z_i = [20,5,0];
P1 = [x_i(1);y_i(1);z_i(1)]
P1 = 3×1
0 0 20
P2 = [x_i(2);y_i(2);z_i(2)]
P2 = 3×1
5 0 5
P3 = [x_i(3);y_i(3);z_i(3)]
P3 = 3×1
20 0 0
v1 = cross(P2-P1,P3-P1);
v1 = v1/norm(v1)
v1 = 3×1
0 -1 0
syms x y z
P0 = [x;y;z];
eqn1 = dot(P0-P1,v1) == 0
eqn1 = 
eqn2 = dot(P0-(P2+P1)/2,P2-P1) == 0
eqn2 = 
eqn3 = dot(P0-(P3+P1)/2,P3-P1) == 0
eqn3 = 
[A,B] = equationsToMatrix([eqn1, eqn2, eqn3], [x, y, z])
A = 
B = 
P_centre = linsolve(A,B)
Warning: Solution does not exist because the system is inconsistent.
P_centre = 
Can you please tell me where I am going wrong?
  8 commentaires
Siddharth Behal
Siddharth Behal le 22 Oct 2022
Thank you so much, Torsten. I really appreciate your help.
Siddharth Behal
Siddharth Behal le 22 Oct 2022
Also, do you know how can I plot this arc? I just need the arc between three points instead of the circle

Connectez-vous pour commenter.

Réponse acceptée

Matt J
Matt J le 21 Oct 2022
Modifié(e) : Matt J le 21 Oct 2022
I would suggest this FEX download,
x_i = [0,5,20];
y_i = [0,0,0];
z_i = [20,5,0];
P1 = [x_i(1),y_i(1),z_i(1)];
P2 = [x_i(2),y_i(2),z_i(2)];
P3 = [x_i(3),y_i(3),z_i(3)];
pfit=planarFit([P1;P2;P3]');
xy=pfit.R(:,2:3)'*pfit.XYZ;
cfit=circularFit(xy);
C=cfit.sample(0:360);
XYZ =num2cell( pfit.R(:,2)*C{1} + pfit.R(:,3)*C{2} + pfit.normal'*pfit.distance ,2);
scatter3(x_i,y_i,z_i,'filled','r','SizeData',50);
line(XYZ{:}); axis equal
xlabel x, ylabel y, zlabel z
  2 commentaires
Siddharth Behal
Siddharth Behal le 22 Oct 2022
Is there a way to draw only the arc between three points instead of the entire circle?
Matt J
Matt J le 22 Oct 2022
Modifié(e) : Matt J le 22 Oct 2022
pfit=planarFit([P1;P2;P3]');
xy=pfit.R(:,2:3)'*pfit.XYZ;
cfit=circularFit(xy);
xy=xy-cfit.center';
t1=atan2d(xy(2,1),xy(1,1));
t2=atan2d(xy(2,3),xy(1,3));
C=cell2mat(cfit.sample(linspace(t1,t2)));
XYZ = num2cell( pfit.R(:,2)*C(1,:) + pfit.R(:,3)*C(2,:) + pfit.normal'*pfit.distance ,2);
scatter3(x_i,y_i,z_i,'filled','r','SizeData',50);
line(XYZ{:}); axis equal
xlabel x, ylabel y, zlabel z

Connectez-vous pour commenter.

Plus de réponses (0)

Produits


Version

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by