减少voronoi单元的面积并确定新顶点的坐标

时间:2015-10-12 14:13:59

标签: matlab cells voronoi abaqus

我编写了一个MATLAB代码来创建使用voronoi附加的图形。我感兴趣的区域是红圈。因此,voronoi的种子被保留在该地区内。

2 个答案:

答案 0 :(得分:2)

想法:一种方法是使用Voronoi单元格C{k}相对于相应点X(k,:)的相似变换,比率 R 例如0< R < 1.细胞的形状 - 角的数量及其相关的角度 - 将被保留,并且面积将按比例减少(即通过因子 R 2 ,而不是一个恒定的值。)

请注意,这将"销毁"你的细胞,因为减少的Voronoi细胞将不再共享顶点/边缘,因此[V,C]表示不再像现在这样工作。此外,曾经共同边缘之间的距离将取决于原始单元格的面积(更大的单元格,相邻边缘之间的距离更大)。

2个2D点的转换示例:

A   = [1,2];        %'Center'
B   = [10,1];       %'To be transformed'
R   = 0.8;          %'Transformation ratio'
trB = A + R*(B-A);  %'Transformed'

答案 1 :(得分:1)

无法遵循您对CST-link的想法的实现,但这里有一个可行(我在matlab中测试过,但还没有在abaqus中测试,它吐出的代码看起来像abaqus应该对它感到高兴)

rng(0);
x=rand(40,2);
plot(x(:,1),x(:,2),'x')
[v,c]=voronoin(x);
fact=0.9;

for i=1:length(c)
    cur_cell=c{i};
    coords=v(cur_cell,:);
    if isfinite(coords)
        %fact=somefunctionofarea?;
        centre=x(i,:); % i used the voronoi seeds as my centres
        coords=bsxfun(@minus,coords,centre); %move everything to a local coord sys centred on the seed point
        [theta,rho] = cart2pol(coords(:,1),coords(:,2));
        [xnew, ynew]= pol2cart(theta,rho*fact);
        xnew=xnew+centre(1); % put back in real coords. 
        ynew=ynew+centre(2);
        xnew2=circshift(xnew,1);
        ynew2=circshift(ynew,1);
        fprintf('s1.Line(point1=(%f,%f),point2=(%f,%f))\n',...
            [xnew, ynew, xnew2,ynew2]'); 
        line(xnew,ynew); %testing purposes - doesn't plot last side in matlab
    end
end 

看过这个结果后,我想你需要一个不同的方法来缩小你的方面。要么减去固定区域还是其他公式。

相关问题