Matlab,如何生成没有任何交叉点的随机线?

时间:2016-10-05 13:18:31

标签: matlab

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

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我在你的代码的最后看到的是你发现所有与任何其他行有交集的行,你就全部摆脱它们吧?

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

更有效的方法是:

  1. 随机生成多行,
  2. 评估每行的重叠次数
  3. 相应地对它们进行排序,
  4. 删除列表的少数百分比
  5. 重复步骤2到4,直到没有重叠。
  6. 通过这种方式,您可以有效地删除并保留更多内容。