我只想在一個域中生成許多行,至少有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