diff --git a/docs/index.html b/docs/index.html index ec97e716..cb0a533f 100644 --- a/docs/index.html +++ b/docs/index.html @@ -38,7 +38,7 @@ - + diff --git a/docs/ja-JP/index.html b/docs/ja-JP/index.html index 2a9b6d5d..84543586 100644 --- a/docs/ja-JP/index.html +++ b/docs/ja-JP/index.html @@ -41,7 +41,7 @@ - + diff --git a/docs/ko-KR/index.html b/docs/ko-KR/index.html index b8abfb59..b8023607 100644 --- a/docs/ko-KR/index.html +++ b/docs/ko-KR/index.html @@ -43,7 +43,7 @@ - + diff --git a/docs/news/2020-09-18.html b/docs/news/2020-09-18.html index e7613566..c7a6ebf0 100644 --- a/docs/news/2020-09-18.html +++ b/docs/news/2020-09-18.html @@ -33,8 +33,8 @@ - - + + diff --git a/docs/news/2020-11-22.html b/docs/news/2020-11-22.html index bad48a60..3b5be1c2 100644 --- a/docs/news/2020-11-22.html +++ b/docs/news/2020-11-22.html @@ -33,8 +33,8 @@ - - + + diff --git a/docs/news/index.html b/docs/news/index.html index fec549c5..6f595f28 100644 --- a/docs/news/index.html +++ b/docs/news/index.html @@ -33,7 +33,7 @@ - + diff --git a/docs/news/rss.xml b/docs/news/rss.xml index ecb01750..331aa43d 100644 --- a/docs/news/rss.xml +++ b/docs/news/rss.xml @@ -6,7 +6,7 @@ News updates for the primer on Bézier Curves by Pomax en-GB - Mon Jul 24 2023 09:20:29 +00:00 + Mon Jul 24 2023 16:25:38 +00:00 https://pomax.github.io/bezierinfo/images/og-image.png A Primer on Bézier Curves @@ -23,7 +23,7 @@ <p>— <a href="https://mastodon.social/@TheRealPomax">Pomax</a></p> - Sat Nov 21 2020 16:00:00 +00:00 + Sun Nov 22 2020 00:00:00 +00:00 2020-11-22.html Rewriting the tech stack @@ -118,7 +118,7 @@ draw() { <p>— <a href="https://mastodon.social/@TheRealPomax">Pomax</a></p> - Thu Sep 17 2020 17:00:00 +00:00 + Fri Sep 18 2020 00:00:00 +00:00 2020-09-18.html diff --git a/docs/ru-RU/index.html b/docs/ru-RU/index.html index b73e85c6..cd0d93b6 100644 --- a/docs/ru-RU/index.html +++ b/docs/ru-RU/index.html @@ -34,7 +34,7 @@ - + diff --git a/docs/uk-UA/index.html b/docs/uk-UA/index.html index 2b44204b..ff4abae9 100644 --- a/docs/uk-UA/index.html +++ b/docs/uk-UA/index.html @@ -39,7 +39,7 @@ - + diff --git a/docs/zh-CN/index.html b/docs/zh-CN/index.html index c1e03202..67e191a7 100644 --- a/docs/zh-CN/index.html +++ b/docs/zh-CN/index.html @@ -35,7 +35,7 @@ - + @@ -1926,8 +1926,8 @@

--> @@ -1945,9 +1945,9 @@

-->

@@ -1965,8 +1965,8 @@

--> @@ -1984,9 +1984,9 @@

-->

@@ -2008,59 +2008,20 @@

推导新的凸包坐标

--> - - - - - - + + +

