From f7ec7fa90a769c204588f06da365ef1f968dedd1 Mon Sep 17 00:00:00 2001 From: Pomax Date: Thu, 13 Aug 2020 17:16:46 -0700 Subject: [PATCH] pointvectors --- chapters/pointvectors/content.en-GB.md | 4 +- chapters/pointvectors/cubic.js | 67 ++++++++++++++++++ chapters/pointvectors/quadratic.js | 63 ++++++++++++++++ .../05a1ee3b81a4838292814a7097b4cf50.png | Bin 0 -> 11696 bytes .../3158c82ea512f70ec17d4a1ce2e7c7b2.png | Bin 0 -> 10714 bytes .../140b23b10b4159b03b2a555db7ddf826.png | Bin 5360 -> 0 bytes .../4541eeb2113d81cbc0c0a56122570d48.png | Bin 10584 -> 10572 bytes index.html | 40 ++++++++--- ja-JP/index.html | 40 ++++++++--- lib/custom-element/api/base-api.js | 2 +- lib/custom-element/api/graphics-api.js | 12 ++-- .../build/markdown/generate-fallback-image.js | 9 ++- .../markdown/preprocess-graphics-element.js | 7 +- zh-CN/index.html | 40 ++++++++--- 14 files changed, 242 insertions(+), 42 deletions(-) create mode 100644 chapters/pointvectors/cubic.js create mode 100644 chapters/pointvectors/quadratic.js create mode 100644 images/chapters/pointvectors/05a1ee3b81a4838292814a7097b4cf50.png create mode 100644 images/chapters/pointvectors/3158c82ea512f70ec17d4a1ce2e7c7b2.png delete mode 100644 images/chapters/reordering/140b23b10b4159b03b2a555db7ddf826.png diff --git a/chapters/pointvectors/content.en-GB.md b/chapters/pointvectors/content.en-GB.md index 34407b12..8be2cf24 100644 --- a/chapters/pointvectors/content.en-GB.md +++ b/chapters/pointvectors/content.en-GB.md @@ -73,6 +73,6 @@ treated as a sequence of three (elementary) shear operations. When we combine th The following two graphics show the tangent and normal along a quadratic and cubic curve, with the direction vector coloured blue, and the normal vector coloured red (the markers are spaced out evenly as *t*-intervals, not spaced equidistant).
- - + +
diff --git a/chapters/pointvectors/cubic.js b/chapters/pointvectors/cubic.js new file mode 100644 index 00000000..d27e4370 --- /dev/null +++ b/chapters/pointvectors/cubic.js @@ -0,0 +1,67 @@ +setup() { + this.curve = Bezier.defaultCubic(this); + setMovable(this.curve.points); +} + +draw() { + clear(); + const curve = this.curve; + curve.drawSkeleton(); + const pts = curve.points; + const f = 15; + + for(let i=0; i<=10; i++) { + let t = i/10.0; + let p = curve.get(t); + let d = this.getDerivative(t, pts); + + let m = sqrt(d.x*d.x + d.y*d.y); + d = { x: d.x/m, y: d.y/m }; + let n = this.getNormal(t, d); + + setStroke(`blue`); + line(p.x, p.y, p.x + d.x*f, p.y + d.y*f); + + setStroke(`red`); + line(p.x, p.y, p.x + n.x*f, p.y + n.y*f); + + setStroke(`purple`); + line(p.x, p.y, p.x - n.x*f, p.y - n.y*f); + + setStroke(`black`); + circle(p.x, p.y, 3); + } + + curve.drawPoints(); +} + +getDerivative(t, points) { + let mt = (1 - t), a = mt*mt, b = mt*t, c = t*t, d = [ + { + x: 3 * (points[1].x - points[0].x), + y: 3 * (points[1].y - points[0].y) + }, + { + x: 3 * (points[2].x - points[1].x), + y: 3 * (points[2].y - points[1].y) + }, + { + x: 3 * (points[3].x - points[2].x), + y: 3 * (points[3].y - points[2].y) + } + ]; + + return { + x: a * d[0].x + b * d[1].x + c * d[2].x, + y: a * d[0].y + b * d[1].y + c * d[2].y + }; +} + +getNormal(t, d) { + const q = sqrt(d.x * d.x + d.y * d.y); + return { x: -d.y / q, y: d.x / q }; +} + +onMouseMove() { + redraw(); +} diff --git a/chapters/pointvectors/quadratic.js b/chapters/pointvectors/quadratic.js new file mode 100644 index 00000000..0e64461f --- /dev/null +++ b/chapters/pointvectors/quadratic.js @@ -0,0 +1,63 @@ +setup() { + this.curve = Bezier.defaultQuadratic(this); + setMovable(this.curve.points); +} + +draw() { + clear(); + const curve = this.curve; + curve.drawSkeleton(); + const pts = curve.points; + const f = 15; + + for(let i=0; i<=10; i++) { + let t = i/10.0; + let p = curve.get(t); + let d = this.getDerivative(t, pts); + + let m = sqrt(d.x*d.x + d.y*d.y); + d = { x: d.x/m, y: d.y/m }; + let n = this.getNormal(t, d); + + setStroke(`blue`); + line(p.x, p.y, p.x + d.x*f, p.y + d.y*f); + + setStroke(`red`); + line(p.x, p.y, p.x + n.x*f, p.y + n.y*f); + + setStroke(`purple`); + line(p.x, p.y, p.x - n.x*f, p.y - n.y*f); + + setStroke(`black`); + circle(p.x, p.y, 3); + } + + curve.drawPoints(); +} + +getDerivative(t, points) { + let mt = (1 - t), d = [ + { + x: 2 * (points[1].x - points[0].x), + y: 2 * (points[1].y - points[0].y) + }, + { + x: 2 * (points[2].x - points[1].x), + y: 2 * (points[2].y - points[1].y) + } + ]; + + return { + x: mt * d[0].x + t * d[1].x, + y: mt * d[0].y + t * d[1].y + }; +} + +getNormal(t, d) { + const q = sqrt(d.x * d.x + d.y * d.y); + return { x: -d.y / q, y: d.x / q }; +} + +onMouseMove() { + redraw(); +} diff --git a/images/chapters/pointvectors/05a1ee3b81a4838292814a7097b4cf50.png b/images/chapters/pointvectors/05a1ee3b81a4838292814a7097b4cf50.png new file mode 100644 index 0000000000000000000000000000000000000000..5da6914284ef911b4fc20760bb548120b15049a3 GIT binary patch literal 11696 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

