云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

企业邮箱_实惠的云主机_稳定性好

小七 141 0

关于Onshape样条线的所有信息(第1部分,共2部分)

最近,我一直在为一些不同的项目试验Onshape,包括设计显微镜的部件和设计珠宝。我经常发现自己在Linux上与本机CAD工具的有限功能做斗争,所以在任何平台上的浏览器中进行CAD工作的能力都是非常棒的。Onshape并不是玩具:它有一些真正令人印象深刻的功能,可以与基于高端桌面的CAD系统竞争,而且每隔几周它就会变得更好!(请注意,我与公司没有任何关系。我只是一个快乐的用户。)我在任何CAD系统中寻找的一个特性是编程语言或扩展API。大多数CAD任务都有一定程度的结构,我喜欢编写代码来简化重复性任务的想法。珠宝首饰的设计往往需要一个精心设计的过程。Onshape的FeatureScript语言在这方面非常出色:一旦我在FeatureScript中编写了我的自定义"features",它们在Onshape GUI中的行为就像一等公民,我可以简单地插入一个带有给定参数集的"setting"或"prong"。如果您以前做过任何编程,FeatureScript很容易使用。这种语法与其他过程性语言非常相似,因此只需几天就可以成为第二天性。文档并不总是告诉您您想要或需要知道的所有信息,但公平地说,您可以参考大量FeatureScript示例,这些示例由Onshape团队和用户创建。对于我的设计,我需要画很多曲线(然后偏移这些曲线)。虽然我可以在GUI中做我想做的事情,但我花了很长时间才弄清楚如何在FeatureScript中作为自定义特性的一部分来完成它。本文试图为那些追随我脚步的人解释一些缺失的环节。我将从一些关于样条曲线的基本背景开始,然后继续描述如何绘制二维样条曲线(在草图中)、如何绘制三维样条曲线以及如何偏移曲线。样条曲线基础关于样条曲线和多项式有很多数学术语;我将尽可能使用技术上正确的术语和简单的英语。样条曲线是分段多项式。曲线由一段或多段组成,其中每段都是多项式。通常选择多项式,使它们在过渡处"匹配",最终得到一条看起来像一条连续曲线的东西。"匹配"可以有多种定义,所以要产生一个视觉上平滑的曲线,至少需要函数值和一阶导数匹配(C1连续),通常也选择二阶导数来匹配(C2连续)。在草图中使用的同形样条曲线中,这些片段通常是二维x和y中的三次多项式-最大次数为3的多项式。但是,我应该更清楚我的意思,因为在两个维度中,立方多项式至少有三种不同的含义:显式形式可以生成,比如说,一条抛物线y=x2,但不能生成旋转90度的抛物线。因此,对于Onshape这样必须能够在任何方向生成曲线的软件来说,这是没有意义的。隐式形式是最强大的,因为它可以表达其他两种形式无法表达的曲线,但很难计算曲线中的一组点。因此,正如预期的那样,Onshape曲线是参数型的:通过计算函数x(t)和y(t)使t从0到1,参数化地生成二维曲线。函数x(t)和y(t)是样条函数:例如,可能有一个从t=0到t=0.5的多项式段,以及一个从t=0.5到t=1的多项式段。一些与曲线相关的FeatureScript函数,如evEdgeTangentLine()和evEdgeCurvature(),将此参数t作为参数。绘制二维样条曲线-单个多项式段可以使用skFitSpline()函数在Onshape草图中以编程方式创建样条曲线。首先,让我们从两点(0,0)和(100100)之间只有一个多项式段的曲线开始。在FeatureScript中,我们可以写下:结果如下:请注意,我已经指定了startDerivative和endDerivative,它包含起始方向和结束方向。如果我只指定了一个起点和终点,那么结果就是一条直线。当我第一次做这个实验时,我的第一个问题是:"为什么起始导数和结束导数都有长度单位(在这个例子中是150米)通过一些实验,很明显,这些向量应该和曲线一起缩放,也就是说,如果我们将曲线放大一倍,我们也应该将startDerivative和EndDerivate加倍。此外,较大的幅值使曲线在给定方向上以更大的动量发射。例如,以下是startDerivative增加到(500米,0)的曲线:但是这些向量的大小实际上意味着什么?但是,当您考虑上一节中描述的参数化形式的曲线时,一切都变得更加清晰:x=f(t)和y=f(t)。结果表明,在t=0和t=1时,给定的导数向量是(x(t),y(t))对参数t(即(dx/dt,dy/dt))的导数。如果我在下面解释一下,这也是一个抽象的控制点。结果表明,起点和终点以及两个导数向量(总共四对(x,y))唯一地定义了参数三次多项式的八个参数。因此,任何参数三次多项式都可以这样指定。绘制贝塞尔曲线如果你熟悉Bézier曲线,上面的讨论听起来会很熟悉。Bézier曲线由四个控制点(称为P1、P2、P3、P4)定义。曲线从P1向P2方向发射,然后从P3方向接近P4。如果P2离P1更远,那么曲线在给定的方向上以更大的动量发射。事实证明,这些公式只需要少量的数学运算,如果你有Bézier控制点,你可以计算出所需的startDerivative和endDerivative为:式中,对于t在曲线段上从0到1变化的简单情况,Δt为1,3来自多项式的次数(因为d/dt(t3)=3t2)。因此,对于单件样条曲线,起始导数和端导数将是到相应Bézier控制点的距离的三倍。当然,您也可以通过重新排列P1和P2的方程,从startDerivative和endDerivative计算Bézier控制点:计算Onshape中的样条曲线可以使用FeatureScript中的evEdgeTangentLine()函数在任意点计算样条曲线,并提供参数值t(从0到1)。返回的直线对象具有提供求值点的原点,并且其方向与样条曲线相切。这对于在绘制样条曲线后执行进一步的几何图形计算非常有用。为了完整起见,我会注意到还有一个evEdgeTangentLines()函数-它是相同的,但允许在一个调用中计算多个点处的曲线-还有一个evEdgeCurvature()函数,它不仅返回切线,还返回法向量和双法线向量。绘制二维样条曲线-多个多项式片段现在,让我们为样条线添加另一个点:结果如下:现在有两个多项式段,一个在t=0时从(0,0)到t=0.25时的(10,10),在t=0.25时从(10,10)到t=1时的(100100)。两者之间的断点(称为结)在t=0.25处。为什么结在t=0.25?实际上,这个结可以放在"t空间"中的任何地方,例如t=0.1或t=0.5,但由于曲线的第二段要长得多,因此有一个参数可以为第二段指定更多的"t空间"。Onshape使用点之间弦长的平方根作为公制;此处两个弦的长度分别为14.1m和127.3m,因此节点位置选择为sqrt(14.1m)/(sqrt(14.1m)+sqrt(127.3m))=0.25。多项式片段的选择使得一阶导数和二阶导数都是通过中间点连续的,中间点唯一地定义了两个多项式。请注意,如果您只关心一阶导数连续性而不关心二阶导数连续性,那么您实际上可以通过单独绘制这两个部分来获得更多种类的曲线。然后,只要方向匹配,就可以为piece1 endDerivative和piece2 startDerivative选择任何值。对样条曲线更感兴趣吗?是时候休息一下了,但我还远没有讲完样条曲线。在这个博客的第2部分中,我将探讨B样条曲线(与流行的观点相反,它们没有巫毒)、偏移曲线等等!敬请期待。。。