【问题标题】:Reducing the area of the voronoi cells and determining the coordinates of new vertices减小 voronoi 单元的面积并确定新顶点的坐标
【发布时间】:2015-10-12 14:13:59
【问题描述】:

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

【问题讨论】:

  • 在计算上有点复杂,但是如果你知道每个单元的每个顶点,那么你可以遍历每一对单元,检查它们的公共顶点,然后沿着那个顶点画一条粗线。想一想,沿着每个单元格循环可能更快更简单,然后用粗线手动绘制单元格边界。每个边框都有两次,但这应该不是什么大问题。
  • @AndrasDeak 感谢您的评论。我的目的不是增加单元格的宽度。但是要缩小面积。这样当我在 abaqus 软件中导入零件时,边界可以被认为是一个单独的区域,并且可以分配不同的材料属性。我不确定我的声音是否足够清晰。
  • 如果您明确说明您想在 Abaqus 中做什么,那么提出解决方案会更容易。您想要一个零件的装配体,还是每个 Voronoi 单元具有不同属性的零件?
  • @will 我想在半径 (r) 的圆上创建一个 voronoi 单元的分区。 “空白”区域将类似于晶粒边界,而 voronoi 单元将是晶粒。也就是说,晶粒通过晶界相互隔开。
  • 感谢添加第二张图片,这样清晰多了。如果 cst 的回答不够好​​,请添加到您的问题中。如果您只需要这样做一次,并且不打算在 python 中编写脚本,那么您可以使用草图绘制器中的偏移工具。这有点费力,但如果它是一次性的问题可能就足够了。

标签: matlab cells voronoi abaqus


【解决方案1】:

想法: 一种方法是使用 Voronoi 细胞 C{k} 关于对应点 X(k,:) 的类位变换,比例 R 例如 0 R R2,而不是一个常数值)。

请注意,这将“破坏”您的单元格,因为减少的 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'

【讨论】:

  • 感谢您的回复。听起来很合适。我可以使用多边形的质心作为中心,并按比例变换每个顶点。让我试试看。谢谢!
  • 我也想过这个,但这会缩小每个单元格。 @rcy 使用多边形质心的版本解决了这个问题,并使其在视觉上更具吸引力。
  • @AndrasDeak 没有尝试以图形方式表示,所以我宁愿相信你的话。 :-) 我的想法是至少保留 Voronoi 单元的属性之一,即从点到(转换后的)公共边缘的距离相等。
【解决方案2】:

无法遵循您对 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 

看到这个结果后,我认为你需要一种不同的方式来缩小你的侧边。要么减去固定区域,要么减去其他公式。

【讨论】:

  • 非常感谢您的代码,是的,它非常接近我想要的。由于没有绘制最后一面,abaqus 无法绘制出零件。我想我会努力解决这个问题。至少现在我已经接近我的目标了。再次感谢!
  • @rcy 在 Matlab 中没有绘制,但在 abaqus 中绘制。 abaqus line Matlab line命令不同,所以new和new2点是给abaqus做的,不是给Matlab做的。
  • 现在可以使用了!我的错!我犯了一个拼写错误。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 2018-11-12
  • 2021-01-12
  • 2015-07-04
相关资源
最近更新 更多