我编写了一个 MATLAB 代码来创建使用 voronoi 附加的图形。我感兴趣的区域是红色圆圈。因此,voronoi 的种子被保留在该地区。
问问题
704 次
2 回答
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'
于 2015-10-12T14:47:05.397 回答
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
看到这个结果后,我认为你需要一种不同的方式来缩小你的两侧。要么减去固定区域,要么减去其他公式。
于 2015-10-12T19:19:04.463 回答