2016-10-05 42 views
0

我只想在一个域中生成许多行,至少有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,:,:)=[]; 

任何帮助表示赞赏。

+0

只是一个想法,但如果你随机生成点(如200)并将它们连接到最近的邻居呢?然后删除连接到第二个线串(但每个线对只有一个)的任何线串。这些线路有多长时间? – user2441511

+0

其实,我做到了! 我生成随机点,并在每个点我把不同的线等,但我无法得到没有交集所需的线数 –

+1

为什么只剩下5线?似乎应该有更多...如果你检测到'中间'线串,万一有超过两个连接。所以删除其他所有线串。就像是 。 - -。 - 。 - - 。 - -。 - 。会成为 。 - -。 ----。 .--。 – user2441511

回答

1

我在代码的最后看到的是,你发现所有与其他行有交集的行,并且你将它们都清除掉了,对吧?

这不是最有效的方式,因为:想象一下行A和行B彼此交叉,没有其他行。你正在删除它们,而实际上你可以保留其中的一个!

一个更有效的方式将是:

  1. 随机生成许多线,
  2. 评估每行重叠的数量,
  3. 排序它们相应地,
  4. 取下上很少列表中的百分之
  5. 重复步骤2到4,直到没有重叠。

这种方式,你将有效地删除和保持更多。

+0

我得到你在说什么,但在一天结束时,我不需要任何线路之间的任何交集,所以我认为结果将是相同的。而且,我试图循环超过几十,但结果是不可接受的 –

+2

你错了,结果会不一样。想象一下,“A”行和“B”行相互交叉,没有其他行。你正在删除它们,而实际上你可以保留其中的一个! – erfan

+0

不,我删除其中一个:) A是一条线,B是另一条线,并且当条件将正确删除B时,我存储B只有 –