问题遇到的现象和发生背景
目的是想要通过已有的圆盘数据,生成圆盘。由于后续需要通过遍历圆盘上的点,计算圆盘间的最小距离,计算量较大,故以直径最大的圆角度100等分所得每段距离为标尺进行后续圆盘的角度划分。
问题相关代码,请勿粘贴截图
clc; %清除命令窗口的内容
clear all; %清除工作空间的所有变量,函数,和MEX文件
close all; %关闭所有的figure窗口
% 画出三维的圆
all1=load('模拟裂隙数据.txt'); %读取裂隙文件中的裂隙数据
[m,n]=size(all1);
all=all1;
d=zeros(m,1);%定义用于存储每个圆盘直径的数组
for i=1:m %遍历数组 将所需列信息进行存储提取
d(i,:)=all(i,4);
end
Rmax=max(d)/2;%获取最大半径
for i=1:m
%%%%%%%%裂隙面法向量%%%%%%%
A=cos(all(i,5)*3.14/180)*sin(all(i,6)*3.14/180);
B=sin(all(i,5)*3.14/180)*sin(all(i,6)*3.14/180);
C=cos(all(i,6)*3.14/180);
%%%%%%%裂隙圆盘圆心及直径%%%%%%%
r1=all(i,1);
r2=all(i,2);
r3=all(i,3);
n=[A B C] ;%法向量
r=d(i)/2 ; %圆盘半径
c=[r1 r2 r3]; %圆心坐标
standard_theta=(2*pi/100)*(Rmax/r);%以最大的圆为划分标准,确保每个圆盘的细分程度相同
theta=(0:standard_theta:2*pi)';%theta角从0到2*pi
a=cross(n,[1 0 0]);%n与i叉乘,求取a向量
if ~any(a)%如果a为零向量,将n与j叉乘
a=cross(n,[0 1 0]);
end
b=cross(n,a);%求取b向量
a=a/norm(a);%单位化a向量
b=b/norm(b);%单位化b向量
c1=c(1)*ones(size(theta,1),1);
c2=c(2)*ones(size(theta,1),1);
c3=c(3)*ones(size(theta,1),1);
num=floor((r/Rmax)*100)+1;%计算生成圆环所划分的点的数量
cell_x{i}=zeros(1,num);%利用cell数组存储每个圆上的x,y,z坐标
cell_y{i}=zeros(1,num);
cell_z{i}=zeros(1,num);
x=c1+r*a(1)*cos(theta)+r*b(1)*sin(theta);%圆上各点的x坐标
cell_x{i}=x';
y=c2+r*a(2)*cos(theta)+r*b(2)*sin(theta);%圆上各点的y坐标
cell_y{i}=y';
z=c3+r*a(3)*cos(theta)+r*b(3)*sin(theta);%圆上各点的z坐标
cell_z{i}=z';
plot3(x,y,z)
hold on
end
运行结果及报错内容
所得图像中,可以明显观察到圆上存在缺口
我的解答思路和尝试过的方法
考虑到是否是在对角度划分时的精度问题,但未找到解决方法
我想要达到的结果
希望得到的圆能消除缺口,上述代码是我在网上分享的代码上拙劣修改后所得,本人matlab代码水平较次,如果有人愿意对优化代码指点一二,将不胜感激!