From 09fa4991a7149f6a0fdc95e8a738d1e69ae34b63 Mon Sep 17 00:00:00 2001 From: Pomax Date: Tue, 11 Aug 2020 16:07:21 -0700 Subject: [PATCH] decasteljau --- chapters/abc/index.js | 3 -- chapters/aligning/index.js | 3 -- chapters/arcapproximation/index.js | 4 -- chapters/arclength/index.js | 3 -- chapters/arclengthapprox/index.js | 4 -- chapters/boundingbox/index.js | 3 -- chapters/bsplines/index.js | 3 -- chapters/canonical/index.js | 3 -- chapters/catmullconv/index.js | 2 - chapters/catmullmoulding/index.js | 4 -- chapters/circles/index.js | 3 -- chapters/circles_cubic/index.js | 3 -- chapters/comments/index.js | 3 -- chapters/components/index.js | 3 -- chapters/curvature/index.js | 3 -- chapters/curvefitting/index.js | 3 -- chapters/curveintersection/index.js | 3 -- chapters/decasteljau/content.en-GB.md | 7 ++-- chapters/decasteljau/content.ja-JP.md | 8 ++-- chapters/decasteljau/content.zh-CN.md | 8 ++-- chapters/decasteljau/decasteljau.js | 30 +++++++++++++++ chapters/decasteljau/handler.js | 36 ------------------ chapters/decasteljau/index.js | 3 -- chapters/derivatives/index.js | 2 - chapters/extremities/index.js | 3 -- chapters/flattening/index.js | 4 -- chapters/graduatedoffset/index.js | 4 -- chapters/inflections/index.js | 3 -- chapters/intersections/index.js | 3 -- chapters/matrix/index.js | 2 - chapters/matrixsplit/index.js | 2 - chapters/moulding/index.js | 3 -- chapters/offsetting/index.js | 4 -- chapters/pointcurves/index.js | 3 -- chapters/pointvectors/index.js | 3 -- chapters/pointvectors3d/index.js | 3 -- chapters/polybezier/index.js | 3 -- chapters/preface/index.js | 2 - chapters/projections/index.js | 3 -- chapters/reordering/index.js | 4 -- chapters/shapes/index.js | 3 -- chapters/splitting/index.js | 3 -- chapters/tightbounds/index.js | 3 -- chapters/tracing/index.js | 4 -- chapters/weightcontrol/index.js | 3 -- chapters/yforx/index.js | 3 -- .../2ed0e7bb629970f59960d07f32281374.png | Bin 0 -> 10391 bytes .../393938684e6cc709b10e8911092848ee.png | Bin 0 -> 7421 bytes .../425ee92efb13c790f63f8b3821327d3b.png | Bin 0 -> 11371 bytes .../5f3b714d4a4178ffa186ec59b059ca78.png | Bin 0 -> 7421 bytes index.html | 36 ++++++++++++------ ja-JP/index.html | 29 +++++++++----- lib/custom-element/api/types/bezier.js | 29 ++++++++++++++ zh-CN/index.html | 30 ++++++++++----- 54 files changed, 136 insertions(+), 203 deletions(-) delete mode 100644 chapters/abc/index.js delete mode 100644 chapters/aligning/index.js delete mode 100644 chapters/arcapproximation/index.js delete mode 100644 chapters/arclength/index.js delete mode 100644 chapters/arclengthapprox/index.js delete mode 100644 chapters/boundingbox/index.js delete mode 100644 chapters/bsplines/index.js delete mode 100644 chapters/canonical/index.js delete mode 100644 chapters/catmullconv/index.js delete mode 100644 chapters/catmullmoulding/index.js delete mode 100644 chapters/circles/index.js delete mode 100644 chapters/circles_cubic/index.js delete mode 100644 chapters/comments/index.js delete mode 100644 chapters/components/index.js delete mode 100644 chapters/curvature/index.js delete mode 100644 chapters/curvefitting/index.js delete mode 100644 chapters/curveintersection/index.js create mode 100644 chapters/decasteljau/decasteljau.js delete mode 100644 chapters/decasteljau/handler.js delete mode 100644 chapters/decasteljau/index.js delete mode 100644 chapters/derivatives/index.js delete mode 100644 chapters/extremities/index.js delete mode 100644 chapters/flattening/index.js delete mode 100644 chapters/graduatedoffset/index.js delete mode 100644 chapters/inflections/index.js delete mode 100644 chapters/intersections/index.js delete mode 100644 chapters/matrix/index.js delete mode 100644 chapters/matrixsplit/index.js delete mode 100644 chapters/moulding/index.js delete mode 100644 chapters/offsetting/index.js delete mode 100644 chapters/pointcurves/index.js delete mode 100644 chapters/pointvectors/index.js delete mode 100644 chapters/pointvectors3d/index.js delete mode 100644 chapters/polybezier/index.js delete mode 100644 chapters/preface/index.js delete mode 100644 chapters/projections/index.js delete mode 100644 chapters/reordering/index.js delete mode 100644 chapters/shapes/index.js delete mode 100644 chapters/splitting/index.js delete mode 100644 chapters/tightbounds/index.js delete mode 100644 chapters/tracing/index.js delete mode 100644 chapters/weightcontrol/index.js delete mode 100644 chapters/yforx/index.js create mode 100644 images/chapters/decasteljau/2ed0e7bb629970f59960d07f32281374.png create mode 100644 images/chapters/decasteljau/393938684e6cc709b10e8911092848ee.png create mode 100644 images/chapters/decasteljau/425ee92efb13c790f63f8b3821327d3b.png create mode 100644 images/chapters/decasteljau/5f3b714d4a4178ffa186ec59b059ca78.png 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 0000000000000000000000000000000000000000..07dab402fd7a827de01e8358ca6499190e95a63c GIT binary patch literal 10391 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%0DU8K}Z%D0W`|#Vv7z0|tAa+Q>0t@EcV< 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%0DU8K}Z%D0W`|#Vv7z0|tAa+Q>0t@EcV< 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. +

+ 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}/> -

Simplified drawing

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}/> -

简化绘图