1.5 例题4:应用Dynamo绘制心形线
1.解题思路
心形线由两个函数构成,根据函数关系式,可以求得x的取值范围为[-5.4,5.4]。沿用前几个例题中“描点”法的思路,要绘制心形线首先分别找到两个函数图像上的一系列点集,然后用光滑的曲线依次连接各点即可(图1-35)。
图1-35
2.知识点
● List Create
● List. Reverse
● List. Flatten
● NurbsCurve. ByPoints(closeCurve)
3.例题详解
(1)创建两个函数图像上的点。绝对值也是一种函数,选择Math(数学)→Functions(函数)→Abs(求绝对值),添加Abs(求绝对值)节点,如图1-36所示。
图1-36
这里有两个绝对值节点,它们的区别在于输入、输出的数据类型不一样:一个是double型(双精度型浮点数据),另一个是int型(整数类型),使用时根据实际项目需要选择适用的数据类型。
同理,选择Math(数学)→Functions(函数)→Sqrt(开平方根函数),添加Sqrt(开平方根函数)节点。
根据前面已学的知识点,可以顺利地找到两个函数图像上的点,主要操作步骤如下(图1-37)。
图1-37
1)采用Range(范围)节点来构建一组点。
2)通过Math. Abs(求绝对值)节点及数学运算符号“∗”获取一组点y=0.6|x|。
3)通过Math. Sqrt(开平方根函数)节点、数学运算符号“∗”及数学运算符号“-”获取一组点y=0.8。
4)通过数学运算符号“+”获取一组点y=0.6|x|+0.8。
5)获取一组坐标数据(x,0.6|x|+0.8)。
6)同样的方法获取另一组坐标数据(x,0.6|x|-0.8)。
提示
这两组坐标数据的x值为同一组数据,均为第一步中通过Range(范围)节点来构建的一组点。
用两个NurbsCurve.ByPoints(通过点的样条曲线)节点只能将两个函数的点分别串联,但是心形线并不能完全闭合,如图1-38所示。
(2)合并二维列表,降低二维列表维度。为了解决这个问题,首先想到的办法就是将点进行叠加,也就是把两组点变成一组点,再输入NurbsCurve.ByPoints(通过点的样条曲线)节点。
看上去是两组点的合并,实际上是对两个列表的处理。
在List(列表)下Generate(创建)里有List Create(创建列表)节点,它可以将多组列表进行叠加,如图1-39所示。
图1-38
图1-39
将两组点接入List Create(创建列表)节点,再输入NurbsCurve.ByPoints(通过点的样条曲线)节点。
结果如图1-40所示,显然问题并没有得到解决,这是为什么呢?
图1-40
通过查看List Create(创建列表)节点发现,它确实对列表进行了叠加,但是它依然是一个二维列表,只是被组合在一起了。
现在需要做的是将二维列表变为一维列表。
这里需要使用List(列表)下Modify(修改)里的List.Flatten(列表拍平)节点,如图1-41所示,它可以降低列表维度,默认情况是降低1个维度,也可根据具体情况设置。
降维后再次输入NurbsCurve.ByPoints(通过点的样条曲线)节点,如图1-42所示。此时实现了用一条曲线串联各点的目的,但是明显连接顺序有问题,且没有闭合。
图1-41
图1-42
(3)调整列表中连接两个函数点的顺序。再次分析发现,NurbsCurve.ByPoints(通过点的样条曲线)是按照列表中点的顺序,依次连接各点形成曲线,如图1-43所示。
第二组数据,即h(x)函数上的点是从左边开始依次排序的,所以会出现两组数据对角相连的情况。也就是说,如果将第二组数据的排序反转,让它从右边开始排序,就不会出现图1-43中的错误情况了。
图1-43
对于列表的处理,可以使用List(列表)下Organize(组织)里的List.Reverse(列表倒序)节点。利用List.Reverse(列表倒序)节点可以将函数h(x)上的点反转排序,然后再用NurbsCurve.ByPoints(通过点的样条曲线)节点串联各点形成曲线,如图1-44所示。
运行之后发现,图1-44中的曲线并没有闭合,有一端是开放的。
图1-44
这是使用的节点的问题,需要替换一个可以使曲线闭合的节点。
(4)将曲线闭合。重新寻找合适的节点,在Geometry(几何学)→Curves(线)→NurbsCurve(样条曲线)中,有多个ByPoints(通过点的样条曲线)节点,选择可以通过布尔运算控制是否闭合的节点,如图1-45所示。
替换原来的节点:在Input(输入)→Basic(基础数据)→Boolean(布尔值),修改布尔值为True(真值),也就是要求曲线闭合,这样就完成了心形线绘制,如图1-46所示。
图1-45
图1-46
保存文件为“心形线.dyn”。