%這裏隨便給了組數據,中心軌跡(x,y,z)以及對應的圓半徑
x=0:0.02:1;y=cos(x*pi/2);z=y.^2;
r=0.15-0.1*x;
%這裏x,y,z,r是程度相等的數組,註意相鄰兩點不能重合
plot3(x,y,z,'b');hold on
dx=gradient(x);dy=gradient(y);dz=gradient(z);%曲線方向增量
deg=0:360;
for ii=1:length(x)
n=[dx(ii) dy(ii) dz(ii)]; ?%n是當前點的增量方向,也是圓平面的法向量
n=n/sqrt(sum(n.^2)); %歸壹化法向量
a=zeros(1,3);[ind ind]=min(n);a(ind)=1;%找到和n(ii,:)不***線的向量
r1=cross(n,a); ? %產生圓平面上的壹個向量
r1=r1/sqrt(sum(r1.^2))*r(ii); ?%讓向量長度等於半徑
r2=cross(n,r1); ?%產生另壹個與其正交的半徑向量
xx=r1(1)*cosd(deg)+r2(1)*sind(deg)+x(ii); %根據r1和r2,利用角度產生圓數據
yy=r1(2)*cosd(deg)+r2(2)*sind(deg)+y(ii);
zz=r1(3)*cosd(deg)+r2(3)*sind(deg)+z(ii);?
plot3(xx,yy,zz,'r'); ?%畫壹個圓
end
hold off;grid on
axis equal;升級版
%這裏隨便給了組數據,中心軌跡(x,y,z)以及對應的圓半徑
x=0:0.02:1;y=cos(x*pi/2);z=y.^2;
r=0.15-0.1*x;
%這裏x,y,z,r是程度相等的數組,註意相鄰兩點不能重合
x=x(:);y=y(:);z=z(:);
plot3(x,y,z,'b','linewidth',2);hold on
n=[gradient(x) gradient(y) gradient(z)];%曲線方向增量
n=bsxfun(@rdivide,n,sqrt(sum(n.^2,2)));
a=zeros(1,3);[ind ind]=min(n(1,:));a(ind)=1;
r1=cross(n(1,:),a);
r1=r1/sqrt(sum(r1.^2));
r2=cross(n(1,:),r1);
deg=0:20:360;
xx=r(1)*(r1(1)*cosd(deg)+r2(1)*sind(deg))+x(1);?
yy=r(1)*(r1(2)*cosd(deg)+r2(2)*sind(deg))+y(1);
zz=r(1)*(r1(3)*cosd(deg)+r2(3)*sind(deg))+z(1);?
d0=[xx(1) yy(1) zz(1)];
for ii=2:length(x)
r1=cross(r2,n(ii,:));
r2=cross(n(ii,:),r1); ?
xx=[xx;r(ii)*(r1(1)*cosd(deg)+r2(1)*sind(deg))+x(ii)];?
yy=[yy;r(ii)*(r1(2)*cosd(deg)+r2(2)*sind(deg))+y(ii)];
zz=[zz;r(ii)*(r1(3)*cosd(deg)+r2(3)*sind(deg))+z(ii)]; ?
end
mesh(xx,yy,zz);colormap([1 0 0]);
hold off;grid on;axis equal;hidden off;
xlabel('X');ylabel('Y');zlabel('Z');