2016-10-05 84 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只有 –