-_=-K>vsh5Y)$j|VN!Un zruYmFCL*YSAlB-GiNJDmc6Ofmw1}7DdA|Okz7yj;PJe0uF}IQ`=-noF6wvj0dU}49 z8?x1Wdbxc0YG*ER8Eclvt1BdoV@*oo`ue1WkeGO-mW>*JZfQyM-JoG-cxoT&dKcbH zdKcsJ{4}zXBOe+8(X3bQ=})%*)tB@|V3$V7X-mD>-~&vvu8nKf{XGhO9jIET%_=$AZP2r4$Dj*J6*Cnpwk@_wEzJS;0GZ?o@exEOWP3i-1fy z{jsWo#V_ovbdozy2>p-?l&<%eGBUBKrfukF|E+5ELCb@ocp9dqyBmB7*aq{fMnvfM zmXf#X>W@G`e-5CzN-7Tz&%9pM0i(vc#uS=X`;z#kqjF68_DeLVD#om5A(CTqal2*~ zHdL}O)GT1X+F#XxkKyy#adUkC7ftxw_O@Ju)Al1a{o4)WMXkGVt}2SDuQ(0ijJ_~E zrL$k<0W#sdy+<}<)iE(KWqR!x{mFc}CPWEUO>Xo3eDew7!cF|Ab3X3JzfJBwc@+pg z<;Z&fd|V-+BTupJ$AB7e4QSkW0WzN`6R@zbd}q=Sk&?m&1++du$Wz4R#R3J>O{AV@ zGN6(c?jp8|h3O4v1`t0aX&jNGT&#&e>gqDm66`IP2 zHFuE|C&2U`{FRj3w#!km z^8g%!w)Xb!U%&GH3t71()!(6cyg-3+TYEhfH9D`0u(cn-fbn0~a_SoGYF`adL20Kk zi({grOU*{;UTQb0Z#n^f3y>>&$H%ZTIr^V~Dt*lViS_5tpGiVqDZwNx2RbOEj;Ode zyZy?|IZ&^&qs8!Pg~d#jum}OZs@{3GAD5-^2dEF@*o|=h)L1{~<4dG^>mQMj098o^ zl8NilS}S8o5MmZ*lj-9-=}){G7Jy`_6r@@{i#9(-ZeGOV>YfNB(czw*N^U!@j3*0 zfd#vbf$=Rl8Ge0rp#fAe3$PQ-t3Za+Cc**#+-Tk)j5O>v%S4b5NHM}T4KI)XSaVRblciX#>R#fY%hynh_;&9FS)t$!e}%M{Nez?Ke8W18O zaN|P6#%@~Z5Kyx*(;Q(=o8zGo5%+-3-Q9m}mLz-Q2k5fX)1xBibFv(C^f=L?Y2-6* zyM20?O2v%lPk=a^L#&NTB?=uP5uwibLkB#%IR|)R5)y^L&%lr!UGIu4NMJYmTE7^^ zrwk%c@p21bJ&7nOOMs;}GGo*k-)i~E;ra}_tiWCR>HqQ8cPse;Lrrq2$e6oR3l zp^eVB2aKh^4N!jb#+%o6!57d#u{xd_@OTc15}C2C;cRI!F(8InB`^u6nK|i|>;J?7 z#*n;dC5G3pt2!qsuP#p1r1J|<$H&L223=t)8X6h}rKRtXn+OGg>(fQ^gQafsovFGi z7-dGZ64-xg-W!uug#ht+=Juze%;wYnR|+|yCn-|5%#=}xl6!6~p;80X0>&o=xc{z` z<4t;jx*xDU_wL_s{fv$|(d5PzKtP#eJ=;8GKOg{(8|PX~nv07|Uy49twoEK%o_6R) zDA!Yt3R?=I;KXmaJPF1mbfM{$mC-k2!2KQ=hy{!p7FwoxKkIC6c^-3cJ7AHOQAm+K z2RM&V&#o9K9nEJeq{q9n3gY4z)Af!9gK5IRUQ#<=#=_irb~yP}E~8s2&NN|qB&l-+ zP&sMBK963R-Xjk70|{_=WJF3{p6uhymmy<8ulD(EzjrLZV8I2;9R1I&=ik-UB+W z^ymdZJ-K4pBqV7&zUES79Q=(RblPz*X1>^3cr>(;nU{ud!9h7)oBn3`S?Zr;RV{V(LJ3BjJu#~~izBl8=)@uBuh&U6;aEV|Yl8ob)EKFq? z^_RTqN5W@SKApVKoBP(f9E0YoxIvs^P&#;AABp+nEF&-qGb+R8cZak$12X%3b9uw_ zv6|gs2tf9_Q+54qv67u#CvW|4$DwTTETgaf&ZCttXoUX(-4pC6PRSMAb>Kmv(HrjU zc2EBRwgC_(RX}s?f4d=C3@)!g16iwbqtYw5*lxi8G9k8tJNAs3FcfIVtnn;akvE;k z(yClO6S--WaOlP4usap@-_IS2J(?qK1}pk1f1FzfAUPU6YOIkW=$xFQFo%lK)3%y~aC652_fB~^S{xr&!ok4?Gf8IIm&Y7RYri>K3My)f zfkiNbf?*YxT+say;9F-r`4TcE8pff=$A1R)wkkIF!C`s%5*B2!!Tr~1$b935x?%d^ za6Ip=EqTZ9@P2&A9N;wMlxkLP42XP}M_IW$7)`B%oTL{w_Pcbu9J_FeJC5J;r^Ypn zUvu3IX6r`(hS14Q1PqxLmQ9;hvUy%Mn;VswR6&D+g3KDFIllly7QoLR)&IIueEt0N z*yC9fapQP6{00X#r>2W*8$Mv;!Hrh>9`>!E{kKeUK9~gT0O^7@np~0k^KE{RXLNL` zd`^J-853MzU%%0B7Z=-s`Kt_C47p*5@klwR_8P!uZNmqd^hUN_Uzd`UyfwgI5$SUH zox^&@F2%)|hKlOWCs)^-wly_1%>_EUD82fCR0f%7aApBG4tT+mlak2lowj>GJjFD% z4>ot3sJB~|2G!iJ{lzYq{huUfaBI)^7KM648DjirOHoV9%VppJV|c<(KFrDh3ob z@yz@G?v-1>Be9sQFd+bSJ>>3Vc3&R*6_Ee;0n`JJM|C^2A6ow|_X7Y*)$Pa~uz^pO ziJ8=Y_z(yNb{m2~h^C`6TVTWj1gv0Cc{RD67z2A6#L&oSerrn>c>6#mmW^lkWByPL zxkpCUH`C;1tn$cWwZZdRRiiorR`c^*vKd?y$A8~LKW~xI!1mEx+mAy)s?#uTR9A*LYJjTiBsUc z1n$TB`D@V2hYv50UeW){LHDb-*I?;aSOy5shR#sV>J|-cdU{L&r$`#PUbm+6q-L=m)&CAqB0XC1Rsj0!i z!&3qEj}mw=A|ma+Ktvx1q^CYObRe*`e z{QPLWN5AYvcJ$4AC_Rpb@JeJ>Ru4j`}BT&H?+*%5*pV=}U`ce}g09R<_T l;@6)04hH?d@Y3z0rliOB_=Nl6Vd(hKLB29DY5_n literal 0 HcmV?d00001 diff --git a/images/chapters/pointvectors/3158c82ea512f70ec17d4a1ce2e7c7b2.png b/images/chapters/pointvectors/3158c82ea512f70ec17d4a1ce2e7c7b2.png new file mode 100644 index 0000000000000000000000000000000000000000..d4d2f0dfb65541a61887aae324ddec726100e768 GIT binary patch literal 10714 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 XZxCGgdUp=I!i4B(7@(@uZJ+!PE{^WU diff --git a/images/chapters/reordering/4541eeb2113d81cbc0c0a56122570d48.png b/images/chapters/reordering/4541eeb2113d81cbc0c0a56122570d48.png index 9b71de14112b56531e38b27d74a5faa3f2261e9d..7afa0c925774088ef7026b1c49ca94937c3e4712 100644 GIT binary patch literal 10572 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 J%TP99{|AwBD9Hc- literal 10584 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 GhyEXs(*hm< diff --git a/index.html b/index.html index 8107e51a..e186d5fd 100644 --- a/index.html +++ b/index.html @@ -2586,18 +2586,38 @@ function drawCurve(points[], t): evenly as t-intervals, not spaced equidistant).

- - + + + Scripts are disabled. Showing fallback image. + + + width="275" + height="275" + src="./chapters/pointvectors/cubic.js" + > + + + Scripts are disabled. Showing fallback image. +
diff --git a/ja-JP/index.html b/ja-JP/index.html index 3ea0641c..450aea6a 100644 --- a/ja-JP/index.html +++ b/ja-JP/index.html @@ -2180,18 +2180,38 @@ function drawCurve(points[], t): evenly as t-intervals, not spaced equidistant).

- - + + + Scripts are disabled. Showing fallback image. + + + width="275" + height="275" + src="./chapters/pointvectors/cubic.js" + > + + + Scripts are disabled. Showing fallback image. +
diff --git a/lib/custom-element/api/base-api.js b/lib/custom-element/api/base-api.js index e080a396..db0185b9 100644 --- a/lib/custom-element/api/base-api.js +++ b/lib/custom-element/api/base-api.js @@ -200,7 +200,7 @@ class BaseAPI { */ setup() { // console.log(`setup`); - this.moveable = []; + this.movable = []; } /** diff --git a/lib/custom-element/api/graphics-api.js b/lib/custom-element/api/graphics-api.js index 49caf566..83ae78c8 100644 --- a/lib/custom-element/api/graphics-api.js +++ b/lib/custom-element/api/graphics-api.js @@ -72,8 +72,8 @@ class GraphicsAPI extends BaseAPI { ? TOUCH_PRECISION_ZONE : MOUSE_PRECISION_ZONE; - for (let i = 0, e = this.moveable.length, p, d; i < e; i++) { - p = this.moveable[i]; + for (let i = 0, e = this.movable.length, p, d; i < e; i++) { + p = this.movable[i]; d = new Vector(p).dist(this.cursor); if (d <= cdist) { this.currentPoint = p; @@ -88,8 +88,8 @@ class GraphicsAPI extends BaseAPI { this.currentPoint.x = this.cursor.x; this.currentPoint.y = this.cursor.y; } else { - for (let i = 0, e = this.moveable.length, p; i < e; i++) { - p = this.moveable[i]; + for (let i = 0, e = this.movable.length, p; i < e; i++) { + p = this.movable[i]; if (new Vector(p).dist(this.cursor) <= 5) { this.setCursor(this.HAND); return; // NOTE: this is a return, not a break. @@ -105,12 +105,12 @@ class GraphicsAPI extends BaseAPI { } resetMovable(points) { - this.moveable.splice(0, this.moveable.length); + this.movable.splice(0, this.movable.length); if (points) this.setMovable(points); } setMovable(points) { - points.forEach((p) => this.moveable.push(p)); + points.forEach((p) => this.movable.push(p)); } /** diff --git a/tools/build/markdown/generate-fallback-image.js b/tools/build/markdown/generate-fallback-image.js index 23c0c25d..d1714e84 100644 --- a/tools/build/markdown/generate-fallback-image.js +++ b/tools/build/markdown/generate-fallback-image.js @@ -10,7 +10,9 @@ const __root = path.join(__dirname, `..`, `..`, `..`); /** * ...docs go here... */ -async function generateFallbackImage(src, width, height) { +async function generateFallbackImage(localeStrings, src, width, height) { + const locale = localeStrings.getCurrentLocale(); + // Get the sketch code const sourcePath = path.join(__root, src); let code; @@ -23,6 +25,9 @@ async function generateFallbackImage(src, width, height) { // Do we need to even generate a file here? const hash = createHash(`md5`).update(code).digest(`hex`); + + if (locale !== localeStrings.getDefaultLocale()) return hash; + const destPath = path.dirname(path.join(__root, `images`, src)); const filename = path.join(destPath, `${hash}.png`); if (fs.existsSync(filename)) return hash; @@ -50,7 +55,7 @@ async function generateFallbackImage(src, width, height) { fs.ensureDirSync(path.dirname(filename)); fs.writeFileSync(filename, imageData); - console.log(`Generated fallback image for ${src}`); + console.log(`Generated fallback image for ${src} (${locale})`); return hash; } diff --git a/tools/build/markdown/preprocess-graphics-element.js b/tools/build/markdown/preprocess-graphics-element.js index c560bd03..42c09faa 100644 --- a/tools/build/markdown/preprocess-graphics-element.js +++ b/tools/build/markdown/preprocess-graphics-element.js @@ -51,7 +51,12 @@ async function preprocessGraphicsElement(chapter, localeStrings, markdown) { src = src.replace(`./`, `./chapters/${chapter}/`); } - let imageHash = await generateFallbackImage(src, width, height); // ← this is super fancy functionality. + let imageHash = await generateFallbackImage( + localeStrings, + src, + width, + height + ); // ← this is super fancy functionality. let imgUrl = path.join( path.dirname(src.replace(`./`, `./images/`)), `${imageHash}.png` diff --git a/zh-CN/index.html b/zh-CN/index.html index 3c970dd6..8029c917 100644 --- a/zh-CN/index.html +++ b/zh-CN/index.html @@ -2190,18 +2190,38 @@ function drawCurve(points[], t): evenly as t-intervals, not spaced equidistant).

- - + + + Scripts are disabled. Showing fallback image. + + + width="275" + height="275" + src="./chapters/pointvectors/cubic.js" + > + + + Scripts are disabled. Showing fallback image. +