以上变形可行是因为[M · M-1推导新的凸包坐标 -->

很好!现在得出新的二次曲线:

@@ -2099,8 +2060,8 @@

推导新的凸包坐标

--> @@ -2115,8 +2076,8 @@

推导新的凸包坐标

--> @@ -2132,8 +2093,8 @@

推导新的凸包坐标

--> @@ -2160,8 +2121,8 @@

推导新的凸包坐标

--> @@ -2176,8 +2137,8 @@

推导新的凸包坐标

--> @@ -2193,8 +2154,8 @@

推导新的凸包坐标

--> @@ -2209,8 +2170,8 @@

推导新的凸包坐标

--> @@ -2225,8 +2186,8 @@

推导新的凸包坐标

--> @@ -2242,8 +2203,8 @@

推导新的凸包坐标

--> @@ -2258,8 +2219,8 @@

推导新的凸包坐标

--> @@ -2275,8 +2236,8 @@

推导新的凸包坐标

--> @@ -2302,8 +2263,8 @@

推导新的凸包坐标

--> @@ -2320,8 +2281,8 @@

推导新的凸包坐标

--> @@ -2341,8 +2302,8 @@

推导新的凸包坐标

--> @@ -2362,9 +2323,9 @@

推导新的凸包坐标

-->

@@ -2386,16 +2347,9 @@

如果有一条二次曲线,那么可以如下构造三次曲线精确重现原来的曲线:首先选择相同的起点和终点,然后两个控制点分别选为“1/3起点+2/3终点”和“2/3起点+1/3终点”。所得曲线与原来的相同,只不过表示为了三次曲线而不是二次曲线。

n次曲线升为n+1次曲线的一般规则如下(注意起点和终点的权重与旧曲线的相同):

- - +

然而这一规则也直接意味着通常无法n次曲线稳妥地降到n-1次,这是因为控制点无法被简洁地“拆开”。可以做些尝试,但所得曲线不会与原曲线重合,而且其实还可能看起来完全不同。

@@ -2406,13 +2360,9 @@

>中亦有解释),但是为了用上这种方法,需要先做些变形再转用线性代数。正如矩阵表示一章所言,有些东西用矩阵去做比用函数方便得多,而这就是一例。那么……开始吧!

先将标准的贝塞尔函数写得紧凑一些:

- - +

然后用一个朴素(其实极其有用)的变形技巧:既然t值总在0到1之间(含端点),且1-tt恒等于1,那么任何数都可表示为t1-t的和:

@@ -2420,7 +2370,7 @@

x = 1 x = ((1-t) + t) x = (1-t) x + t x = x (1-t) + x t --> - +

于是用这一看似平凡的性质可将贝塞尔函数拆分为1-tt两部分之和:

- +

目前一切顺利。现在为了理解为什么这么做,将1-tt两部分具体写出并观察结果。首先是1-t

- - +

用这一看似朴素的技巧瞬间就将n次贝塞尔函数的一个部分用n+1次贝塞尔函数表示出来了,这非常像曲线升次!当然t的部分也要表示出来,但这不是问题:

- - +

n次的表达式变为n+1次的之后再将其重新合并。虽然n次函数是从0到n求和,n+1次函数是从0到n+1求和,但补上“贡献为零”的项即可。下一章“导数”会论述为什么“没有对应的二项式系数的更高次项”和“低于零次的项”都“贡献为零”,因此需要什么形式的项就可以加上什么项。将这些项包含在和式中没有影响,而所得函数与低次曲线依然相等:

- - +

接下来从变形转到线性代数(矩阵)——现在Bézier(n,t)和Bézier(n+1,t)之间的关系可用非常简单的矩阵乘法表示:

- +

其中矩阵M(n+1)×n阶的矩阵,其形如:

@@ -2573,9 +2463,9 @@

-->

其中的步骤为:

@@ -2630,8 +2520,8 @@

--> @@ -2644,8 +2534,8 @@

--> @@ -2662,134 +2552,39 @@

“慢着,为什么这是对的?”

虽然有时候有人告诉说“这是导数”就行,但还是可能想一探究竟。既然如此,就来看看这个导数的证明。首先,因为权重不影响完整的贝塞尔函数的求导,所以求导只涉及多项式基函数的导数。基函数的导数为:

- - +

