From 4a29eee0fd33223b2b3005814743a1be6fbcf169 Mon Sep 17 00:00:00 2001 From: thrillerist Date: Sat, 25 Mar 2017 06:32:37 +0800 Subject: [PATCH] localize wiji links/ add 07 (#89) * localize wiki links/add 07 * Revert "localize wiki links/add 07" This reverts commit 9156b326019213aaa8d86e08346a806fef1479fc. revert * localize wiki links/add 07 --- .../sections/decasteljau/content.zh-CN.md | 54 +++++++++++++++++++ components/sections/extended/content.zh-CN.md | 2 +- components/sections/whatis/content.zh-CN.md | 2 +- 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 components/sections/decasteljau/content.zh-CN.md diff --git a/components/sections/decasteljau/content.zh-CN.md b/components/sections/decasteljau/content.zh-CN.md new file mode 100644 index 00000000..597f08f2 --- /dev/null +++ b/components/sections/decasteljau/content.zh-CN.md @@ -0,0 +1,54 @@ +# de Casteljau's 算法 + +要绘制贝塞尔曲线,我们可以从`0`到`1`遍历`t`的所有值,计算权重函数,得到需要画的`x/y`值。但曲线越复杂,计算量也变得越大。我们可以利用“de Casteljau算法",这是一种几何画法,并且易于实现。实际上,你可以轻易地用笔和尺画出曲线。 + +我们用以下步骤来替代用`t`计算`x/y`的微积分算法: + +- 把`t`看做一个比例(实际上它就是),`t=0`代表线段的0%,`t=1`代表线段的100%。 +- 画出所有点的连线,对`n`阶曲线来说可以画出`n`条线。 +- 在每条线的`t`处做一个记号。比如`t`是0.2,就在离起点20%(离终点80%)的地方做个记号。 +- 连接`这些`点,得到`n-1`条线。 +- 在这些新得到的线上同样用`t`为比例标记。 +- 把相邻的`那些`点连线,得到`n-2`条线。 +- 取记号,连线,取记号,等等。 +- 重复这些步骤,直到剩下一条线。这条线段上的`t`点就是原始曲线在`t`处的点。 + +
+ +### 如何实现de Casteljau算法 + +让我们使用刚才描述过的算法,并实现它: + +``` +function drawCurve(points[], t): + if(points.length==1): + draw(points[0]) + else: + newpoints=array(points.size-1) + for(i=0; it为比例的一系列点(例如,以上算法中的"标记点"),然后为新的点列表调用绘制函数。 + +
+ +我们通过实际操作来观察这个过程。在以下的图表中,移动鼠标来改变用de Casteljau算法计算得到的曲线点,左右移动鼠标,可以实时看到曲线是如何生成的。 + + diff --git a/components/sections/extended/content.zh-CN.md b/components/sections/extended/content.zh-CN.md index d9e2dafc..4d9b5aa0 100644 --- a/components/sections/extended/content.zh-CN.md +++ b/components/sections/extended/content.zh-CN.md @@ -25,4 +25,4 @@ -实际上,图形设计和计算机建模中还用了一些和贝塞尔曲线相反的曲线,这些曲线没有固定区间和自由的坐标,相反,它们固定座标但给你自由的区间。["Spiro"曲线](http://levien.com/phd/phd.html)就是一个很好的例子,它的构造是基于[羊角螺线,也就是欧拉螺线](https://en.wikipedia.org/wiki/Euler_spiral)的一部分。这是在美学上很令人满意的曲线,你可以在一些图形包中看到它,比如[FontForge](https://fontforge.github.io)和[Inkscape](https://inkscape.org),它也被用在一些字体设计中(比如Inconsolata字体)。 +实际上,图形设计和计算机建模中还用了一些和贝塞尔曲线相反的曲线,这些曲线没有固定区间和自由的坐标,相反,它们固定座标但给你自由的区间。["Spiro"曲线](http://levien.com/phd/phd.html)就是一个很好的例子,它的构造是基于[羊角螺线,也就是欧拉螺线](https://zh.wikipedia.org/wiki/%E7%BE%8A%E8%A7%92%E8%9E%BA%E7%BA%BF)的一部分。这是在美学上很令人满意的曲线,你可以在一些图形包中看到它,比如[FontForge](https://fontforge.github.io)和[Inkscape](https://inkscape.org),它也被用在一些字体设计中(比如Inconsolata字体)。 diff --git a/components/sections/whatis/content.zh-CN.md b/components/sections/whatis/content.zh-CN.md index 90a785db..c8d74e34 100644 --- a/components/sections/whatis/content.zh-CN.md +++ b/components/sections/whatis/content.zh-CN.md @@ -2,7 +2,7 @@ 操作点的移动,看看曲线的变化,可能让你感受到了贝塞尔曲线是如何表现的。但贝塞尔曲线究竟*是*什么呢?有两种方式来解释贝塞尔曲线,并且可以证明它们完全相等,但是其中一种用到了复杂的数学,另外一种比较简单。所以...我们先从简单的开始吧: -贝塞尔曲线是[线性插值](https://en.wikipedia.org/wiki/Linear_interpolation)的结果。这听起来很复杂,但你在很小的时候就做过线性插值:当你指向两个物体中的另外一个物体时,你就用到了线性插值。它就是很简单的“选出两点之间的一个点”。 +贝塞尔曲线是[线性插值](https://zh.wikipedia.org/wiki/%E7%BA%BF%E6%80%A7%E6%8F%92%E5%80%BC)的结果。这听起来很复杂,但你在很小的时候就做过线性插值:当你指向两个物体中的另外一个物体时,你就用到了线性插值。它就是很简单的“选出两点之间的一个点”。 如果我们知道两点之间的距离,并想找出离第一个点20%间距的一个新的点(也就是离第二个点80%的间距),我们可以通过简单的计算来得到: