我只想在一个域中生成许多行,至少有6个单元以及特定的方向和方向(线是金字塔的元素 - 即每行有60度方向),它们之间没有任何交集。 如何做那?Matlab,如何生成没有任何交叉点的随机线?
我做了一个,但效率不高,刚刚生成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,:,:)=[];
任何帮助表示赞赏。
只是一个想法,但如果你随机生成点(如200)并将它们连接到最近的邻居呢?然后删除连接到第二个线串(但每个线对只有一个)的任何线串。这些线路有多长时间? – user2441511
其实,我做到了! 我生成随机点,并在每个点我把不同的线等,但我无法得到没有交集所需的线数 –
为什么只剩下5线?似乎应该有更多...如果你检测到'中间'线串,万一有超过两个连接。所以删除其他所有线串。就像是 。 - -。 - 。 - - 。 - -。 - 。会成为 。 - -。 ----。 .--。 – user2441511