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

Reducing the area of the voronoi cells and determining the coordinates of new vertices

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

想法: 一种方法是使用关于对应点 X(k,:) 的 Voronoi 单元 C{k} 的同位变换,比率 R 例如 0 < R < 1。单元格的形状——角的数量和它们相关的角度——将被保留,并且区域将按比例减少(即减少 R2,而不是固定值)。

请注意,这将 "destroy" 您的单元格,因为减少的 Voronoi 单元格将不再共享 vertices/edges,因此 [V,C] 表示不再有效。此外,曾经共同的边缘之间的距离将取决于原始单元格的面积(单元格越大,相邻边缘之间的距离越大)。

2个二维点的变换示例:

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

无法理解你对 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 

看到这个的结果后,我认为你需要一个不同的方法来缩小你的边。减去固定面积或其他一些公式。