使用乘积求导法则复合函数求导法则得到:

- - +

上式不易处理,因此打开括号:

- - +

现在技巧性的一步是将上式再次化为含二项式系数的形式,需要得到形如“x!/y!(x-y)!”的项。如果得到关于n-1和k-1的项,那么说明方向是对的。

- - +

这是第一步。上式括号里的两项其实为标准的、低一次的贝塞尔函数:

- - +

现在将上式应用于已有的加权贝塞尔函数。先写出之前所见的平面曲线公式,再逐步求出导数:

- - +

如果打开上式的括号(用颜色表示相匹配的项),再按递增的k值重排各项,那么有:

- - +

上式中有两项会消失掉:因为任意和式都没有第-1项,所以上式第一项消失。既然这一项总是贡献为零,那么求导时就可以放心地将其完全无视。消失的另外一项为展开式的最后一项——包含B“慢着,为什么这是对的?” >的一项。这一项含有二项式系数Cii+1,而这一系数通常约定等于0。因此这一项贡献为零,也可被略去。这意味着剩下的项为:

- - +

此即低次函数之和:

- - +

将上式改写为正常的和式即可:

- - +

将上式改写为与原式相似的形式有助于看出它们的区别。先写出原式,再写出导数:

- - - - + +

有什么区别?对于实际的贝塞尔曲线而言几乎没有区别!虽然次数降低了(从n次变为n-1次),但是贝塞尔函数没有改变。唯一的真正的区别在于推导表示曲线的函数时权重如何变化。如果有A、B、C、D四个点,那么导数有三个点,二阶导数有两个点,三阶导数有一个点:

- - +

只要有多于一个权重即可运用这一方法。只剩一个权重时,下一步会出现k=0,而贝塞尔函数的和式因为无项可加而化为零。因此二次函数没有二阶导数,三次函数没有三阶导数,更一般地有n次函数有n-1阶(有意义的)导数,其更高阶导数为零。

@@ -2913,9 +2642,9 @@

-->

此即所需的方向向量。可以在每一点将方向向量规范化后得到单位方向向量(即长度为1.0),再根据这些方向进行所需的操作:

@@ -2938,32 +2667,17 @@

-->

切向量对于沿曲线移动很有用,但如果要从曲线附近“移向远处”,而且移动方向与曲线在某点t处垂直,那该怎么办?这时需要的是向量。这一向量与曲线的方向保持垂直,且长度通常为1.0,因此只需旋转单位方向向量即可:

- - +

其实旋转坐标只要知道方法就非常简单——“施加旋转矩阵 --> @@ -2990,8 +2704,8 @@

--> @@ -3125,19 +2839,51 @@

实现旋转最小化标架

首先假设已有函数用于计算上文提及的指定点的弗勒内标架,输出的标架具有如下性质:

-
{
+
+						
+							
+								
+								
+							
+							
+								
+							
+							
+								
+							
+							
+								
+							
+							
+								
+							
+							
+								
+							
+						
1 + +
2
3
4
5
6
+

再如下写出生成一系列旋转最小化标架的函数:

-
generateRMFrames(steps) -> frames:
+
+						
+							
+								
+								
+							
+							
+								
+							
+							
+								
+							
+							
+								
+							
+							
+								
+							
+							
+								
+							
+							
+								
+							
+							
+								
+							
+							
+								
+							
+							
+								
+							
+							
+								
+							
+							
+								
+							
+							
+								
+							
+							
+								
+							
+							
+								
+							
+							
+								
+							
+							
+								
+							
+							
+								
+							
+							
+								
+							
+							
+								
+							
+							
+								
+							
+							
+								
+							
+							
+								
+							
+							
+								
+							
+							
+								
+							
+							
+								
+							
+							
+								
+							
+							
+								
+							
+						
1 + +
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
+

即使忽略注释,代码也明显比计算单个弗勒内标架的多,但也没有多得离谱,而且得到了长得更好的法向量。