递归和递归定义的几何对象

作者图像

经过Bjorn Sjodin

2019年7月17日

递归定义的几何结构可能在工程应用(例如宽带天线和超材料)中有用。有关某些应用程序的简要概述,请查看以前的关于分形的博客文章。在这篇博客文章中,我们将研究如何通过算法手段快速生成此类几何对象。

使用方法和应用程序构建器作为递归定义的几何对象

您可以使用应用程序构建器中的方法编辑器来创建执行几乎任何类型的建模任务(包括几何建模)的方法。很容易错过这样一个事实,即方法可以通过在递归循环中调用自己的方法来支持递归。

在这里,我们将通过两个著名的递归结构实例演示递归:Sierpinski地毯在2D和Menger Sponge在3D中。这些示例的代码足够简短,因此我们可以完整地列出它们,并且有链接可以在帖子结束时下载这些示例。

Sierpinski地毯

以下方法,create_carpet根据输入参数将递归运行到特定递归水平等级。它将限制设置为5级,以避免创建极大的几何形状。(如果您认为您的计算机可以处理它,则可以更改此操作。)

如果(级别<1)错误(“地毯水平至少为1.”);如果(级别> 5)错误(“地毯级别最多需要5。”);计数器= 0;model.component(“ comp1”)。geom(“ geom1”)。feature()。clear();model.component(“ comp1”)。geom(“ geom1”)。自动建筑(“ off”);double cx0 = 0,cy0 = 0;双si0 = 1;地毯(级别,CX0,CY0,SI0);model.component(“ comp1”)。geom(“ geom1”)。runpre(“ fin”);

输入参数等级在方法中定义设置窗口,如下所示。

屏幕截图显示了create_carpet方法的设置。

方法create_carpet,反过来调用主要递归功能地毯,下面列出的,使用递归级别的四个输入参数,中心X-y- 坐标和当前侧长。

输入参数在该方法的设置窗口,如下所示。

屏幕截图,显示了Carpet_Method的输入参数列表。

这是该方法的代码地毯

int l =级别;双POSX,POSY,SI1;字符串strix;int l1;for(int i = 0; i <3; i ++){for(int j = 0; j <3; j ++){posx = cx+i*si-si;posy = cy+j*si-si;strix = toString(i)+tostring(j);if((((i-1))+MATH.ABS((J-1)))> 0){if(l == 1){Counter = Counter+1;model.component(“ comp1”)。geom(“ geom1”)。创建(“ sq”+strix+“ c”+tostring(counter),“ square”);使用(model.component(“ comp1”)。geom(“ geom1”)。功能(“ sq”+strix+“ c”+toString(counter))); set("base", "center"); set("size", new double[]{si}); set("pos", new double[]{posx, posy}); endwith(); model.component("comp1").geom("geom1").feature("sq"+strix+"C"+toString(counter)).label("Square"+strix+"C"+toString(counter)); } else { l1 = l-1; si1 = si/3; carpet(l1, posx, posy, si1); } } } }

请注意,为了获得连续的平方对象编号,使用了整数变量计数器(在声明), 如下所示。

整数变量计数器的设置窗口的屏幕截图。

这两个函数的代码在方法编辑器中并排显示:

comsolMultiphysics®中的方法编辑器的屏幕截图显示并排代码。

为了运行create_carpet,您首先将其添加为方法调用。相应的菜单按钮可在开发人员标签。

屏幕截图显示如何通过方法调用按钮运行Create_carpet方法。

添加后,您可以更改递归级别,然后单击跑步按钮。

屏幕截图显示如何在调用方法时更改递归级别。

下图显示了3级地毯所得的几何形状。

图像显示了3级Sierpinski地毯的几何形状。

请注意,为3级地毯定义的平方几何对象的数量为512。n级地毯的几何对象的数量为8n。这意味着,对于该方法设置的最大级别5create_carpet,结果几何形状具有32,768个几何对象!如果您尝试5级地毯,请确保拥有足够强大的计算机!

Menger Sponge

我们已经浏览了2D中递归定义的几何对象,但是3D对象呢?Sierpinski地毯的3D版本称为Menger Sponge。Sierpinski地毯的方法很容易概括为3D。但是,在3D中,您需要注意不要生成比计算机所能处理的更多对象。

以下方法,create_sponge,启动递归。

如果(级别<1)错误(“海绵水平必须至少为1.”);如果(级别> 3)错误(“海绵水平最多需要3。”);计数器= 0;model.component(“ comp1”)。geom(“ geom1”)。feature()。clear();model.component(“ comp1”)。geom(“ geom1”)。自动建筑(“ off”);double cx0 = 0,cy0 = 0,cz0 = 0;双si0 = 1;海绵(水平,CX0,CY0,CZ0,SI0);model.component(“ comp1”)。geom(“ geom1”)。runpre(“ fin”);

方法海绵(如下所示)通过上述方法调用,并递归地创建了Menger Sponge。

int l =级别;双POSX,POSY,POSZ,SI1;字符串strix;int l1;for(int i = 0; i <3; i ++){for(int j = 0; j <3; j ++){for(int k = 0; k <3; k ++){posx = cx+i*si-si;posy = cy+j*si-si;posz = cz+k*si-si;strix = toString(i)+tostring(j)+toString(k);if(((abs((i-1))+MATH.ABS((J-1))+MATH.ABS((K-1)))> 1){if(l == 1){Counter =计数器+1; model.component("comp1").geom("geom1").create("blk"+strix+"C"+toString(counter), "Block"); with(model.component("comp1").geom("geom1").feature("blk"+strix+"C"+toString(counter))); set("base", "center"); set("size", new String[]{toString(si), toString(si), toString(si)}); set("pos", new double[]{posx, posy, posz}); endwith(); model.component("comp1").geom("geom1").feature("blk"+strix+"C"+toString(counter)).label("Block"+strix+"C"+toString(counter)); } else { l1 = l-1; si1 = si/3; sponge(l1, posx, posy, posz, si1); } } } } }

下图显示了2级海绵的生成几何形状。

图像在ComsolMultiphysics®中显示了递归定义的几何对象。

在这种情况下,几何对象的数量随n级为20的生长n,上面显示的2级海绵具有400个块几何对象。

您不必使用递归来创建这种类型的结构,如先前所示关于创建科赫雪花的迭代方法的博客文章

如果您有任何附加产品用于其他CAD功能,则可以在标准CAD格乐动体育app无法登录式上导出这些几何对象。没有附加产品,您仍然可以将网状几何形状导出到任何受支持的网格格式(例如STL)。

下一步

通过单击下面的按钮,尝试在此博客文章中使用的模型,这将带您到应用程序库。


评论(2)

发表评论
乐动体育app
加载...
伯恩哈德·瓦伦蒂尼(Bernhard Valentini)
伯恩哈德·瓦伦蒂尼(Bernhard Valentini)
2019年7月18日

请从您的示例代码中删除编程错误。

Bjorn Sjodin
Bjorn Sjodin
2019年7月18日

嗨,伯恩哈德,

感谢您发现副本和束缚错误。现在已经修复了。

比约恩

探索comsol乐动体育赛事播报博客