diff --git a/chapters/abc/index.js b/chapters/abc/index.js
deleted file mode 100644
index 865ea94d..00000000
--- a/chapters/abc/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-module.exports = generateBase("abc", handler);
\ No newline at end of file
diff --git a/chapters/aligning/index.js b/chapters/aligning/index.js
deleted file mode 100644
index c7583b9e..00000000
--- a/chapters/aligning/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-module.exports = generateBase("aligning", handler);
\ No newline at end of file
diff --git a/chapters/arcapproximation/index.js b/chapters/arcapproximation/index.js
deleted file mode 100644
index c6ffa9d7..00000000
--- a/chapters/arcapproximation/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-var keyHandling = require("../../decorators/keyhandling-decorator.jsx");
-module.exports = keyHandling(generateBase("arcapproximation", handler));
\ No newline at end of file
diff --git a/chapters/arclength/index.js b/chapters/arclength/index.js
deleted file mode 100644
index 4266f2a1..00000000
--- a/chapters/arclength/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-module.exports = generateBase("arclength", handler);
\ No newline at end of file
diff --git a/chapters/arclengthapprox/index.js b/chapters/arclengthapprox/index.js
deleted file mode 100644
index 0dfbc154..00000000
--- a/chapters/arclengthapprox/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-var keyHandling = require("../../decorators/keyhandling-decorator.jsx");
-module.exports = keyHandling(generateBase("arclengthapprox", handler));
\ No newline at end of file
diff --git a/chapters/boundingbox/index.js b/chapters/boundingbox/index.js
deleted file mode 100644
index f4cf27c6..00000000
--- a/chapters/boundingbox/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-module.exports = generateBase("boundingbox", handler);
\ No newline at end of file
diff --git a/chapters/bsplines/index.js b/chapters/bsplines/index.js
deleted file mode 100644
index 373c1192..00000000
--- a/chapters/bsplines/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-module.exports = generateBase("bsplines", handler);
\ No newline at end of file
diff --git a/chapters/canonical/index.js b/chapters/canonical/index.js
deleted file mode 100644
index 314fbfb6..00000000
--- a/chapters/canonical/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-module.exports = generateBase("canonical", handler);
\ No newline at end of file
diff --git a/chapters/catmullconv/index.js b/chapters/catmullconv/index.js
deleted file mode 100644
index 1727f726..00000000
--- a/chapters/catmullconv/index.js
+++ /dev/null
@@ -1,2 +0,0 @@
-var generateBase = require("../../generate-base");
-module.exports = generateBase("catmullconv");
\ No newline at end of file
diff --git a/chapters/catmullmoulding/index.js b/chapters/catmullmoulding/index.js
deleted file mode 100644
index 187b7688..00000000
--- a/chapters/catmullmoulding/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-var keyHandling = require("../../decorators/keyhandling-decorator.jsx");
-module.exports = keyHandling(generateBase("catmullmoulding", handler));
\ No newline at end of file
diff --git a/chapters/circles/index.js b/chapters/circles/index.js
deleted file mode 100644
index 19dacab7..00000000
--- a/chapters/circles/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-module.exports = generateBase("circles", handler);
\ No newline at end of file
diff --git a/chapters/circles_cubic/index.js b/chapters/circles_cubic/index.js
deleted file mode 100644
index 240b5413..00000000
--- a/chapters/circles_cubic/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-module.exports = generateBase("circles_cubic", handler);
\ No newline at end of file
diff --git a/chapters/comments/index.js b/chapters/comments/index.js
deleted file mode 100644
index 57584ec4..00000000
--- a/chapters/comments/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-module.exports = generateBase("comments", handler);
\ No newline at end of file
diff --git a/chapters/components/index.js b/chapters/components/index.js
deleted file mode 100644
index 45bb5cb3..00000000
--- a/chapters/components/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-module.exports = generateBase("components", handler);
\ No newline at end of file
diff --git a/chapters/curvature/index.js b/chapters/curvature/index.js
deleted file mode 100644
index cadcecf9..00000000
--- a/chapters/curvature/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-module.exports = generateBase("curvature", handler);
\ No newline at end of file
diff --git a/chapters/curvefitting/index.js b/chapters/curvefitting/index.js
deleted file mode 100644
index b7aaef9e..00000000
--- a/chapters/curvefitting/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-module.exports = generateBase("curvefitting", handler);
\ No newline at end of file
diff --git a/chapters/curveintersection/index.js b/chapters/curveintersection/index.js
deleted file mode 100644
index 0734c878..00000000
--- a/chapters/curveintersection/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-module.exports = generateBase("curveintersection", handler);
\ No newline at end of file
diff --git a/chapters/decasteljau/content.en-GB.md b/chapters/decasteljau/content.en-GB.md
index bbb9cc9a..dcce3307 100644
--- a/chapters/decasteljau/content.en-GB.md
+++ b/chapters/decasteljau/content.en-GB.md
@@ -13,6 +13,10 @@ Rather than using our calculus function to find `x/y` values for `t`, let's do t
- Place markers, form lines, place markers, etc.
- Repeat this until you have only one line left. The point `t` on that line coincides with the original curve point at `t`.
+To see this in action, mouse-over the following sketch. Moving the mouse changes which curve point is explicitly evaluated using de Casteljau's algorithm, moving the cursor left-to-right (or, of course, right-to-left), shows you how a curve is generated using this approach.
+
+
+
### How to implement de Casteljau's algorithm
@@ -49,6 +53,3 @@ So what does this do? This draws a point, if the passed list of points is only 1
-To see this in action, mouse-over the following sketch. Moving the mouse changes which curve point is explicitly evaluated using de Casteljau's algorithm, moving the cursor left-to-right (or, of course, right-to-left), shows you how a curve is generated using this approach.
-
-
diff --git a/chapters/decasteljau/content.ja-JP.md b/chapters/decasteljau/content.ja-JP.md
index 3a9c30f4..0624b1dc 100644
--- a/chapters/decasteljau/content.ja-JP.md
+++ b/chapters/decasteljau/content.ja-JP.md
@@ -13,6 +13,10 @@
- 印をつけ、直線で結び、印をつけ、……
- 1本の直線になるまで繰り返します。その直線上の`t`の点は、元の曲線上で`t`となる点に一致しています。
+下の図にマウスを乗せると、この様子を実際に見ることができます。ド・カステリョのアルゴリズムによって曲線上の点を明示的に計算していますが、マウスを動かすと求める点が変わります。マウスカーソルを左から右へ(もちろん、右から左へでも)動かせば、このアルゴリズムによって曲線が生成される様子がわかります。
+
+
+
### ド・カステリョのアルゴリズムの実装方法
@@ -48,7 +52,3 @@ function drawCurve(points[], t):
さて、これは何をしているのでしょう?関数に渡す点のリストが長さ1であれば、点を1つ描きます。それ以外であれば、比率tの位置の点(すなわち、さきほどの説明に出てきた「印」)のリストを作り、そしてこの新しいリストを引数にして関数を呼び出します。
-
-下の図にマウスを乗せると、この様子を実際に見ることができます。ド・カステリョのアルゴリズムによって曲線上の点を明示的に計算していますが、マウスを動かすと求める点が変わります。マウスカーソルを左から右へ(もちろん、右から左へでも)動かせば、このアルゴリズムによって曲線が生成される様子がわかります。
-
-
diff --git a/chapters/decasteljau/content.zh-CN.md b/chapters/decasteljau/content.zh-CN.md
index 877ee6d5..2157792f 100644
--- a/chapters/decasteljau/content.zh-CN.md
+++ b/chapters/decasteljau/content.zh-CN.md
@@ -13,6 +13,10 @@
- 取记号,连线,取记号,等等。
- 重复这些步骤,直到剩下一条线。这条线段上的`t`点就是原始曲线在`t`处的点。
+我们通过实际操作来观察这个过程。在以下的图表中,移动鼠标来改变用de Casteljau算法计算得到的曲线点,左右移动鼠标,可以实时看到曲线是如何生成的。
+
+
+
### 如何实现de Casteljau算法
@@ -48,7 +52,3 @@ function drawCurve(points[], t):
以上算法做了什么?如果参数points列表只有一个点, 就画出一个点。如果有多个点,就生成以t为比例的一系列点(例如,以上算法中的"标记点"),然后为新的点列表调用绘制函数。
-
-我们通过实际操作来观察这个过程。在以下的图表中,移动鼠标来改变用de Casteljau算法计算得到的曲线点,左右移动鼠标,可以实时看到曲线是如何生成的。
-
-
diff --git a/chapters/decasteljau/decasteljau.js b/chapters/decasteljau/decasteljau.js
new file mode 100644
index 00000000..a3dc0360
--- /dev/null
+++ b/chapters/decasteljau/decasteljau.js
@@ -0,0 +1,30 @@
+let curve;
+
+setup() {
+ curve = new Bezier(this, 90, 200, 25, 100, 220, 40, 210, 240);
+ setMovable(curve.points);
+}
+
+draw() {
+ clear();
+ curve.drawSkeleton();
+ curve.drawCurve();
+
+ setStroke("rgb(200,100,100)");
+
+ let dim = this.height;
+ let t = this.cursor.x / dim;
+ curve.drawStruts(t);
+ curve.drawPoints();
+
+ let p = curve.get(t);
+ circle(p.x, p.y, 5);
+
+ let perc = (t*100)|0;
+ t = perc/100;
+ text(`Sequential interpolation for ${perc}% (t=${t})`, 10, 15);
+}
+
+onMouseMove() {
+ redraw();
+}
diff --git a/chapters/decasteljau/handler.js b/chapters/decasteljau/handler.js
deleted file mode 100644
index 6cf34631..00000000
--- a/chapters/decasteljau/handler.js
+++ /dev/null
@@ -1,36 +0,0 @@
-module.exports = {
- setup: function(api) {
- var points = [
- {x: 90, y:110},
- {x: 25, y: 40},
- {x:230, y: 40},
- {x:150, y:240}
- ];
- api.setCurve(new api.Bezier(points));
- },
-
- draw: function(api, curve) {
- api.reset();
- api.drawSkeleton(curve);
- api.drawCurve(curve);
-
- if (api.hover) {
- api.setColor("rgb(200,100,100)");
- var dim = api.getPanelWidth();
- var t = api.hover.x / dim;
- var hull = api.drawHull(curve, t);
-
- for(var i=4; i<=8; i++) {
- api.drawCircle(hull[i],3);
- }
-
- var p = curve.get(t);
- api.drawCircle(p, 5);
- api.setFill("black");
- api.drawCircle(p, 3);
- var perc = (t*100)|0;
- t = perc/100;
- api.text("Sequential interpolation for "+perc+"% (t="+t+")", {x: 10, y:15});
- }
- }
-};
diff --git a/chapters/decasteljau/index.js b/chapters/decasteljau/index.js
deleted file mode 100644
index 8861f3ca..00000000
--- a/chapters/decasteljau/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-module.exports = generateBase("decasteljau", handler);
\ No newline at end of file
diff --git a/chapters/derivatives/index.js b/chapters/derivatives/index.js
deleted file mode 100644
index f00f8392..00000000
--- a/chapters/derivatives/index.js
+++ /dev/null
@@ -1,2 +0,0 @@
-var generateBase = require("../../generate-base");
-module.exports = generateBase("derivatives");
\ No newline at end of file
diff --git a/chapters/extremities/index.js b/chapters/extremities/index.js
deleted file mode 100644
index 1c3cd965..00000000
--- a/chapters/extremities/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-module.exports = generateBase("extremities", handler);
\ No newline at end of file
diff --git a/chapters/flattening/index.js b/chapters/flattening/index.js
deleted file mode 100644
index 112e5a31..00000000
--- a/chapters/flattening/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-var keyHandling = require("../../decorators/keyhandling-decorator.jsx");
-module.exports = keyHandling(generateBase("flattening", handler));
\ No newline at end of file
diff --git a/chapters/graduatedoffset/index.js b/chapters/graduatedoffset/index.js
deleted file mode 100644
index 051f8a72..00000000
--- a/chapters/graduatedoffset/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-var keyHandling = require("../../decorators/keyhandling-decorator.jsx");
-module.exports = keyHandling(generateBase("graduatedoffset", handler));
\ No newline at end of file
diff --git a/chapters/inflections/index.js b/chapters/inflections/index.js
deleted file mode 100644
index a28eed56..00000000
--- a/chapters/inflections/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-module.exports = generateBase("inflections", handler);
\ No newline at end of file
diff --git a/chapters/intersections/index.js b/chapters/intersections/index.js
deleted file mode 100644
index f32256bb..00000000
--- a/chapters/intersections/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-module.exports = generateBase("intersections", handler);
\ No newline at end of file
diff --git a/chapters/matrix/index.js b/chapters/matrix/index.js
deleted file mode 100644
index 7d212430..00000000
--- a/chapters/matrix/index.js
+++ /dev/null
@@ -1,2 +0,0 @@
-var generateBase = require("../../generate-base");
-module.exports = generateBase("matrix");
\ No newline at end of file
diff --git a/chapters/matrixsplit/index.js b/chapters/matrixsplit/index.js
deleted file mode 100644
index c38d5464..00000000
--- a/chapters/matrixsplit/index.js
+++ /dev/null
@@ -1,2 +0,0 @@
-var generateBase = require("../../generate-base");
-module.exports = generateBase("matrixsplit");
\ No newline at end of file
diff --git a/chapters/moulding/index.js b/chapters/moulding/index.js
deleted file mode 100644
index 086e4053..00000000
--- a/chapters/moulding/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-module.exports = generateBase("moulding", handler);
\ No newline at end of file
diff --git a/chapters/offsetting/index.js b/chapters/offsetting/index.js
deleted file mode 100644
index c006bed0..00000000
--- a/chapters/offsetting/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-var keyHandling = require("../../decorators/keyhandling-decorator.jsx");
-module.exports = keyHandling(generateBase("offsetting", handler));
\ No newline at end of file
diff --git a/chapters/pointcurves/index.js b/chapters/pointcurves/index.js
deleted file mode 100644
index a65c15f2..00000000
--- a/chapters/pointcurves/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-module.exports = generateBase("pointcurves", handler);
\ No newline at end of file
diff --git a/chapters/pointvectors/index.js b/chapters/pointvectors/index.js
deleted file mode 100644
index 7528b1f4..00000000
--- a/chapters/pointvectors/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-module.exports = generateBase("pointvectors", handler);
\ No newline at end of file
diff --git a/chapters/pointvectors3d/index.js b/chapters/pointvectors3d/index.js
deleted file mode 100644
index e54c6616..00000000
--- a/chapters/pointvectors3d/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-module.exports = generateBase("pointvectors3d", handler);
\ No newline at end of file
diff --git a/chapters/polybezier/index.js b/chapters/polybezier/index.js
deleted file mode 100644
index 9aeb5a1e..00000000
--- a/chapters/polybezier/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-module.exports = generateBase("polybezier", handler);
\ No newline at end of file
diff --git a/chapters/preface/index.js b/chapters/preface/index.js
deleted file mode 100644
index 05dcdb47..00000000
--- a/chapters/preface/index.js
+++ /dev/null
@@ -1,2 +0,0 @@
-var generateBase = require("../../generate-base");
-module.exports = generateBase("preface");
\ No newline at end of file
diff --git a/chapters/projections/index.js b/chapters/projections/index.js
deleted file mode 100644
index 057ae4d3..00000000
--- a/chapters/projections/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-module.exports = generateBase("projections", handler);
\ No newline at end of file
diff --git a/chapters/reordering/index.js b/chapters/reordering/index.js
deleted file mode 100644
index 1e32a75a..00000000
--- a/chapters/reordering/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-var keyHandling = require("../../decorators/keyhandling-decorator.jsx");
-module.exports = keyHandling(generateBase("reordering", handler));
\ No newline at end of file
diff --git a/chapters/shapes/index.js b/chapters/shapes/index.js
deleted file mode 100644
index 95b63766..00000000
--- a/chapters/shapes/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-module.exports = generateBase("shapes", handler);
\ No newline at end of file
diff --git a/chapters/splitting/index.js b/chapters/splitting/index.js
deleted file mode 100644
index d77ea8b5..00000000
--- a/chapters/splitting/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-module.exports = generateBase("splitting", handler);
\ No newline at end of file
diff --git a/chapters/tightbounds/index.js b/chapters/tightbounds/index.js
deleted file mode 100644
index 1d5b97f6..00000000
--- a/chapters/tightbounds/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-module.exports = generateBase("tightbounds", handler);
\ No newline at end of file
diff --git a/chapters/tracing/index.js b/chapters/tracing/index.js
deleted file mode 100644
index 3db2a68c..00000000
--- a/chapters/tracing/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-var keyHandling = require("../../decorators/keyhandling-decorator.jsx");
-module.exports = keyHandling(generateBase("tracing", handler));
\ No newline at end of file
diff --git a/chapters/weightcontrol/index.js b/chapters/weightcontrol/index.js
deleted file mode 100644
index e01d60c3..00000000
--- a/chapters/weightcontrol/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-module.exports = generateBase("weightcontrol", handler);
\ No newline at end of file
diff --git a/chapters/yforx/index.js b/chapters/yforx/index.js
deleted file mode 100644
index 4d03caf4..00000000
--- a/chapters/yforx/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var handler = require("./handler.js");
-var generateBase = require("../../generate-base");
-module.exports = generateBase("yforx", handler);
\ No newline at end of file
diff --git a/images/chapters/decasteljau/2ed0e7bb629970f59960d07f32281374.png b/images/chapters/decasteljau/2ed0e7bb629970f59960d07f32281374.png
new file mode 100644
index 00000000..07dab402
Binary files /dev/null and b/images/chapters/decasteljau/2ed0e7bb629970f59960d07f32281374.png differ
diff --git a/images/chapters/decasteljau/393938684e6cc709b10e8911092848ee.png b/images/chapters/decasteljau/393938684e6cc709b10e8911092848ee.png
new file mode 100644
index 00000000..fac86e03
Binary files /dev/null and b/images/chapters/decasteljau/393938684e6cc709b10e8911092848ee.png differ
diff --git a/images/chapters/decasteljau/425ee92efb13c790f63f8b3821327d3b.png b/images/chapters/decasteljau/425ee92efb13c790f63f8b3821327d3b.png
new file mode 100644
index 00000000..19e750b4
Binary files /dev/null and b/images/chapters/decasteljau/425ee92efb13c790f63f8b3821327d3b.png differ
diff --git a/images/chapters/decasteljau/5f3b714d4a4178ffa186ec59b059ca78.png b/images/chapters/decasteljau/5f3b714d4a4178ffa186ec59b059ca78.png
new file mode 100644
index 00000000..fac86e03
Binary files /dev/null and b/images/chapters/decasteljau/5f3b714d4a4178ffa186ec59b059ca78.png differ
diff --git a/index.html b/index.html
index 7b3f3438..ec3dd4d3 100644
--- a/index.html
+++ b/index.html
@@ -1494,6 +1494,30 @@ function RationalBezier(3,t,w[],r[]):
point at t
.
+
+ To see this in action, mouse-over the following sketch. Moving the
+ mouse changes which curve point is explicitly evaluated using de
+ Casteljau's algorithm, moving the cursor left-to-right (or, of
+ course, right-to-left), shows you how a curve is generated using
+ this approach.
+
+
+
+
+ Scripts are disabled. Showing fallback image.
+
+
How to implement de Casteljau's algorithm
@@ -1532,18 +1556,6 @@ function RationalBezier(3,t,w[],r[]):
for this new list.
-
-
- To see this in action, mouse-over the following sketch. Moving the
- mouse changes which curve point is explicitly evaluated using de
- Casteljau's algorithm, moving the cursor left-to-right (or, of
- course, right-to-left), shows you how a curve is generated using
- this approach.
-
-
- <Graphictitle="Traversing a curve using de Casteljau's algorithm"
- setup={this.setup} draw={this.draw}/>
-
diff --git a/ja-JP/index.html b/ja-JP/index.html
index 1e161d8b..728c3497 100644
--- a/ja-JP/index.html
+++ b/ja-JP/index.html
@@ -1162,6 +1162,26 @@ function RationalBezier(3,t,w[],r[]):
1本の直線になるまで繰り返します。その直線上のt
の点は、元の曲線上でt
となる点に一致しています。
+
+ 下の図にマウスを乗せると、この様子を実際に見ることができます。ド・カステリョのアルゴリズムによって曲線上の点を明示的に計算していますが、マウスを動かすと求める点が変わります。マウスカーソルを左から右へ(もちろん、右から左へでも)動かせば、このアルゴリズムによって曲線が生成される様子がわかります。
+
+
+
+
+ Scripts are disabled. Showing fallback image.
+
+
ド・カステリョのアルゴリズムの実装方法
いま説明したアルゴリズムを実装すると、以下のようになります。
@@ -1190,15 +1210,6 @@ function RationalBezier(3,t,w[],r[]):
さて、これは何をしているのでしょう?関数に渡す点のリストが長さ1であれば、点を1つ描きます。それ以外であれば、比率
tの位置の点(すなわち、さきほどの説明に出てきた「印」)のリストを作り、そしてこの新しいリストを引数にして関数を呼び出します。
-
-
- 下の図にマウスを乗せると、この様子を実際に見ることができます。ド・カステリョのアルゴリズムによって曲線上の点を明示的に計算していますが、マウスを動かすと求める点が変わります。マウスカーソルを左から右へ(もちろん、右から左へでも)動かせば、このアルゴリズムによって曲線が生成される様子がわかります。
-
-
diff --git a/lib/custom-element/api/types/bezier.js b/lib/custom-element/api/types/bezier.js
index 56ed79f2..404d0821 100644
--- a/lib/custom-element/api/types/bezier.js
+++ b/lib/custom-element/api/types/bezier.js
@@ -1,3 +1,4 @@
+import { Vector } from "./vector.js";
import { Bezier as Original } from "../../lib/bezierjs/bezier.js";
/**
@@ -124,6 +125,34 @@ class Bezier extends Original {
ctx.stroke();
ctx.restoreStyle();
}
+
+ drawStruts(t) {
+ const p = this.points.map((p) => new Vector(p));
+ const mt = 1 - t;
+
+ const api = this.api;
+ const ctx = api.ctx;
+ ctx.cacheStyle();
+ api.noFill();
+
+ let s = 0;
+ let n = p.length + 1;
+ while (--n > 1) {
+ let list = p.slice(s, s + n);
+ api.start();
+ for (let i = 0, e = list.length - 1; i < e; i++) {
+ let pt = list[i + 1].subtract(list[i + 1].subtract(list[i]).scale(mt));
+ p.push(pt);
+ api.vertex(pt.x, pt.y);
+ api.circle(pt.x, pt.y, 5);
+ }
+ api.end();
+ s += n;
+ }
+ ctx.restoreStyle();
+
+ return p;
+ }
}
export { Bezier };
diff --git a/zh-CN/index.html b/zh-CN/index.html
index c6a1e6db..5bccd8ad 100644
--- a/zh-CN/index.html
+++ b/zh-CN/index.html
@@ -1126,6 +1126,27 @@ function RationalBezier(3,t,w[],r[]):
重复这些步骤,直到剩下一条线。这条线段上的t
点就是原始曲线在t
处的点。
+
+ 我们通过实际操作来观察这个过程。在以下的图表中,移动鼠标来改变用de
+ Casteljau算法计算得到的曲线点,左右移动鼠标,可以实时看到曲线是如何生成的。
+
+
+
+
+ Scripts are disabled. Showing fallback image.
+
+
如何实现de Casteljau算法
让我们使用刚才描述过的算法,并实现它:
@@ -1155,15 +1176,6 @@ function RationalBezier(3,t,w[],r[]):
就画出一个点。如果有多个点,就生成以
t为比例的一系列点(例如,以上算法中的"标记点"),然后为新的点列表调用绘制函数。
-
-
- 我们通过实际操作来观察这个过程。在以下的图表中,移动鼠标来改变用de
- Casteljau算法计算得到的曲线点,左右移动鼠标,可以实时看到曲线是如何生成的。
-
-
- <Graphictitle="用de Casteljau算法来遍历曲线" setup={this.setup}
- draw={this.draw}/>
-