matlab知道三个三维空间点的坐标,如何绘制经过这三个点的园,要求显示出空间直角坐标系。急,在线坐等! 5
P1 = [x1, y1, z1]
P2 = [x2, y2, z2]
P3 = [x3, y3, z3] 展开
%P1=[x1,y1,z1];
%P2=[x2,y2,z2];
%P3=[x3,y3,z4];
%P=[P1;P2;P3];
% | x1 y1 z1 |
%P =| x2 y2 z2 |
% | x3 y3 z3 |
P=rand(3);%三点的xyz坐标正好是合拼成3x3的矩阵,这里用3x3的随机矩阵测试
%利用随机数生成3个点的坐标
%实际使用中,将已知的三点坐标按上述顺序排成P矩阵既可以了
A=diff(P);
n=cross(A(1,:),A(2,:)); %n是三点组成的平面的法向量
if all(n==0),error('not a triangle');end %如果n是0向量,表示三点共线
A=[A;n]; %从三点坐标很容易求得三点平面所在的方程
B=sum(diff(P.^2),2)/2; %而外接圆心都各点距离相等,又可以列几条方程
B=[B;dot(n,P(1,:))]; %将方程联立可以解得圆心坐标cc
cc=(A\B)'; %这里有个复杂的推导过程,
%最终结果cc(1) cc(2) cc(3)就是圆心的x,y,z坐标
r=sqrt(sum((cc-P(1,:)).^2)); %点cc到任意一点的距离都可以求出圆的半径;
C1=P(1,:)-cc; %第一点到圆心的向量C1
C2=cross(C1,n./sqrt(sum(n.^2))); %C2是三点所在平面内与C1垂直的向量
theta=(0:360)';%画圆所需的角度采样间隔,0到360度,间隔可以自己根据需要调整
cirxyz=repmat(cc,[length(theta) 1])+cosd(theta)*C1+sind(theta)*C2;
%cirxyz是361x3的矩阵,3列分别是圆上每点的x,y,z坐标
plot3(P(:,1),P(:,2),P(:,3),'ko');grid on;hold on; %画出三点
plot3(cirxyz(:,1),cirxyz(:,2),cirxyz(:,3),'r-');hold off; %画出圆
以下是某次空间随机三点和他们的外接圆图像