我只想在一个域中生成至少6个单元以及特定方向和方向(线条是金字塔的元素 - 即每条线具有60度方向),而它们之间没有任何交叉点。 怎么做??
我做了一个,但效率不高,只生成了100行然后生成它们我测试了交叉点并删除了任何交叉线,我只剩下5到10个剩余的线..但我需要大约100或200,实际上它是通用代码
%Pattern_x, Pattern_y , and Pattern_z are the x, y,and z positions of any mesh and dx, dy, dy the increments of x, y, z and the cube element is C
x=zeros(C*C*C,1);
j=randi([1,(C*C*C)],No_of_lines+10*C,1);
ii=datasample(j,No_of_lines,'Replace',false);
x(ii)=1;
lines=zeros(No_of_lines,2,3);
for i=1:6:length(ii)
z1=ii(i);
vx1=Pattern_x(z1);
vy1=Pattern_y(z1);
vz1=Pattern_z(z1);
vx2=Pattern_x(z1)+2*dx;
vy2=Pattern_y(z1)-2*dy;
vz2=Pattern_z(z1)+4*dz;
vx3=Pattern_x(z1)-2*dx;
vy3=Pattern_y(z1)+2*dy;
vz3=Pattern_z(z1)-4*dz;
lines(i,1,:)=[vx2 vy2 vz2];
lines(i,2,:)=[vx3 vy3 vz3];
end
for i=2:6:length(ii)
z2=ii(i);
vx1=Pattern_x(z2);
vy1=Pattern_y(z2);
vz1=Pattern_z(z2);
vx2=Pattern_x(z2)-2*dx;
vy2=Pattern_y(z2)+2*dy;
vz2=Pattern_z(z2)+4*dz;
vx3=Pattern_x(z2)+2*dx;
vy3=Pattern_y(z2)-2*dy;
vz3=Pattern_z(z2)-4*dz;
lines(i,1,:)=[vx2 vy2 vz2];
lines(i,2,:)=[vx3 vy3 vz3];
end
for i=3:6:length(ii)
z3=ii(i);
vx1=Pattern_x(z3);
vy1=Pattern_y(z3);
vz1=Pattern_z(z3);
vx2=Pattern_x(z3)+2*dx;
vy2=Pattern_y(z3)+2*dy;
vz2=Pattern_z(z3)+4*dz;
vx3=Pattern_x(z3)-2*dx;
vy3=Pattern_y(z3)-2*dy;
vz3=Pattern_z(z3)-4*dz;
lines(i,1,:)=[vx2 vy2 vz2];
lines(i,2,:)=[vx3 vy3 vz3];
end
for i=4:6:length(ii)
z4=ii(i);
vx1=Pattern_x(z4);
vy1=Pattern_y(z4);
vz1=Pattern_z(z4);
vx2=Pattern_x(z4)-2*dx;
vy2=Pattern_y(z4)-2*dy;
vz2=Pattern_z(z4)+4*dz;
vx3=Pattern_x(z4)+2*dx;
vy3=Pattern_y(z4)+2*dy;
vz3=Pattern_z(z4)-4*dz;
lines(i,1,:)=[vx2 vy2 vz2];
lines(i,2,:)=[vx3 vy3 vz3];
end
for i=5:6:length(ii)
z5=ii(i);
vx1=Pattern_x(z5);
vy1=Pattern_y(z5);
vz1=Pattern_z(z5);
vx2=Pattern_x(z5)+4*dx;
vy2=Pattern_y(z5);
vz2=Pattern_z(z5);
vx3=Pattern_x(z5)-4*dx;
vy3=Pattern_y(z5);
vz3=Pattern_z(z5);
lines(i,1,:)=[vx2 vy2 vz2];
lines(i,2,:)=[vx3 vy3 vz3];
end
for i=6:6:length(ii)
z6=ii(i);
vx1=Pattern_x(z6);
vy1=Pattern_y(z6);
vz1=Pattern_z(z6);
vx2=Pattern_x(z6);
vy2=Pattern_y(z6)+4*dy;
vz2=Pattern_z(z6);
vx3=Pattern_x(z6);
vy3=Pattern_y(z6)-4*dy;
vz3=Pattern_z(z6);
lines(i,1,:)=[vx2 vy2 vz2];
lines(i,2,:)=[vx3 vy3 vz3];
end
kk = No_of_lines;
Zeta = zeros(No_of_lines,1);
for A=1:kk
for B=2:kk
nA = dot(cross(lines(B,2,:)-lines(B,1,:),lines(A,1,:)-lines(B,1,:)),cross(lines(A,2,:)-lines(A,1,:),lines(B,2,:)-lines(B,1,:)));
nB = dot(cross(lines(A,2,:)-lines(A,1,:),lines(A,1,:)-lines(B,1,:)),cross(lines(A,2,:)-lines(A,1,:),lines(B,2,:)-lines(B,1,:)));
d = dot(cross(lines(A,2,:)-lines(A,1,:),lines(B,2,:)-lines(B,1,:)),cross(lines(A,2,:)-lines(A,1,:),lines(B,2,:)-lines(B,1,:)));
A0 = lines(A,1,:) + (nA/d)*(lines(A,2,:)-lines(A,1,:));
B0 = lines(B,1,:) + (nB/d)*(lines(B,2,:)-lines(B,1,:));
if A0 - B0 == 0
Zeta(B) = B;
end
end
end
f=find(Zeta~=0);
lines(f,:,:)=[];
感谢任何帮助。
答案 0 :(得分:1)
我在你的代码的最后看到的是你发现所有与任何其他行有交集的行,你就全部摆脱它们吧?
这不是最有效的方式,因为:想象行A
和行B
相互交叉,没有其他行。你要删除它们,实际上你可以保留其中一个!
更有效的方法是:
通过这种方式,您可以有效地删除并保留更多内容。