diff --git a/docs/chapters/abc/content.en-GB.md b/docs/chapters/abc/content.en-GB.md index 3a7e7912..5dcb5397 100644 --- a/docs/chapters/abc/content.en-GB.md +++ b/docs/chapters/abc/content.en-GB.md @@ -32,19 +32,19 @@ These three values A, B, and C allow us to derive an important identity formula So, how can we compute `C`? We start with our observation that `C` always lies somewhere between the start and end points, so logically `C` will have a function that interpolates between those two coordinates: \[ - C = u(t) \cdot P_{start} + (1-u(t)) \cdot P_{end} + C = u(t) \cdot P_{\textit{start}} + (1-u(t)) \cdot P_{\textit{end}} \] If we can figure out what the function `u(t)` looks like, we'll be done. Although we do need to remember that this `u(t)` will have a different form depending on whether we're working with quadratic or cubic curves. [Running through the maths](https://mathoverflow.net/questions/122257/finding-the-formula-for-bezier-curve-ratios-hull-point-point-baseline) (with thanks to Boris Zbarsky) shows us the following two formulae: \[ - u(t)_{quadratic} = \frac{(1-t)^2}{t^2 + (1-t)^2} + u(t)_{\textit{quadratic}} = \frac{(1-t)^2}{t^2 + (1-t)^2} \] And \[ - u(t)_{cubic} = \frac{(1-t)^3}{t^3 + (1-t)^3} + u(t)_{\textit{cubic}} = \frac{(1-t)^3}{t^3 + (1-t)^3} \] So, if we know the start and end coordinates and the *t* value, we know C without having to calculate the `A` or even `B` coordinates. In fact, we can do the same for the ratio function. As another function of `t`, we technically don't need to know what `A` or `B` or `C` are. It, too, can be expressed as a pure function of `t`. @@ -52,25 +52,25 @@ So, if we know the start and end coordinates and the *t* value, we know C withou We start by observing that, given `A`, `B`, and `C`, the following always holds: \[ - ratio(t) = \frac{distance(B,C)}{distance(A,B)} = Constant + \textit{ratio}(t) = \frac{\textit{distance}(B,C)}{\textit{distance}(A,B)} = \textit{Constant} \] Working out the maths for this, we see the following two formulae for quadratic and cubic curves: \[ - ratio(t)_{quadratic} = \left | \frac{t^2 + (1-t)^2 - 1}{t^2 + (1-t)^2} \right | + ratio(t)_{\textit{quadratic}} = \left | \frac{t^2 + (1-t)^2 - 1}{t^2 + (1-t)^2} \right | \] And \[ - ratio(t)_{cubic} = \left | \frac{t^3 + (1-t)^3 - 1}{t^3 + (1-t)^3} \right | + ratio(t)_{\textit{cubic}} = \left | \frac{t^3 + (1-t)^3 - 1}{t^3 + (1-t)^3} \right | \] Which now leaves us with some powerful tools: given three points (start, end, and "some point on the curve"), as well as a `t` value, we can _construct_ curves. We can compute `C` using the start and end points and our `u(t)` function, and once we have `C`, we can use our on-curve point (`B`) and the `ratio(t)` function to find `A`: \[ - A = B - \frac{C - B}{ratio(t)} = B + \frac{B - C}{ratio(t)} + A = B - \frac{C - B}{\textit{ratio}(t)} = B + \frac{B - C}{\textit{ratio}(t)} \] With `A` found, finding `e1` and `e2` for quadratic curves is a matter of running the linear interpolation with `t` between start and `A` to yield `e1`, and between `A` and end to yield `e2`. For cubic curves, there is no single pair of points that can act as `e1` and `e2`: as long as the distance ratio between `e1` to `B` and `B` to `e2` is the Bézier ratio `(1-t):t`, we can reverse engineer `v1` and `v2`: @@ -86,8 +86,8 @@ And then reverse engineer the curve's control points: \[ \left \{ \begin{aligned} - C_1' &= start + \frac{v_1 - start}{t} \\ - C_2' &= end + \frac{v_2 - end}{1 - t} + C_1' &= \textit{start} + \frac{v_1 - \textit{start}}{t} \\ + C_2' &= \textit{end} + \frac{v_2 - \textit{end}}{1 - t} \end{aligned} \right . \] diff --git a/docs/chapters/arclength/content.en-GB.md b/docs/chapters/arclength/content.en-GB.md index 37a67ee9..7578abff 100644 --- a/docs/chapters/arclength/content.en-GB.md +++ b/docs/chapters/arclength/content.en-GB.md @@ -9,7 +9,7 @@ How long is a Bézier curve? As it turns out, that's not actually an easy questi or, more commonly written using Leibnitz notation as: \[ - length = \int_{0}^{z}\sqrt{ \left (dx/dt \right )^2+\left (dy/dt \right )^2} dt + \textit{length} = \int_{0}^{z}\sqrt{ \left (dx/dt \right )^2+\left (dy/dt \right )^2} dt \] This formula says that the length of a parametric curve is in fact equal to the **area** underneath a function that looks a remarkable amount like Pythagoras' rule for computing the diagonal of a straight angled triangle. This sounds pretty simple, right? Sadly, it's far from simple... cutting straight to after the chase is over: for quadratic curves, this formula generates an [unwieldy computation](https://www.wolframalpha.com/input/?i=antiderivative+for+sqrt((2*(1-t)*t*B+%2B+t%5E2*C)%27%5E2+%2B+(2*(1-t)*t*E)%27%5E2)&incParTime=true), and we're simply not going to implement things that way. For cubic Bézier curves, things get even more fun, because there is no "closed form" solution, meaning that due to the way calculus works, there is no generic formula that allows you to calculate the arc length. Let me just repeat this, because it's fairly crucial: ***for cubic and higher Bézier curves, there is no way to solve this function if you want to use it "for all possible coordinates"***. @@ -24,12 +24,12 @@ So we turn to numerical approaches again. The method we'll look at here is the [ \int_{-1}^{1}f(t) dt \simeq \left [ - \underset{strip~1}{ \underbrace{ C_1 \cdot f\left(t_1\right) }} + \underset{\textit{strip 1}}{ \underbrace{ C_1 \cdot f\left(t_1\right) }} ~+~... - ~+~\underset{strip~n}{ \underbrace{ C_n \cdot f\left(t_n\right) }} + ~+~\underset{\textit{strip n}}{ \underbrace{ C_n \cdot f\left(t_n\right) }} \right ] = - \underset{strips~1~through~n}{ + \underset{\textit{strips 1 through n}}{ \underbrace{ \sum_{i=1}^{n}{ C_i \cdot f\left(t_i\right) diff --git a/docs/chapters/bsplined/content.en-GB.md b/docs/chapters/bsplined/content.en-GB.md index db104be2..a06bba67 100644 --- a/docs/chapters/bsplined/content.en-GB.md +++ b/docs/chapters/bsplined/content.en-GB.md @@ -16,7 +16,7 @@ Thankfully, much like as was the case for Bézier curves, the derivative of a B- where \[ - P_i \prime = \frac{d}{knot_{i+d+1} - knot_{i+1}} (P_{i+1} - P_i) + P_i \prime = \frac{d}{\textit{knot}_{i+d+1} - \textit{knot}_{i+1}} (P_{i+1} - P_i) \] @@ -28,7 +28,7 @@ As a concrete example, let's look at cubic (=degree 3) B-Spline with five coordi \begin{array}{l} d = 3, \\ P = {(50,240), (185,30), (320,135), (455,25), (560,255)}, \\ - knots = {0,1,2,3,4,5,6,7,8} + \textit{knots} = {0,1,2,3,4,5,6,7,8} \end{array} \] @@ -38,20 +38,20 @@ Applying the above knowledge, we end up with a new B-Spline of degree d-1quite done, because Catmull-Rom curves have that "te With the mapping matrix properly done, let's rewrite the "point + tangent" Catmull-Rom matrix form to a matrix form in terms of four coordinates, and see what we end up with: \[ - CatmullRom(t) + \textit{CatmullRom}(t) = \begin{bmatrix} 1 & t & t^2 & t^3 @@ -199,7 +199,7 @@ With the mapping matrix properly done, let's rewrite the "point + tangent" Catmu Replace point/tangent vector with the expression for all-coordinates: \[ - CatmullRom(t) + \textit{CatmullRom}(t) = \begin{bmatrix} 1 & t & t^2 & t^3 @@ -227,7 +227,7 @@ Replace point/tangent vector with the expression for all-coordinates: and merge the matrices: \[ - CatmullRom(t) + \textit{CatmullRom}(t) = \begin{bmatrix} 1 & t & t^2 & t^3 @@ -248,7 +248,7 @@ and merge the matrices: This looks a lot like the Bézier matrix form, which as we saw in the chapter on Bézier curves, should look like this: \[ - Bézier(t) + \textit{Bézier}(t) = \begin{bmatrix} 1 & t & t^2 & t^3 @@ -422,7 +422,7 @@ We now have the final piece of our function puzzle. Let's run through each step. 1. Start with the Catmull-Rom function: \[ - CatmullRom(t) + \textit{CatmullRom}(t) = \begin{bmatrix} 1 & t & t^2 & t^3 @@ -569,14 +569,14 @@ If we have a Catmull-Rom curve defined by four coordinates P1 through P_2 \\ P_3 \\ P_4 - \end{bmatrix}_{CatmullRom} + \end{bmatrix}_{\textit{CatmullRom}} \Rightarrow \begin{bmatrix} P_2 \\ P_2 + \frac{P_3-P_1}{6 \cdot τ} \\ P_3 - \frac{P_4-P_2}{6 \cdot τ} \\ P_3 - \end{bmatrix}_{Bézier} + \end{bmatrix}_{\textit{Bézier}} \] Similarly, if we have a Bézier curve defined by four coordinates P1 through P4, we can draw that using a standard tension Catmull-Rom curve with the following coordinate values: @@ -587,14 +587,14 @@ Similarly, if we have a Bézier curve defined by four coordinates P1 P_2 \\ P_3 \\ P_4 - \end{bmatrix}_{Bézier} + \end{bmatrix}_{\textit{Bézier}} \Rightarrow \begin{bmatrix} P_1 \\ P_4 \\ P_4 + 3(P_1 - P_2) \\ P_1 + 3(P_4 - P_3) - \end{bmatrix}_{CatmullRom} + \end{bmatrix}_{\textit{CatmullRom}} \] Or, if your API allows you to specify Catmull-Rom curves using plain coordinates: @@ -605,12 +605,12 @@ Or, if your API allows you to specify Catmull-Rom curves using plain coordinates P_2 \\ P_3 \\ P_4 - \end{bmatrix}_{Bézier} + \end{bmatrix}_{\textit{Bézier}} \Rightarrow \begin{bmatrix} P_4 + 6(P_1 - P_2) \\ P_1 \\ P_4 \\ P_1 + 6(P_4 - P_3) - \end{bmatrix}_{CatmullRom} + \end{bmatrix}_{\textit{CatmullRom}} \] diff --git a/docs/chapters/circleintersection/content.en-GB.md b/docs/chapters/circleintersection/content.en-GB.md index e3ac3efc..fbf39d56 100644 --- a/docs/chapters/circleintersection/content.en-GB.md +++ b/docs/chapters/circleintersection/content.en-GB.md @@ -5,14 +5,14 @@ It might seem odd to cover this subject so much later than the line/line, line/c First, we observe that "finding intersections" in this case means that, given a circle defined by a center point `c = (x,y)` and a radius `r`, we want to find all points on the Bezier curve for which the distance to the circle's center point is equal to the circle radius, which by definition means those points lie on the circle, and so count as intersections. In maths, that means we're trying to solve: \[ - dist(B(t), c) = r + \textit{dist}(B(t), c) = r \] Which seems simple enough. Unfortunately, when we expand that `dist` function, things get a lot more problematic: \[ \begin{aligned} - r &= dist(B(t), c) \\ + r &= \textit{dist}(B(t), c) \\ &= \sqrt{ \left ( B_x{t} - c_x \right )^2 + \left ( B_y{t} - c_y \right )^2} \\ &= \sqrt{ \left ( x_1 (1-t)^3 + 3 x_2 (1-t)^2 t + 2 x_3 (1-t) t^2 + x_4 t^3 - c_x diff --git a/docs/chapters/circles_cubic/content.en-GB.md b/docs/chapters/circles_cubic/content.en-GB.md index e3f18b0f..1ad02e4f 100644 --- a/docs/chapters/circles_cubic/content.en-GB.md +++ b/docs/chapters/circles_cubic/content.en-GB.md @@ -68,7 +68,7 @@ If we look at the triangle that is formed between our starting point, or initial The distance from our guessed point to the start point is exactly the same as the projection distance we looked at earlier. Using t=0.5 as our point "B" in the "A,B,C" projection, then we know the length of the line segment {C,A}, since it's d1 = {A,B} + d2 = {B,C}: \[ - ||{A,C}|| = d_2 + d_1 = d_2 + d_2 \cdot ratio_3 \left(\frac{1}{2}\right) = d_2 + \frac{1}{3}d_2 = \frac{4}{3}d_2 + ||{A,C}|| = d_2 + d_1 = d_2 + d_2 \cdot \textit{ratio}_3 \left(\frac{1}{2}\right) = d_2 + \frac{1}{3}d_2 = \frac{4}{3}d_2 \] So that just leaves us to find the distance from t=0.5 to the baseline for an arbitrary angle φ, which is the distance from the centre of the circle to our t=0.5 point, minus the distance from the centre to the line that runs from start point to end point. The first is the same as the point P we found for the quadratic curve: @@ -146,7 +146,7 @@ So, to recap, given an angle φ, the new control coordinates are: C_1 = \left [ \begin{matrix} 1 \\ f - \end{matrix} \right ],~with~f = \frac{4}{3} tan \left( \frac{φ}{4} \right) + \end{matrix} \right ]~,~\textit{with}~f = \frac{4}{3} tan \left( \frac{φ}{4} \right) \] and @@ -155,7 +155,7 @@ and C_2 = \left [ \begin{matrix} cos(φ) + f \cdot sin(φ) \\ sin(φ) - f \cdot cos(φ) - \end{matrix} \right ],~with~f = \frac{4}{3} tan \left( \frac{φ}{4} \right) + \end{matrix} \right ]~,~\textit{with}~f = \frac{4}{3} tan \left( \frac{φ}{4} \right) \] And, because the "quarter curve" special case comes up so incredibly often, let's look at what these new control points mean for the curve coordinates of a quarter curve, by simply filling in φ = π/2: diff --git a/docs/chapters/control/content.en-GB.md b/docs/chapters/control/content.en-GB.md index 88f23919..606940f6 100644 --- a/docs/chapters/control/content.en-GB.md +++ b/docs/chapters/control/content.en-GB.md @@ -22,11 +22,11 @@ If we want to change the curve, we need to change the weights of each point, eff \[ Bézier(n,t) = \sum_{i=0}^{n} - \underset{binomial~term}{\underbrace{\binom{n}{i}}} + \underset{\textit{binomial term}}{\underbrace{\binom{n}{i}}} \cdot\ - \underset{polynomial~term}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} + \underset{\textit{polynomial term}}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} \cdot\ - \underset{weight}{\underbrace{w_i}} + \underset{\textit{weight}}{\underbrace{w_i}} \] That looks complicated, but as it so happens, the "weights" are actually just the coordinate values we want our curve to have: for an nth order curve, w0 is our start coordinate, wn is our last coordinate, and everything in between is a controlling coordinate. Say we want a cubic curve that starts at (110,150), is controlled by (25,190) and (210,250) and ends at (210,30), we use this Bézier curve: diff --git a/docs/chapters/control/content.ja-JP.md b/docs/chapters/control/content.ja-JP.md index 232059f7..d5ca0988 100644 --- a/docs/chapters/control/content.ja-JP.md +++ b/docs/chapters/control/content.ja-JP.md @@ -22,11 +22,11 @@ \[ Bézier(n,t) = \sum_{i=0}^{n} - \underset{二項係数部分の項}{\underbrace{\binom{n}{i}}} + \underset{\textit{二項係数部分の項}}{\underbrace{\binom{n}{i}}} \cdot\ - \underset{多項式部分の項}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} + \underset{\textit{多項式部分の項}}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} \cdot\ - \underset{重み}{\underbrace{w_i}} + \underset{\textit{重み}}{\underbrace{w_i}} \] 複雑そうに見えますが、運がいいことに「重み」というのは実はただの座標値です。というのはn次の曲線の場合、w0が始点の座標、wnが終点の座標となり、その間はどれも制御点の座標になります。例えば、始点が(120,160)、制御点が(35,200)と(220,260)、終点が(220,40)となる3次ベジエ曲線は、次のようになります。 diff --git a/docs/chapters/control/content.ru-RU.md b/docs/chapters/control/content.ru-RU.md index 7f7bbd81..0f8b1722 100644 --- a/docs/chapters/control/content.ru-RU.md +++ b/docs/chapters/control/content.ru-RU.md @@ -22,11 +22,11 @@ \[ Bézier(n,t) = \sum_{i=0}^{n} - \underset{биноминальный~термин}{\underbrace{\binom{n}{i}}} + \underset{\textit{биноминальный термин}}{\underbrace{\binom{n}{i}}} \cdot\ - \underset{полиноминальный~термин}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} + \underset{\textit{полиноминальный термин}}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} \cdot\ - \underset{вес}{\underbrace{w_i}} + \underset{\textit{вес}}{\underbrace{w_i}} \] Хоть и выглядит заморочено, но, так уж получается, в реальности "веса" просто значения координат на графике, к которым мы бы хотели, чтобы наша функция стремилась. Так, для кривой n-го порядка, w0 есть начальной координатой, wn конечной координатой, а все между ними — контрольными координатами. Например, чтобы кубическая кривая начиналась в (110,150), стремилась к точкам (25,190) и (210,250) заканчиваясь на (210,30), мы запишем это следующим образом: diff --git a/docs/chapters/control/content.zh-CN.md b/docs/chapters/control/content.zh-CN.md index 3702d357..2df39425 100644 --- a/docs/chapters/control/content.zh-CN.md +++ b/docs/chapters/control/content.zh-CN.md @@ -22,11 +22,11 @@ \[ Bézier(n,t) = \sum_{i=0}^{n} - \underset{binomial~term}{\underbrace{\binom{n}{i}}} + \underset{\textit{binomial term}}{\underbrace{\binom{n}{i}}} \cdot\ - \underset{polynomial~term}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} + \underset{\textit{polynomial term}}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} \cdot\ - \underset{weight}{\underbrace{w_i}} + \underset{\textit{weight}}{\underbrace{w_i}} \] 看起来很复杂,但实际上“权重”只是我们想让曲线所拥有的坐标值:对于一条nth阶曲线,w0是起始坐标,wn是终点坐标,中间的所有点都是控制点坐标。假设说一条曲线的起点为(110,150),终点为(210,30),并受点(25,190)和点(210,250)的控制,贝塞尔曲线方程就为: diff --git a/docs/chapters/curvefitting/content.en-GB.md b/docs/chapters/curvefitting/content.en-GB.md index b7178380..1c947d1d 100644 --- a/docs/chapters/curvefitting/content.en-GB.md +++ b/docs/chapters/curvefitting/content.en-GB.md @@ -20,7 +20,7 @@ Rewriting Bézier functions to matrix form is fairly easy, if you first expand t \[ \begin{aligned} - B_{quadratic} & = a (1-t)^2 + 2 b (1-t) t + c t^2 \\ + B_{\textit{quadratic}} & = a (1-t)^2 + 2 b (1-t) t + c t^2 \\ & = a - 2at + at^2 + 2bt - 2bt^2 + ct^2 \end{aligned} \] @@ -29,7 +29,7 @@ And then we (trivially) rearrange the terms across multiple lines: \[ \begin{aligned} - B_{quadratic} &=& a & & \\ + B_{\textit{quadratic}} &=& a & & \\ & & - 2at & + 2bt & \\ & & + at^2 & - 2bt^2 & + ct^2 \end{aligned} @@ -41,7 +41,7 @@ With that arrangement, we can easily decompose this as a matrix multiplication: \[ \begin{aligned} - B_{quadratic} &= T \cdot M \cdot C + B_{\textit{quadratic}} &= T \cdot M \cdot C = \begin{bmatrix}1 & t & t^2 \end{bmatrix} \cdot @@ -67,7 +67,7 @@ We can do the same for the cubic curve, of course. We know the base function for \[ \begin{aligned} - B_{cubic} & = & a(1-t)^3 + 3b(1-t)^2 t + 3c(1-t)t^2 + dt^3 + B_{\textit{cubic}} & = & a(1-t)^3 + 3b(1-t)^2 t + 3c(1-t)t^2 + dt^3 \end{aligned} \] @@ -75,7 +75,7 @@ So we write out the expansion and rearrange: \[ \begin{aligned} - B_{cubic} & = & a & & & \\ + B_{\textit{cubic}} & = & a & & & \\ & & - 3at & + 3bt & & \\ & & + 3at^2 & - 6bt^2 & +3ct^2 & \\ & & - at^3 & + 3bt^3 & -3ct^3 & + dt^3 @@ -86,7 +86,7 @@ Which we can then decompose: \[ \begin{aligned} - B_{cubic} &= T \cdot M \cdot C = + B_{\textit{cubic}} &= T \cdot M \cdot C = \begin{bmatrix}1 & t & t^2 & t^3 \end{bmatrix} \cdot \begin{bmatrix} @@ -104,7 +104,7 @@ And, of course, we can do this for quartic curves too (skipping the expansion st \[ \begin{aligned} - B_{quartic} &= T \cdot M \cdot C = + B_{\textit{quartic}} &= T \cdot M \cdot C = \begin{bmatrix}1 & t & t^2 & t^3 & t^4 \end{bmatrix} \cdot \begin{bmatrix} @@ -170,13 +170,13 @@ And now we can move on to the actual "curve fitting" part: what we want is a fun As mentioned before, this function is really just "the distance between the actual coordinate, and the coordinate that the curve evaluates to for the associated `t` value", which we'll square to get rid of any pesky negative signs: \[ - E(C)_i = \left ( p_i - Bézier(s_i) \right )^2 + E(C)_i = \left ( p_i - \textit{Bézier}(s_i) \right )^2 \] Since this function only deals with individual coordinates, we'll need to sum over all coordinates in order to get the full error function. So, we literally just do that; the total error function is simply the sum of all these individual errors: \[ - E(C) = \sum^n_{i=1} \left ( p_i - Bézier(s_i) \right )^2 + E(C) = \sum^n_{i=1} \left ( p_i - \textit{Bézier}(s_i) \right )^2 \] And here's the trick that justifies using matrices: while we can work with individual values using calculus, with matrices we can compute as many values as we make our matrices big, all at the "same time", We can replace the individual terms pi with the full **P** coordinate matrix, and we can replace Bézier(si) with the matrix representation **T x M x C** we talked about before, which gives us: diff --git a/docs/chapters/derivatives/content.en-GB.md b/docs/chapters/derivatives/content.en-GB.md index d51bb3ef..98416f07 100644 --- a/docs/chapters/derivatives/content.en-GB.md +++ b/docs/chapters/derivatives/content.en-GB.md @@ -5,13 +5,13 @@ There's a number of useful things that you can do with Bézier curves based on t First, let's look at the derivative rule for Bézier curves, which is: \[ - Bézier'(n,t) = n \cdot \sum_{i=0}^{n-1} (b_{i+1}-b_i) \cdot Bézier(n-1,t)_i + \textit{Bézier}'(n,t) = n \cdot \sum_{i=0}^{n-1} (b_{i+1}-b_i) \cdot \textit{Bézier}(n-1,t)_i \] which we can also write (observing that b in this formula is the same as our w weights, and that n times a summation is the same as a summation where each term is multiplied by n) as: \[ - Bézier'(n,t) = \sum_{i=0}^{n-1} Bézier(n-1,t)_i \cdot n \cdot (w_{i+1}-w_i) + \textit{Bézier}'(n,t) = \sum_{i=0}^{n-1} \textit{Bézier}(n-1,t)_i \cdot n \cdot (w_{i+1}-w_i) \] Or, in plain text: the derivative of an nth degree Bézier curve is an (n-1)th degree Bézier curve, with one fewer term, and new weights w'0...w'n-1 derived from the original weights as n(wi+1 - wi). So for a 3rd degree curve, with four weights, the derivative has three new weights: w'0 = 3(w1-w0), w'1 = 3(w2-w1) and w'2 = 3(w3-w2). @@ -75,8 +75,8 @@ And that's the first part done: the two components inside the parentheses are ac Now to apply this to our weighted Bézier curves. We'll write out the plain curve formula that we saw earlier, and then work our way through to its derivative: \[\begin{array}{lcl} - Bézier_{n,k}(t) &=& B_{n,0}(t) \cdot w_0 + B_{n,1}(t) \cdot w_1 + B_{n,2}(t) \cdot w_2 + B_{n,3}(t) \cdot w_3 + ... \\ - Bézier_{n,k}(t) \frac{d}{dt} &=& n \cdot (B_{n-1,-1}(t) - B_{n-1,0}(t)) \cdot w_0 + \\ + \textit{Bézier}_{n,k}(t) &=& B_{n,0}(t) \cdot w_0 + B_{n,1}(t) \cdot w_1 + B_{n,2}(t) \cdot w_2 + B_{n,3}(t) \cdot w_3 + ... \\ + \textit{Bézier}_{n,k}(t) \frac{d}{dt} &=& n \cdot (B_{n-1,-1}(t) - B_{n-1,0}(t)) \cdot w_0 + \\ & & n \cdot (B_{n-1,0}(t) - B_{n-1,1}(t)) \cdot w_1 + \\ & & n \cdot (B_{n-1,1}(t) - B_{n-1,2}(t)) \cdot w_2 + \\ & & n \cdot (B_{n-1,2}(t) - B_{n-1,3}(t)) \cdot w_3 + \\ @@ -106,7 +106,7 @@ Two of these terms fall way: the first term falls away because there is no -1b в этой формуле, то-же что наш w "вес", а n умноженная на функцию сумы — то-же что функция сумы, с каждой составляющей умноженной на n) как: \[ - Bézier'(n,t) = \sum_{i=0}^{n-1} Bézier(n-1,t)_i \cdot n \cdot (w_{i+1}-w_i) + \textit{Bézier}'(n,t) = \sum_{i=0}^{n-1} \textit{Bézier}(n-1,t)_i \cdot n \cdot (w_{i+1}-w_i) \] Другими словами, производная кривой Безье nго порядка равна кривой Безье на порядок ниже (n-1), соответственно имея на один термин составляющих меньше, где новые веса w'0...w'n-1 произведены из оригинальных по принципу n(wi+1 - wi). Так, для кривой 3го порядка, с 4мя весами, производная имеет 3 веса: w'0 = 3(w1-w0), w'1 = 3(w2-w1) и w'2 = 3(w3-w2). @@ -75,8 +75,8 @@ Теперь применим это к записям наших формул с "весами". Начнем с формулы кривой Безье приведенной выше и пройдемся по ее производным. \[\begin{array}{lcl} - Bézier_{n,k}(t) &=& B_{n,0}(t) \cdot w_0 + B_{n,1}(t) \cdot w_1 + B_{n,2}(t) \cdot w_2 + B_{n,3}(t) \cdot w_3 + ... \\ - Bézier_{n,k}(t) \frac{d}{dt} &=& n \cdot (B_{n-1,-1}(t) - B_{n-1,0}(t)) \cdot w_0 + \\ + \textit{Bézier}_{n,k}(t) &=& B_{n,0}(t) \cdot w_0 + B_{n,1}(t) \cdot w_1 + B_{n,2}(t) \cdot w_2 + B_{n,3}(t) \cdot w_3 + ... \\ + \textit{Bézier}_{n,k}(t) \frac{d}{dt} &=& n \cdot (B_{n-1,-1}(t) - B_{n-1,0}(t)) \cdot w_0 + \\ & & n \cdot (B_{n-1,0}(t) - B_{n-1,1}(t)) \cdot w_1 + \\ & & n \cdot (B_{n-1,1}(t) - B_{n-1,2}(t)) \cdot w_2 + \\ & & n \cdot (B_{n-1,2}(t) - B_{n-1,3}(t)) \cdot w_3 + \\ @@ -106,7 +106,7 @@ И это по сути формула функции сумы на 1 порядок ниже: \[ - Bézier_{n,k}(t) \frac{d}{dt} = n \cdot B_{(n-1),BLUE[0]}(t) \cdot (w_1 - w_0) + \textit{Bézier}_{n,k}(t) \frac{d}{dt} = n \cdot B_{(n-1),BLUE[0]}(t) \cdot (w_1 - w_0) + n \cdot B_{(n-1),RED[1]}(t) \cdot (w_2 - w_1) + n \cdot B_{(n-1),MAGENTA[2]}(t) \cdot (w_3 - w_2) ~+ ~... @@ -116,8 +116,8 @@ \[ - Bézier_{n,k}(t) \frac{d}{dt} = \sum_{k=0}^{n-1} n \cdot B_{n-1,k}(t) \cdot (w_{k+1} - w_k) - = \sum_{k=0}^{n-1} B_{n-1,k}(t) \cdot \underset{вес~производной} + \textit{Bézier}_{n,k}(t) \frac{d}{dt} = \sum_{k=0}^{n-1} n \cdot B_{n-1,k}(t) \cdot (w_{k+1} - w_k) + = \sum_{k=0}^{n-1} B_{n-1,k}(t) \cdot \underset{\textit{вес производной}} {\underbrace{n \cdot (w_{k+1} - w_k)}} \] @@ -126,22 +126,22 @@ Давайте перепишем это по форме схожей с нашей исходной формулой, чтобы легче было разглядеть разницу. Сначала оригинальная формула, за ней производная: \[ - Bézier(n,t) = \sum_{i=0}^{n} - \underset{биноминальный~термин}{\underbrace{\binom{n}{i}}} + \textit{Bézier}(n,t) = \sum_{i=0}^{n} + \underset{\textit{биноминальный термин}}{\underbrace{\binom{n}{i}}} \cdot\ - \underset{полиноминальный~термин}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} + \underset{\textit{полиноминальный термин}}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} \cdot\ - \underset{вес}{\underbrace{w_i}} + \underset{\textit{вес}}{\underbrace{w_i}} \] \[ - Bézier'(n,t) = \sum_{i=0}^{k} - \underset{биноминальный~термин}{\underbrace{\binom{k}{i}}} + \textit{Bézier}'(n,t) = \sum_{i=0}^{k} + \underset{\textit{биноминальный термин}}{\underbrace{\binom{k}{i}}} \cdot\ - \underset{полиноминальный~термин}{\underbrace{(1-t)^{k-i} \cdot t^{i}}} + \underset{\textit{полиноминальный термин}}{\underbrace{(1-t)^{k-i} \cdot t^{i}}} \cdot\ - \underset{вес~производной}{\underbrace{n \cdot (w_{i+1} - w_i)}} - {~, ~with ~k=n-1} + \underset{\textit{вес производной}}{\underbrace{n \cdot (w_{i+1} - w_i)}} + ~,~ \textit{with } k=n-1 \] И в чем же разница? В терминах формулы кривой Безье, по сути, никакой! Мы уменьшили порядок (вместо порядка n, он теперь n-1), но это все та же функция Безье. Единственное отличие в подсчете изменений в "весах" при нахождении производной. К примеру, исходя из 4-х контрольных точек A, B, C и D, первая производная получит 3 точки, вторая — 2, третья — 1: diff --git a/docs/chapters/explanation/content.en-GB.md b/docs/chapters/explanation/content.en-GB.md index acfe27fb..26229e05 100644 --- a/docs/chapters/explanation/content.en-GB.md +++ b/docs/chapters/explanation/content.en-GB.md @@ -59,9 +59,9 @@ Bézier curves are polynomials of t, rather than x, with the value \[ \begin{aligned} - linear &= (1-t) + t \\ - square &= (1-t)^2 + 2 \cdot (1-t) \cdot t + t^2 \\ - cubic &= (1-t)^3 + 3 \cdot (1-t)^2 \cdot t + 3 \cdot (1-t) \cdot t^2 + t^3 + \textit{linear} &= (1-t) + t \\ + \textit{square} &= (1-t)^2 + 2 \cdot (1-t) \cdot t + t^2 \\ + \textit{cubic} &= (1-t)^3 + 3 \cdot (1-t)^2 \cdot t + 3 \cdot (1-t) \cdot t^2 + t^3 \end{aligned} \] @@ -69,10 +69,10 @@ I know what you're thinking: that doesn't look too simple! But if we remove t \[ \begin{aligned} - linear &= \hspace{2.5em} 1 + 1 \\ - square &= \hspace{1.7em} 1 + 2 + 1\\ - cubic &= \hspace{0.85em} 1 + 3 + 3 + 1\\ - quartic &= 1 + 4 + 6 + 4 + 1 + \textit{linear} &= \hspace{2.5em} 1 + 1 \\ + \textit{square} &= \hspace{1.7em} 1 + 2 + 1\\ + \textit{cubic} &= \hspace{0.85em} 1 + 3 + 3 + 1\\ + \textit{quartic} &= 1 + 4 + 6 + 4 + 1 \end{aligned} \] @@ -82,19 +82,19 @@ There's an equally simple way to figure out how the polynomial terms work: if we \[ \begin{aligned} - linear &= BLUE[a] + RED[b] \\ - square &= BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot RED[b] + RED[b] \cdot RED[b] \\ - cubic &= BLUE[a] \cdot BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot BLUE[a] \cdot RED[b] + BLUE[a] \cdot RED[b] \cdot RED[b] + RED[b] \cdot RED[b] \cdot RED[b]\\ + \textit{linear} &= BLUE[a] + RED[b] \\ + \textit{square} &= BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot RED[b] + RED[b] \cdot RED[b] \\ + \textit{cubic} &= BLUE[a] \cdot BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot BLUE[a] \cdot RED[b] + BLUE[a] \cdot RED[b] \cdot RED[b] + RED[b] \cdot RED[b] \cdot RED[b]\\ \end{aligned} \] It's basically just a sum of "every combination of a and b", progressively replacing a's with b's after every + sign. So that's actually pretty simple too. So now you know binomial polynomials, and just for completeness I'm going to show you the generic function for this: \[ - Bézier(n,t) = \sum_{i=0}^{n} - \underset{binomial~term}{\underbrace{\binom{n}{i}}} + \textit{Bézier}(n,t) = \sum_{i=0}^{n} + \underset{\textit{binomial term}}{\underbrace{\binom{n}{i}}} \cdot\ - \underset{polynomial~term}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} + \underset{\textit{polynomial term}}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} \] And that's the full description for Bézier curves. Σ in this function indicates that this is a series of additions (using the variable listed below the Σ, starting at ...=<value> and ending at the value listed on top of the Σ). diff --git a/docs/chapters/explanation/content.ja-JP.md b/docs/chapters/explanation/content.ja-JP.md index a0c299ea..fb0037e0 100644 --- a/docs/chapters/explanation/content.ja-JP.md +++ b/docs/chapters/explanation/content.ja-JP.md @@ -57,9 +57,9 @@ \[ \begin{aligned} - 1次 &= (1-t) + t \\ - 2次 &= (1-t)^2 + 2 \cdot (1-t) \cdot t + t^2 \\ - 3次 &= (1-t)^3 + 3 \cdot (1-t)^2 \cdot t + 3 \cdot (1-t) \cdot t^2 + t^3 + \textit{1次} &= (1-t) + t \\ + \textit{2次} &= (1-t)^2 + 2 \cdot (1-t) \cdot t + t^2 \\ + \textit{3次} &= (1-t)^3 + 3 \cdot (1-t)^2 \cdot t + 3 \cdot (1-t) \cdot t^2 + t^3 \end{aligned} \] @@ -67,10 +67,10 @@ \[ \begin{aligned} - 1次 &= \hspace{2.5em} 1 + 1 \\ - 2次 &= \hspace{1.7em} 1 + 2 + 1\\ - 3次 &= \hspace{0.85em} 1 + 3 + 3 + 1\\ - 4次 &= 1 + 4 + 6 + 4 + 1 + \textit{1次} &= \hspace{2.5em} 1 + 1 \\ + \textit{2次} &= \hspace{1.7em} 1 + 2 + 1\\ + \textit{3次} &= \hspace{0.85em} 1 + 3 + 3 + 1\\ + \textit{4次} &= 1 + 4 + 6 + 4 + 1 \end{aligned} \] @@ -80,19 +80,19 @@ \[ \begin{aligned} - 1次 &= BLUE[a] + RED[b] \\ - 2次 &= BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot RED[b] + RED[b] \cdot RED[b] \\ - 3次 &= BLUE[a] \cdot BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot BLUE[a] \cdot RED[b] + BLUE[a] \cdot RED[b] \cdot RED[b] + RED[b] \cdot RED[b] \cdot RED[b]\\ + \textit{1次} &= BLUE[a] + RED[b] \\ + \textit{2次} &= BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot RED[b] + RED[b] \cdot RED[b] \\ + \textit{3次} &= BLUE[a] \cdot BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot BLUE[a] \cdot RED[b] + BLUE[a] \cdot RED[b] \cdot RED[b] + RED[b] \cdot RED[b] \cdot RED[b]\\ \end{aligned} \] これは要するに、「abのすべての組み合わせ」の単なる和です。プラスが出てくるたびに、abへと1つずつ置き換えていけばよいのです。こちらも本当に単純です。さて、これで「二項係数多項式」がわかりました。完璧を期するため、この関数の一般の形を示しておきます。 \[ - Bézier(n,t) = \sum_{i=0}^{n} - \underset{二項係数部分の項}{\underbrace{\binom{n}{i}}} + \textit{Bézier}(n,t) = \sum_{i=0}^{n} + \underset{\textit{二項係数部分の項}}{\underbrace{\binom{n}{i}}} \cdot\ - \underset{多項式部分の項}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} + \underset{\textit{多項式部分の項}}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} \] そして、これがベジエ曲線の完全な表現です。この関数中のΣは、加算の繰り返し(Σの下にある変数を使って、...=<値>から始めてΣの下にある値まで)を表します。 diff --git a/docs/chapters/explanation/content.ru-RU.md b/docs/chapters/explanation/content.ru-RU.md index b371f979..ad9884e8 100644 --- a/docs/chapters/explanation/content.ru-RU.md +++ b/docs/chapters/explanation/content.ru-RU.md @@ -59,9 +59,9 @@ \[ \begin{aligned} - линейный &= (1-t) + t \\ - квадратный &= (1-t)^2 + 2 \cdot (1-t) \cdot t + t^2 \\ - кубический &= (1-t)^3 + 3 \cdot (1-t)^2 \cdot t + 3 \cdot (1-t) \cdot t^2 + t^3 + \textit{линийный} &= (1-t) + t \\ + \textit{квадратый} &= (1-t)^2 + 2 \cdot (1-t) \cdot t + t^2 \\ + \textit{кубический} &= (1-t)^3 + 3 \cdot (1-t)^2 \cdot t + 3 \cdot (1-t) \cdot t^2 + t^3 \end{aligned} \] @@ -69,10 +69,10 @@ \[ \begin{aligned} - линийный &= \hspace{2.5em} 1 + 1 \\ - квадратый &= \hspace{1.7em} 1 + 2 + 1\\ - кубический &= \hspace{0.85em} 1 + 3 + 3 + 1\\ - квартический &= 1 + 4 + 6 + 4 + 1 + \textit{линийный} &= \hspace{2.5em} 1 + 1 \\ + \textit{квадратый} &= \hspace{1.7em} 1 + 2 + 1\\ + \textit{кубический} &= \hspace{0.85em} 1 + 3 + 3 + 1\\ + \textit{квартический} &= 1 + 4 + 6 + 4 + 1 \end{aligned} \] @@ -82,19 +82,19 @@ \[ \begin{aligned} - линийный &= BLUE[a] + RED[b] \\ - квадратый &= BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot RED[b] + RED[b] \cdot RED[b] \\ - кубический &= BLUE[a] \cdot BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot BLUE[a] \cdot RED[b] + BLUE[a] \cdot RED[b] \cdot RED[b] + RED[b] \cdot RED[b] \cdot RED[b]\\ + \textit{линийный} &= BLUE[a] + RED[b] \\ + \textit{квадратый} &= BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot RED[b] + RED[b] \cdot RED[b] \\ + \textit{кубический} &= BLUE[a] \cdot BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot BLUE[a] \cdot RED[b] + BLUE[a] \cdot RED[b] \cdot RED[b] + RED[b] \cdot RED[b] \cdot RED[b]\\ \end{aligned} \] В целом это просто сума "каждого сочетания a и b", получаемая прогрессивной заменой a на b по ходу уравнения. Потому, это так-же довольно просто. Итак теперь вы знаете что такое биноминальные полиномы. Для полноты картины, ниже привожу их общую функцию: \[ - Bézier(n,t) = \sum_{i=0}^{n} - \underset{биноминальный~термин}{\underbrace{\binom{n}{i}}} + \textit{Bézier}(n,t) = \sum_{i=0}^{n} + \underset{\textit{биноминальный термин}}{\underbrace{\binom{n}{i}}} \cdot\ - \underset{полиноминальный~термин}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} + \underset{\textit{полиноминальный термин}}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} \] И теперь, это полное объяснение. Σ в этой функции означает, что это серия сум (с использованием переменной приведенной под Σ, со стартовым значением в ...=<value> и максимальным значением представленным над Σ) diff --git a/docs/chapters/explanation/content.zh-CN.md b/docs/chapters/explanation/content.zh-CN.md index 093d2c62..dccea53b 100644 --- a/docs/chapters/explanation/content.zh-CN.md +++ b/docs/chapters/explanation/content.zh-CN.md @@ -57,9 +57,9 @@ \[ \begin{aligned} - linear &= (1-t) + t \\ - square &= (1-t)^2 + 2 \cdot (1-t) \cdot t + t^2 \\ - cubic &= (1-t)^3 + 3 \cdot (1-t)^2 \cdot t + 3 \cdot (1-t) \cdot t^2 + t^3 + \textit{linear} &= (1-t) + t \\ + \textit{square} &= (1-t)^2 + 2 \cdot (1-t) \cdot t + t^2 \\ + \textit{cubic} &= (1-t)^3 + 3 \cdot (1-t)^2 \cdot t + 3 \cdot (1-t) \cdot t^2 + t^3 \end{aligned} \] @@ -67,10 +67,10 @@ \[ \begin{aligned} - linear &= \hspace{2.5em} 1 + 1 \\ - square &= \hspace{1.7em} 1 + 2 + 1\\ - cubic &= \hspace{0.85em} 1 + 3 + 3 + 1\\ - quartic &= 1 + 4 + 6 + 4 + 1 + \textit{linear} &= \hspace{2.5em} 1 + 1 \\ + \textit{square} &= \hspace{1.7em} 1 + 2 + 1\\ + \textit{cubic} &= \hspace{0.85em} 1 + 3 + 3 + 1\\ + \textit{quartic} &= 1 + 4 + 6 + 4 + 1 \end{aligned} \] @@ -80,19 +80,19 @@ \[ \begin{aligned} - linear &= BLUE[a] + RED[b] \\ - square &= BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot RED[b] + RED[b] \cdot RED[b] \\ - cubic &= BLUE[a] \cdot BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot BLUE[a] \cdot RED[b] + BLUE[a] \cdot RED[b] \cdot RED[b] + RED[b] \cdot RED[b] \cdot RED[b]\\ + \textit{linear} &= BLUE[a] + RED[b] \\ + \textit{square} &= BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot RED[b] + RED[b] \cdot RED[b] \\ + \textit{cubic} &= BLUE[a] \cdot BLUE[a] \cdot BLUE[a] + BLUE[a] \cdot BLUE[a] \cdot RED[b] + BLUE[a] \cdot RED[b] \cdot RED[b] + RED[b] \cdot RED[b] \cdot RED[b]\\ \end{aligned} \] 基本上它就是“每个ab结合项”的和,在每个加号后面逐步的将a换成b。因此这也很简单。现在你已经知道了二次多项式,为了叙述的完整性,我将给出一般方程: \[ - Bézier(n,t) = \sum_{i=0}^{n} - \underset{binomial~term}{\underbrace{\binom{n}{i}}} + \textit{Bézier}(n,t) = \sum_{i=0}^{n} + \underset{\textit{binomial term}}{\underbrace{\binom{n}{i}}} \cdot\ - \underset{polynomial~term}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} + \underset{\textit{polynomial term}}{\underbrace{(1-t)^{n-i} \cdot t^{i}}} \] 这就是贝塞尔曲线完整的描述。在这个函数中的Σ表示了这是一系列的加法(用Σ下面的变量,从...=<值>开始,直到Σ上面的数字结束)。 diff --git a/docs/chapters/extended/content.en-GB.md b/docs/chapters/extended/content.en-GB.md index eff0f991..d5e26e94 100644 --- a/docs/chapters/extended/content.en-GB.md +++ b/docs/chapters/extended/content.en-GB.md @@ -5,13 +5,13 @@ Now that we know the mathematics behind Bézier curves, there's one curious thin It all has to do with how we run from "the start" of our curve to "the end" of our curve. If we have a value that is a mixture of two other values, then the general formula for this is: \[ - mixture = a \cdot value_1 + b \cdot value_2 + \textit{mixture} = a \cdot \textit{value}_1 + b \cdot \textit{value}_2 \] The obvious start and end values here need to be `a=1, b=0`, so that the mixed value is 100% value 1, and 0% value 2, and `a=0, b=1`, so that the mixed value is 0% value 1 and 100% value 2. Additionally, we don't want "a" and "b" to be independent: if they are, then we could just pick whatever values we like, and end up with a mixed value that is, for example, 100% value 1 **and** 100% value 2. In principle that's fine, but for Bézier curves we always want mixed values *between* the start and end point, so we need to make sure we can never set "a" and "b" to some values that lead to a mix value that sums to more than 100%. And that's easy: \[ - m = a \cdot value_1 + (1 - a) \cdot value_2 + m = a \cdot \textit{value}_1 + (1 - a) \cdot \textit{value}_2 \] With this we can guarantee that we never sum above 100%. By restricting `a` to values in the interval [0,1], we will always be somewhere between our two values (inclusively), and we will always sum to a 100% mix. diff --git a/docs/chapters/extended/content.ja-JP.md b/docs/chapters/extended/content.ja-JP.md index 4f4c2dd9..0871f077 100644 --- a/docs/chapters/extended/content.ja-JP.md +++ b/docs/chapters/extended/content.ja-JP.md @@ -5,13 +5,13 @@ このことは、曲線の「始点」から曲線の「終点」までどうやって動かすか、ということにすべて関係しています。2つの値を混ぜ合わせて1つの値をつくる場合、一般の式は次のようになります。 \[ - 混ぜ合わさった値 = a \cdot 値_1 + b \cdot 値_2 + \textit{混ぜ合わさった値} = a \cdot \textit{値}_1 + b \cdot \textit{値}_2 \] 明らかに、始点では`a=1, b=0`とする必要があります。こうすれば、値1が100%、値2が0%で混ぜ合わさるからです。また、終点では`a=0, b=1`とする必要があります。こうすれば、値1が0%、値2が100%で混ぜ合わさります。これに加えて、`a`と`b`を独立にしておきたくはありません。独立になっている場合、何でも好きな値にすることできますが、こうすると例えば「値1が100%**かつ**値2が100%」のようなことが可能になってしまいます。これはこれで原則としてはかまいませんが、ベジエ曲線の場合は混ぜ合わさった値が常に始点と終点の*間*になってほしいのです。というわけで、混ぜ合わせの和が100%を決して超えないように、`a`と`b`の値を設定する必要があります。これは次のようにすれば簡単です。 \[ - 混ぜ合わさった値 = a \cdot 値_1 + (1 - a) \cdot 値_2 + \textit{混ぜ合わさった値} = a \cdot \textit{値}_1 + (1 - a) \cdot \textit{値}_2 \] こうすれば、和が100%を超えることはないと保証できます。`a`の値を区間[0,1]に制限してしまえば、混ぜ合わさった値は常に2つの値の間のどこか(両端を含む)になり、また和は常に100%になります。 diff --git a/docs/chapters/extended/content.ru-RU.md b/docs/chapters/extended/content.ru-RU.md index a7af22ac..7b0faf3c 100644 --- a/docs/chapters/extended/content.ru-RU.md +++ b/docs/chapters/extended/content.ru-RU.md @@ -1,17 +1,17 @@ # Интервал Безье [0,1] -В математике кривых Безье, вы могли заметить одну любопытную деталь — кривые Безье всегда считают вдоль одного и того же интервала t, `t=0` to `t=1`. Почему же именно этот интервал? +В математике кривых Безье, вы могли заметить одну любопытную деталь — кривые Безье всегда считают вдоль одного и того же интервала t, `t=0` to `t=1`. Почему же именно этот интервал? Последнее обусловленно тем, как мы определяем "начало" и "конец" нашей кривой. Если у нас есть значение, которое представляет собой сочетание двух других значений, тогда общая формула для этого будет: \[ - mixture = a \cdot value_1 + b \cdot value_2 + \textit{mixture} = a \cdot \textit{value}_1 + b \cdot \textit{value}_2 \] Очевидно, что начальное и конечное значения `a` и `b` должны быть `a=1, b=0`, чтобы в начале получать вывод 100% первого показателя и 0% второго; и `a=0, b=1`, чтобы в конце получать 0% value 1 и 100% value 2. В дополнение, мы не хотим чтобы "a" и "b" были независимыми, в коем случае можно было бы присвоить им любые значения и на выводе получить, например, 100% первого показателя **и** 100% второго. В принципе, с последним все ок, но в случае кривых Безье, мы всегда должны получать значение *между* двух крайностей, потому нельзя присвоить `a` и `b` значения, которые бы вместе составляли суму более 100% на выводе, что можно записать как: \[ - m = a \cdot value_1 + (1 - a) \cdot value_2 + m = a \cdot \textit{value}_1 + (1 - a) \cdot \textit{value}_2 \] С этим у нас есть гарантия, что мы не получим суму значений пропорций более 100%. Мы ограничиваем значение `a` интервалом [0,1], потому всегда получаем вывод из пропорционального смешения двух показателей, с сумой смесителей не превышающей 100%. @@ -27,5 +27,5 @@ -В области компьютерной графики, существуют множество кривых, которые действуют по противоположному кривым Безье принципу: вместо фиксированного интервала и свободного выбора контрольных точек формирующих развитие искривлений, они фиксируют форму кривой, предоставляя возможность выбора интервала. Отличным примером последней есть [кривая "Spiro"](https://levien.com/phd/phd.html), которая частично базируется на [спирали Корню](https://ru.wikipedia.org/wiki/%D0%9A%D0%BB%D0%BE%D1%82%D0%BE%D0%B8%D0%B4%D0%B0), также известной как [спираль Эйлера](https://ru.qaz.wiki/wiki/Euler_spiral) (* в оригинале другая [ссылка на Корню и Эйлера](https://en.wikipedia.org/wiki/Euler_spiral) ). Эту эстетически приятную кривую можно встретить в нескольких графических пакетах: [FontForge](https://fontforge.org/en-US/) и [Inkscape](https://inkscape.org). Ее даже используют в дизайне шрифтов, например в начертания шрифта Inconsolata. +В области компьютерной графики, существуют множество кривых, которые действуют по противоположному кривым Безье принципу: вместо фиксированного интервала и свободного выбора контрольных точек формирующих развитие искривлений, они фиксируют форму кривой, предоставляя возможность выбора интервала. Отличным примером последней есть [кривая "Spiro"](https://levien.com/phd/phd.html), которая частично базируется на [спирали Корню](https://ru.wikipedia.org/wiki/%D0%9A%D0%BB%D0%BE%D1%82%D0%BE%D0%B8%D0%B4%D0%B0), также известной как [спираль Эйлера](https://ru.qaz.wiki/wiki/Euler_spiral) (* в оригинале другая [ссылка на Корню и Эйлера](https://en.wikipedia.org/wiki/Euler_spiral) ). Эту эстетически приятную кривую можно встретить в нескольких графических пакетах: [FontForge](https://fontforge.org/en-US/) и [Inkscape](https://inkscape.org). Ее даже используют в дизайне шрифтов, например в начертания шрифта Inconsolata. diff --git a/docs/chapters/extended/content.zh-CN.md b/docs/chapters/extended/content.zh-CN.md index 36b0bd96..be0861d0 100644 --- a/docs/chapters/extended/content.zh-CN.md +++ b/docs/chapters/extended/content.zh-CN.md @@ -5,13 +5,13 @@ 这一切都与我们如何从曲线的“起点”变化到曲线“终点”有关。如果有一个值是另外两个值的混合,一般方程如下: \[ - mixture = a \cdot value_1 + b \cdot value_2 + \textit{mixture} = a \cdot \textit{value}_1 + b \cdot \textit{value}_2 \] 很显然,起始值需要`a=1, b=0`,混合值就为100%的value 1和0%的value 2。终点值需要`a=0, b=1`,则混合值是0%的value 1和100%的value 2。另外,我们不想让“a”和“b”是互相独立的:如果它们是互相独立的话,我们可以任意选出自己喜欢的值,并得到混合值,比如说100%的value1和100%的value2。原则上这是可以的,但是对于贝塞尔曲线来说,我们通常想要的是起始值和终点值*之间*的混合值,所以要确保我们不会设置一些“a”和"b"而导致混合值超过100%。这很简单: \[ - m = a \cdot value_1 + (1 - a) \cdot value_2 + m = a \cdot \textit{value}_1 + (1 - a) \cdot \textit{value}_2 \] 用这个式子我们可以保证相加的值永远不会超过100%。通过将`a`限制在区间[0,1],我们将会一直处于这两个值之间(包括这两个端点),并且相加为100%。 diff --git a/docs/chapters/extremities/content.en-GB.md b/docs/chapters/extremities/content.en-GB.md index 0a617ff2..a7461348 100644 --- a/docs/chapters/extremities/content.en-GB.md +++ b/docs/chapters/extremities/content.en-GB.md @@ -33,7 +33,7 @@ Although with the [caveat](https://en.wikipedia.org/wiki/Caveat_emptor#Caveat_le The derivative of a cubic Bézier curve is a quadratic Bézier curve, and finding the roots for a quadratic polynomial means we can apply the [Quadratic formula](https://en.wikipedia.org/wiki/Quadratic_formula). If you've seen it before, you'll remember it, and if you haven't, it looks like this: \[ - Given~f(t) = at^2 + bt + c,~f(t)=0~when~t = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a} + \textit{Given}~f(t) = at^2 + bt + c,~f(t)=0 ~\textit{when}~ t = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a} \] So, if we can rewrite the Bézier component function as a plain polynomial, we're done: we just plug in the values into the quadratic formula, check if that square root is negative or not (if it is, there are no roots) and then just compute the two values that come out (because of that plus/minus sign we get two). Any value between 0 and 1 is a root that matters for Bézier curves, anything below or above that is irrelevant (because Bézier curves are only defined over the interval [0,1]). So, how do we convert? @@ -42,8 +42,8 @@ First we turn our cubic Bézier function into a quadratic one, by following the \[ \begin{array}{l} - B(t)~uses~\{ p_1,p_2,p_3,p_4 \} \\ - B'(t)~uses~\{ v_1,v_2,v_3 \},~where~v_1 = 3(p_2-p_1),~v_2 = 3(p_3-p_2),~v_3 = 3(p_4-p_3) + B(t)~\textit{uses}~\{ p_1,p_2,p_3,p_4 \} \\ + B'(t)~\textit{uses}~\{ v_1,v_2,v_3 \},~\textit{where}~v_1 = 3(p_2-p_1),~v_2 = 3(p_3-p_2),~v_3 = 3(p_4-p_3) \end{array} \] diff --git a/docs/chapters/inflections/content.en-GB.md b/docs/chapters/inflections/content.en-GB.md index d58c9314..841a3c99 100644 --- a/docs/chapters/inflections/content.en-GB.md +++ b/docs/chapters/inflections/content.en-GB.md @@ -13,7 +13,7 @@ What we need to do is solve a simple equation: What we're saying here is that given the curvature function *C(t)*, we want to know for which values of *t* this function is zero, meaning there is no "curvature", which will be exactly at the point between our circle being on one side of the curve, and our circle being on the other side of the curve. So what does *C(t)* look like? Actually something that seems not too hard: \[ - C(t) = Bézier_x\prime(t) \cdot Bézier_y{\prime\prime}(t) - Bézier_y\prime(t) \cdot Bézier_x{\prime\prime}(t) + C(t) = \textit{Bézier}_x\prime(t) \cdot \textit{Bézier}_y{\prime\prime}(t) - \textit{Bézier}_y\prime(t) \cdot \textit{Bézier}_x{\prime\prime}(t) \] The function *C(t)* is the cross product between the first and second derivative functions for the parametric dimensions of our curve. And, as already shown, derivatives of Bézier curves are just simpler Bézier curves, with very easy to compute new coefficients, so this should be pretty easy. @@ -28,9 +28,9 @@ Of course, before we do our aligned check, let's see what happens if we compute \[ \begin{aligned} - & Bézier(t) = x_1(1-t)^3 + 3x_2(1-t)^2t + 3x_3(1-t)t^2 + x_4t^3 \\ - & Bézier^\prime(t) = a(1-t)^2 + 2b(1-t)t + ct^2~ \left\{ a=3(x_2-x_1),b=3(x_3-x_2),c=3(x_4-x_3) \right\} \\ - & Bézier^{\prime\prime}(t) = u(1-t) + vt~\left\{ u=2(b-a),v=2(c-b) \right\}\ + & \textit{Bézier}(t) = x_1(1-t)^3 + 3x_2(1-t)^2t + 3x_3(1-t)t^2 + x_4t^3 \\ + & \textit{Bézier}^\prime(t) = a(1-t)^2 + 2b(1-t)t + ct^2~ \left\{ a=3(x_2-x_1),b=3(x_3-x_2),c=3(x_4-x_3) \right\} \\ + & \textit{Bézier}^{\prime\prime}(t) = u(1-t) + vt~\left\{ u=2(b-a),v=2(c-b) \right\}\ \end{aligned} \] @@ -38,9 +38,9 @@ And of course the same functions for *y*: \[ \begin{aligned} - & Bézier(t) = y_1(1-t)^3 + 3y_2(1-t)^2t + 3y_3(1-t)t^2 + y_4t^3 \\ - & Bézier^\prime(t) = d(1-t)^2 + 2e(1-t)t + ft^2\\ - & Bézier^{\prime\prime}(t) = w(1-t) + zt + & \textit{Bézier}(t) = y_1(1-t)^3 + 3y_2(1-t)^2t + 3y_3(1-t)t^2 + y_4t^3 \\ + & \textit{Bézier}^\prime(t) = d(1-t)^2 + 2e(1-t)t + ft^2\\ + & \textit{Bézier}^{\prime\prime}(t) = w(1-t) + zt \end{aligned} \] diff --git a/docs/chapters/matrixsplit/content.en-GB.md b/docs/chapters/matrixsplit/content.en-GB.md index 8a26d45c..0d803185 100644 --- a/docs/chapters/matrixsplit/content.en-GB.md +++ b/docs/chapters/matrixsplit/content.en-GB.md @@ -155,7 +155,7 @@ Deriving the two segments upon splitting a curve takes a few steps, and the high 1 & t & t^2 \end{bmatrix} \cdot - \underset{we~turn~this...}{\underbrace{\kern 2.25em Z \cdot M \kern 2.25em}} + \underset{\textit{we turn this...}}{\underbrace{\kern 2.25em Z \cdot M \kern 2.25em}} \cdot \begin{bmatrix} P_1 \\ P_2 \\ P_3 @@ -168,7 +168,7 @@ Deriving the two segments upon splitting a curve takes a few steps, and the high 1 & t & t^2 \end{bmatrix} \cdot - \underset{...into~this...}{\underbrace{ M \cdot M^{-1} \cdot Z \cdot M }} + \underset{\textit{into this...}}{\underbrace{ M \cdot M^{-1} \cdot Z \cdot M }} \cdot \begin{bmatrix} P_1 \\ P_2 \\ P_3 @@ -182,7 +182,7 @@ Deriving the two segments upon splitting a curve takes a few steps, and the high \end{bmatrix} \cdot M - \underset{...to~get~this!}{\underbrace{ \kern 1.25em \cdot \kern 1.25em Q \kern 1.25em \cdot \kern 1.25em}} + \underset{\textit{...to get this!}}{\underbrace{ \kern 1.25em \cdot \kern 1.25em Q \kern 1.25em \cdot \kern 1.25em}} \begin{bmatrix} P_1 \\ P_2 \\ P_3 \end{bmatrix} diff --git a/docs/chapters/matrixsplit/content.ja-JP.md b/docs/chapters/matrixsplit/content.ja-JP.md index 6c2ad91c..4e90938d 100644 --- a/docs/chapters/matrixsplit/content.ja-JP.md +++ b/docs/chapters/matrixsplit/content.ja-JP.md @@ -155,7 +155,7 @@ 1 & t & t^2 \end{bmatrix} \cdot - \underset{これを…}{\underbrace{\kern 2.25em Z \cdot M \kern 2.25em}} + \underset{\textit{これを…}}{\underbrace{\kern 2.25em Z \cdot M \kern 2.25em}} \cdot \begin{bmatrix} P_1 \\ P_2 \\ P_3 @@ -168,7 +168,7 @@ 1 & t & t^2 \end{bmatrix} \cdot - \underset{…こうして…}{\underbrace{ M \cdot M^{-1} \cdot Z \cdot M }} + \underset{\textit{…こうして…}}{\underbrace{ M \cdot M^{-1} \cdot Z \cdot M }} \cdot \begin{bmatrix} P_1 \\ P_2 \\ P_3 @@ -182,7 +182,7 @@ \end{bmatrix} \cdot M - \underset{…こうじゃ!}{\underbrace{ \kern 1.25em \cdot \kern 1.25em Q \kern 1.25em \cdot \kern 1.25em}} + \underset{\textit{…こうじゃ!}}{\underbrace{ \kern 1.25em \cdot \kern 1.25em Q \kern 1.25em \cdot \kern 1.25em}} \begin{bmatrix} P_1 \\ P_2 \\ P_3 \end{bmatrix} diff --git a/docs/chapters/molding/content.en-GB.md b/docs/chapters/molding/content.en-GB.md index 347d0724..7f84b36f 100644 --- a/docs/chapters/molding/content.en-GB.md +++ b/docs/chapters/molding/content.en-GB.md @@ -5,13 +5,13 @@ Armed with knowledge of the "ABC" relation, point-on-curve projection, and guest For quadratic curve, this is a really simple trick: we project our cursor onto the curve, which gives us a `t` value and initial `B` coordinate. We don't even need the latter: with our `t` value and "wherever the cursor is" as target `B`, we can compute the associated `C`: \[ - C = u(t)_{q} \cdot Start + \left ( 1-u(t)_{q} \right ) \cdot End + C = u(t)_{q} \cdot \textit{Start} + \left ( 1-u(t)_{q} \right ) \cdot \textit{End} \] And then the associated `A`: \[ - A = B - \frac{C - B}{ratio(t)_{q}} = B + \frac{B - C}{ratio(t)_{q}} + A = B - \frac{C - B}{\textit{ratio}(t)_{q}} = B + \frac{B - C}{\textit{ratio}(t)_{q}} \] And we're done, because that's our new quadratic control point! diff --git a/docs/chapters/pointvectors/content.en-GB.md b/docs/chapters/pointvectors/content.en-GB.md index 236eafb5..9fa7d0d3 100644 --- a/docs/chapters/pointvectors/content.en-GB.md +++ b/docs/chapters/pointvectors/content.en-GB.md @@ -4,9 +4,9 @@ If you want to move objects along a curve, or "away from" a curve, the two vecto \[ \begin{matrix} - tangent_x(t) = B'_x(t) \\ + \textit{tangent}_x(t) = B'_x(t) \\ \\ - tangent_y(t) = B'_y(t) + \textit{tangent}_y(t) = B'_y(t) \end{matrix} \] @@ -14,14 +14,14 @@ This gives us the directional vector we want. We can normalize it to give us uni \[ \begin{matrix} - d = \left \| tangent(t) \right \| = \sqrt{B'_x(t)^2 + B'_y(t)^2} \\ + d = \left \| \textit{tangent}(t) \right \| = \sqrt{B'_x(t)^2 + B'_y(t)^2} \\ \\ - \hat{x}(t) = \left \| tangent_x(t) \right \| - =\frac{tangent_x(t)}{ \left \| tangent(t) \right \| } + \hat{x}(t) = \left \| \textit{tangent}_x(t) \right \| + =\frac{\textit{tangent}_x(t)}{ \left \| \textit{tangent}(t) \right \| } = \frac{B'_x(t)}{d} \\ \\ - \hat{y}(t) = \left \| tangent_y(t) \right \| - = \frac{tangent_y(t)}{ \left \| tangent(t) \right \| } + \hat{y}(t) = \left \| \textit{tangent}_y(t) \right \| + = \frac{\textit{tangent}_y(t)}{ \left \| \textit{tangent}(t) \right \| } = \frac{B'_y(t)}{d} \end{matrix} \] @@ -30,9 +30,9 @@ The tangent is very useful for moving along a line, but what if we want to move \[ \begin{array}{l} - normal_x(t) = \hat{x}(t) \cdot \cos{\frac{\pi}{2}} - \hat{y}(t) \cdot \sin{\frac{\pi}{2}} = - \hat{y}(t) \\ + \textit{normal}_x(t) = \hat{x}(t) \cdot \cos{\frac{\pi}{2}} - \hat{y}(t) \cdot \sin{\frac{\pi}{2}} = - \hat{y}(t) \\ \\ - normal_y(t) = \underset{quarter~circle~rotation} {\underbrace{ \hat{x}(t) \cdot \sin{\frac{\pi}{2}} + \hat{y}(t) \cdot \cos{\frac{\pi}{2}} }} = \hat{x}(t) + \textit{normal}_y(t) = \underset{\textit{quarter circle rotation}} {\underbrace{ \hat{x}(t) \cdot \sin{\frac{\pi}{2}} + \hat{y}(t) \cdot \cos{\frac{\pi}{2}} }} = \hat{x}(t) \end{array} \] diff --git a/docs/chapters/polybezier/content.en-GB.md b/docs/chapters/polybezier/content.en-GB.md index 40f9f9db..d82b7e0d 100644 --- a/docs/chapters/polybezier/content.en-GB.md +++ b/docs/chapters/polybezier/content.en-GB.md @@ -21,7 +21,7 @@ Dragging the control points around only affects the curve segments that the cont We can effect this quite easily, because we know that the vector from a curve's last control point to its last on-curve point is equal to the derivative vector. If we want to ensure that the first control point of the next curve matches that, all we have to do is mirror that last control point through the last on-curve point. And mirroring any point A through any point B is really simple: \[ - Mirrored = \left [ + \textit{Mirrored} = \left [ \begin{matrix} B_x + (B_x - A_x) \\ B_y + (B_y - A_y) \end{matrix} \right ] = \left [ \begin{matrix} 2B_x - A_x \\ 2B_y - A_y \end{matrix} diff --git a/docs/chapters/reordering/content.en-GB.md b/docs/chapters/reordering/content.en-GB.md index cdb0e264..c06d684d 100644 --- a/docs/chapters/reordering/content.en-GB.md +++ b/docs/chapters/reordering/content.en-GB.md @@ -7,13 +7,13 @@ If we have a curve with three points, then we can create a curve with four point The general rule for raising an *nth* order curve to an *(n+1)th* order curve is as follows (observing that the start and end weights are the same as the start and end weights for the old curve): \[ - Bézier(k,t) = \sum_{i=0}^{k} - \underset{binomial~term}{\underbrace{\binom{k}{i}}} + \textit{Bézier}(k,t) = \sum_{i=0}^{k} + \underset{\textit{binomial term}}{\underbrace{\binom{k}{i}}} \cdot\ - \underset{polynomial~term}{\underbrace{(1-t)^{k-i} \cdot t^{i}}} + \underset{\textit{polynomial term}}{\underbrace{(1-t)^{k-i} \cdot t^{i}}} ~\cdot \ - \underset{new~weights}{\underbrace{\left ( \frac{(k-i) \cdot w_i + i \cdot w_{i-1}}{k} \right )}} - ~,~with~k = n+1~and~w_{i-1}=0~when~i = 0 + \underset{\textit{new weights}}{\underbrace{\left ( \frac{(k-i) \cdot w_i + i \cdot w_{i-1}}{k} \right )}} + ~,~\textit{with}~k = n+1~\textit{and}~w_{i-1}=0~when~i = 0 \] However, this rule also has as direct consequence that you **cannot** generally safely lower a curve from *nth* order to *(n-1)th* order, because the control points cannot be "pulled apart" cleanly. We can try to, but the resulting curve will not be identical to the original, and may in fact look completely different. @@ -23,7 +23,7 @@ However, there is a surprisingly good way to ensure that a lower order curve loo We start by taking the standard Bézier function, and condensing it a little: \[ - Bézier(n,t) + \textit{Bézier}(n,t) = \sum_{i=0}^{n} w_i B^n_i(t) \textit{, where } @@ -42,7 +42,7 @@ So, with that seemingly trivial observation, we rewrite that Bézier function by \[ \begin{aligned} - Bézier(n,t) &= (1-t) B(n,t) + t B(n,t) \\ + \textit{Bézier}(n,t) &= (1-t) B(n,t) + t B(n,t) \\ &= \sum_{i=0}^{n} w_i (1 - t) B^n_i(t) + \sum_{i=0}^{n} w_i t B^n_i(t) \end{aligned} \] diff --git a/docs/chapters/weightcontrol/content.en-GB.md b/docs/chapters/weightcontrol/content.en-GB.md index 998a61af..1b90e256 100644 --- a/docs/chapters/weightcontrol/content.en-GB.md +++ b/docs/chapters/weightcontrol/content.en-GB.md @@ -5,13 +5,13 @@ We can further control Bézier curves by "rationalising" them: that is, adding a Adding these ratio values to the regular Bézier curve function is fairly easy. Where the regular function is the following: \[ - Bézier(n,t) = \sum_{i=0}^{n} \binom{n}{i} \cdot (1-t)^{n-i} \cdot t^{i} \cdot w_i + \textit{Bézier}(n,t) = \sum_{i=0}^{n} \binom{n}{i} \cdot (1-t)^{n-i} \cdot t^{i} \cdot w_i \] The function for rational Bézier curves has two more terms: \[ - Rational~Bézier(n,t) = \frac{ \sum_{i=0}^{n} \binom{n}{i} \cdot (1-t)^{n-i} \cdot t^{i} \cdot w_i \cdot BLUE[ratio_i] }{ BLUE[ \sum_{i=0}^{n} \binom{n}{i} \cdot (1-t)^{n-i} \cdot t^{i} \cdot ratio_i ] } + \textit{Rational Bézier}(n,t) = \frac{ \sum_{i=0}^{n} \binom{n}{i} \cdot (1-t)^{n-i} \cdot t^{i} \cdot w_i \cdot BLUE[ratio_i] }{ BLUE[ \sum_{i=0}^{n} \binom{n}{i} \cdot (1-t)^{n-i} \cdot t^{i} \cdot ratio_i ] } \] In this, the first new term represents an additional weight for each coordinate. For example, if our ratio values are [1, 0.5, 0.5, 1] then ratio0 = 1, ratio1 = 0.5, and so on, and is effectively identical as if we were just using different weight. So far, nothing too special. diff --git a/docs/chapters/weightcontrol/content.ru-RU.md b/docs/chapters/weightcontrol/content.ru-RU.md index 35a02c89..96144568 100644 --- a/docs/chapters/weightcontrol/content.ru-RU.md +++ b/docs/chapters/weightcontrol/content.ru-RU.md @@ -5,13 +5,13 @@ Как и прочее, воплощение этого коэффициента не должно составить нам особого труда. Тогда как обычная функция: \[ - Bézier(n,t) = \sum_{i=0}^{n} \binom{n}{i} \cdot (1-t)^{n-i} \cdot t^{i} \cdot w_i + \textit{Bézier}(n,t) = \sum_{i=0}^{n} \binom{n}{i} \cdot (1-t)^{n-i} \cdot t^{i} \cdot w_i \] Функция для соотносительных кривых Безье имеет два дополнительных термина: \[ - Rational~Bézier(n,t) = \frac{ \sum_{i=0}^{n} \binom{n}{i} \cdot (1-t)^{n-i} \cdot t^{i} \cdot w_i \cdot BLUE[ratio_i] }{ BLUE[ \sum_{i=0}^{n} \binom{n}{i} \cdot (1-t)^{n-i} \cdot t^{i} \cdot ratio_i ] } + \textit{Rational Bézier}(n,t) = \frac{ \sum_{i=0}^{n} \binom{n}{i} \cdot (1-t)^{n-i} \cdot t^{i} \cdot w_i \cdot BLUE[ratio_i] }{ BLUE[ \sum_{i=0}^{n} \binom{n}{i} \cdot (1-t)^{n-i} \cdot t^{i} \cdot ratio_i ] } \] Первый из добавочных терминов, представляет собой дополнительный "вес" для каждой координаты, Например если наши значения соотношений [1, 0.5, 0.5, 1], тогда частица0 = 1, частица1 = 0.5 и т.д., и на практике ничем не отличается от использования дополнительного "вес"-а. Пока ничего особо выдающегося. diff --git a/docs/chapters/whatis/content.en-GB.md b/docs/chapters/whatis/content.en-GB.md index 61ba77ef..7c4f6083 100644 --- a/docs/chapters/whatis/content.en-GB.md +++ b/docs/chapters/whatis/content.en-GB.md @@ -7,14 +7,14 @@ Bézier curves are the result of [linear interpolations](https://en.wikipedia.or If we know the distance between those two points, and we want a new point that is, say, 20% the distance away from the first point (and thus 80% the distance away from the second point) then we can compute that really easily: \[ -Given \left ( +\textit{Given} \left ( \begin{aligned} - p_1 &= some~point \\ - p_2 &= some~other~point \\ - distance &= (p_2 - p_1) \\ - ratio &= \frac{percentage}{100} \\ + p_1 &= \textit{some point} \\ + p_2 &= \textit{some other point} \\ + \textit{distance} &= (p_2 - p_1) \\ + \textit{ratio} &= \frac{\textit{percentage}}{100} \\ \end{aligned} -\right ),~our~new~point = p_1 + distance \cdot ratio +\right ),~\textit{our new point} = p_1 + \textit{distance} \cdot \textit{ratio} \] So let's look at that in action: the following graphic is interactive in that you can use your up and down arrow keys to increase or decrease the interpolation ratio, to see what happens. We start with three points, which gives us two lines. Linear interpolation over those lines gives us two points, between which we can again perform linear interpolation, yielding a single point. And that point —and all points we can form in this way for all ratios taken together— form our Bézier curve: diff --git a/docs/chapters/whatis/content.ja-JP.md b/docs/chapters/whatis/content.ja-JP.md index 922e3bc2..d8814c7e 100644 --- a/docs/chapters/whatis/content.ja-JP.md +++ b/docs/chapters/whatis/content.ja-JP.md @@ -9,12 +9,12 @@ \[ \left ( \begin{aligned} - p_1 &= 一方の点 \\ - p_2 &= もう一方の点 \\ - 距離 &= (p_2 - p_1) \\ - 比率 &= \frac{百分率}{100} \\ + p_1 &= \textit{一方の点} \\ + p_2 &= \textit{もう一方の点} \\ + \textit{距離} &= (p_2 - p_1) \\ + \textit{比率} &= \frac{\textit{百分率}}{100} \\ \end{aligned} -\right )のとき、新しい点 = p_1 + 距離 \cdot 比率 +\right ) \textit{のとき、新しい点} = p_1 + \textit{距離} \cdot \textit{比率} \] では、実際に見てみましょう。下の図はインタラクティブになっています。上下キーで補間の比率が増減しますので、どうなるか確かめてみましょう。最初に3点があり、それを結んで2本の直線が引かれています。この直線の上でそれぞれ線形補間を行うと、2つの点が得られます。この2点の間でさらに線形補間を行うと、1つの点を得ることができます。そして、あらゆる比率に対して同様に点を求め、それをすべて集めると、このようにベジエ曲線ができるのです。 diff --git a/docs/chapters/whatis/content.ru-RU.md b/docs/chapters/whatis/content.ru-RU.md index 0cc67eb6..e8a79566 100644 --- a/docs/chapters/whatis/content.ru-RU.md +++ b/docs/chapters/whatis/content.ru-RU.md @@ -7,17 +7,17 @@ Вот, скажем, зная расстояние между двух точек и желая поставить третью на удалении 20ти % этого расстояния до первой и, соответственно, 80ти % до второй, вычислить результат можно следующим образом: \[ -Дано \left ( +\textit{Дано} \left ( \begin{aligned} - p_1 &= неикая~точка \\ - p_2 &= неикая~другая~точка \\ - расстояние &= (p_2 - p_1) \\ - соотношение &= \frac{процентаж}{100} \\ + p_1 &= \textit{неикая точка} \\ + p_2 &= \textit{неикая другая точка} \\ + \textit{расстояние} &= (p_2 - p_1) \\ + \textit{соотношение} &= \frac{\textit{процентаж}}{100} \\ \end{aligned} -\right ),~наша~новая~точка = p_1 + расстояние \cdot соотношение +\right ),~\textit{наша новая точка} = p_1 + \textit{расстояние} \cdot \textit{соотношение} \] -Что же, посмотрим на это в действии: ниже представлена интерактивная проекция, кликнув на ползунок, можно пользоваться клавишами вниз-вверх для увеличения и уменьшения соотношения интерполяции и наблюдать получаемый результат. Сначала, основываясь на трех точках, задаем два отрезка, затем производим линейную интерполяцию по длине каждого из них, получая еще две точки. Далее мы опять производим линейную интерполяцию уже между полученными точками и в итоге получаем искомую точку. (* на изображении видим 3 проекции соответственно этим трем действиям). +Что же, посмотрим на это в действии: ниже представлена интерактивная проекция, кликнув на ползунок, можно пользоваться клавишами вниз-вверх для увеличения и уменьшения соотношения интерполяции и наблюдать получаемый результат. Сначала, основываясь на трех точках, задаем два отрезка, затем производим линейную интерполяцию по длине каждого из них, получая еще две точки. Далее мы опять производим линейную интерполяцию уже между полученными точками и в итоге получаем искомую точку. (* на изображении видим 3 проекции соответственно этим трем действиям). diff --git a/docs/chapters/whatis/content.zh-CN.md b/docs/chapters/whatis/content.zh-CN.md index 5f618bf8..e1001a4d 100644 --- a/docs/chapters/whatis/content.zh-CN.md +++ b/docs/chapters/whatis/content.zh-CN.md @@ -7,14 +7,14 @@ 如果我们知道两点之间的距离,并想找出离第一个点20%间距的一个新的点(也就是离第二个点80%的间距),我们可以通过简单的计算来得到: \[ -Given \left ( +\textit{Given} \left ( \begin{aligned} - p_1 &= some~point \\ - p_2 &= some~other~point \\ - distance &= (p_2 - p_1) \\ - ratio &= \frac{percentage}{100} \\ + p_1 &= \textit{some point} \\ + p_2 &= \textit{some other point} \\ + \textit{distance} &= (p_2 - p_1) \\ + \textit{ratio} &= \frac{\textit{percentage}}{100} \\ \end{aligned} -\right ),~our~new~point = p_1 + distance \cdot ratio +\right ),~\textit{our new point} = p_1 + \textit{distance} \cdot \textit{ratio} \] 让我们来通过实际操作看一下:下面的图形都是可交互的,因此你可以通过上下键来增加或减少插值距离,来观察图形的变化。我们从三个点构成的两条线段开始。通过对各条线段进行线性插值得到两个点,对点之间的线段再进行线性插值,产生一个新的点。最终这些点——所有的点都可以通过选取不同的距离插值产生——构成了贝塞尔曲线 diff --git a/docs/chapters/yforx/content.en-GB.md b/docs/chapters/yforx/content.en-GB.md index facc6fe8..57fe0849 100644 --- a/docs/chapters/yforx/content.en-GB.md +++ b/docs/chapters/yforx/content.en-GB.md @@ -13,19 +13,19 @@ Now, if you look more closely at that right graphic, you'll notice something int First, let's look at the function for x(t): \[ - x(t) = a(1-t)³ + 3b(1-t)²t + 3c(1-t)t² + dt³ + x(t) = a(1-t)^3 + 3b(1-t)^2t + 3c(1-t)t^2 + dt^3 \] We can rewrite this to a plain polynomial form, by just fully writing out the expansion and then collecting the polynomial factors, as: \[ - x(t) = (-a + 3b- 3c + d)t³ + (3a - 6b + 3c)t² + (-3a + 3b)t + a + x(t) = (-a + 3b- 3c + d)t^3 + (3a - 6b + 3c)t^2 + (-3a + 3b)t + a \] Nothing special here: that's a standard cubic polynomial in "power" form (i.e. all the terms are ordered by their power of `t`). So, given that `a`, `b`, `c`, `d`, *and* `x(t)` are all known constants, we can trivially rewrite this (by moving the `x(t)` across the equal sign) as: \[ - (-a + 3b - 3c + d)t³ + (3a - 6b + 3c)t² + (-3a + 3b)t + (a-x) = 0 + (-a + 3b - 3c + d)t^3 + (3a - 6b + 3c)t^2 + (-3a + 3b)t + (a-x) = 0 \] You might be wondering "where did all the other 'minus x' for all the other values a, b, c, and d go?" and the answer there is that they all cancel out, so the only one we actually need to subtract is the one at the end. Handy! So now we just solve this equation using Cardano's algorithm, and we're left with some rather short code: diff --git a/docs/images/chapters/abc/131454dcbac04e567f322979f4af80c6.svg b/docs/images/chapters/abc/131454dcbac04e567f322979f4af80c6.svg new file mode 100644 index 00000000..7b6adeb2 --- /dev/null +++ b/docs/images/chapters/abc/131454dcbac04e567f322979f4af80c6.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/abc/50543216f39c1b10af7cf4823844dd31.svg b/docs/images/chapters/abc/50543216f39c1b10af7cf4823844dd31.svg deleted file mode 100644 index 987ba4f5..00000000 --- a/docs/images/chapters/abc/50543216f39c1b10af7cf4823844dd31.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/abc/51a9d0588be822a5c80ea38f7d348641.svg b/docs/images/chapters/abc/51a9d0588be822a5c80ea38f7d348641.svg new file mode 100644 index 00000000..72e70bd5 --- /dev/null +++ b/docs/images/chapters/abc/51a9d0588be822a5c80ea38f7d348641.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/abc/5924e162b50272c40c842fad14b8fa48.svg b/docs/images/chapters/abc/5924e162b50272c40c842fad14b8fa48.svg new file mode 100644 index 00000000..0dd87466 --- /dev/null +++ b/docs/images/chapters/abc/5924e162b50272c40c842fad14b8fa48.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/abc/634d373310711268cc188f45e5699d8d.svg b/docs/images/chapters/abc/634d373310711268cc188f45e5699d8d.svg new file mode 100644 index 00000000..09ed54ab --- /dev/null +++ b/docs/images/chapters/abc/634d373310711268cc188f45e5699d8d.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/abc/6a65a8327c06bc6f14cc4e0751d8e49e.svg b/docs/images/chapters/abc/6a65a8327c06bc6f14cc4e0751d8e49e.svg deleted file mode 100644 index 74393c28..00000000 --- a/docs/images/chapters/abc/6a65a8327c06bc6f14cc4e0751d8e49e.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/abc/8c6662f605722fb2ff6cd7f65243a126.svg b/docs/images/chapters/abc/8c6662f605722fb2ff6cd7f65243a126.svg new file mode 100644 index 00000000..29461f1e --- /dev/null +++ b/docs/images/chapters/abc/8c6662f605722fb2ff6cd7f65243a126.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/abc/8cd992c1ceaae2e67695285beef23a24.svg b/docs/images/chapters/abc/8cd992c1ceaae2e67695285beef23a24.svg new file mode 100644 index 00000000..9e198f4f --- /dev/null +++ b/docs/images/chapters/abc/8cd992c1ceaae2e67695285beef23a24.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/abc/8e7cfee39c98f2ddf9b635a914066cf6.svg b/docs/images/chapters/abc/8e7cfee39c98f2ddf9b635a914066cf6.svg new file mode 100644 index 00000000..20ff40d4 --- /dev/null +++ b/docs/images/chapters/abc/8e7cfee39c98f2ddf9b635a914066cf6.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/abc/a0b99054cc82ca1fb147f077e175ef10.svg b/docs/images/chapters/abc/a0b99054cc82ca1fb147f077e175ef10.svg new file mode 100644 index 00000000..b5c36016 --- /dev/null +++ b/docs/images/chapters/abc/a0b99054cc82ca1fb147f077e175ef10.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/abc/b9854fbcb1096f736607d292dbe48371.svg b/docs/images/chapters/abc/b9854fbcb1096f736607d292dbe48371.svg deleted file mode 100644 index b1b10de4..00000000 --- a/docs/images/chapters/abc/b9854fbcb1096f736607d292dbe48371.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/abc/bb8674f5f36b054b7734e34b91ed924f.svg b/docs/images/chapters/abc/bb8674f5f36b054b7734e34b91ed924f.svg deleted file mode 100644 index f2e31787..00000000 --- a/docs/images/chapters/abc/bb8674f5f36b054b7734e34b91ed924f.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/abc/c018aab3952ea9193848564aab12b241.svg b/docs/images/chapters/abc/c018aab3952ea9193848564aab12b241.svg deleted file mode 100644 index a07bd242..00000000 --- a/docs/images/chapters/abc/c018aab3952ea9193848564aab12b241.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/abc/c10cf18edeffed67dc94d250310db475.svg b/docs/images/chapters/abc/c10cf18edeffed67dc94d250310db475.svg deleted file mode 100644 index ef28accf..00000000 --- a/docs/images/chapters/abc/c10cf18edeffed67dc94d250310db475.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/abc/c14d8ce6eccca2c8063af40e5ac0bfd4.svg b/docs/images/chapters/abc/c14d8ce6eccca2c8063af40e5ac0bfd4.svg deleted file mode 100644 index c92d0726..00000000 --- a/docs/images/chapters/abc/c14d8ce6eccca2c8063af40e5ac0bfd4.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/abc/f78ce50f725f208f25090abc7fd741b7.svg b/docs/images/chapters/abc/f78ce50f725f208f25090abc7fd741b7.svg deleted file mode 100644 index 0b65462e..00000000 --- a/docs/images/chapters/abc/f78ce50f725f208f25090abc7fd741b7.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/arclength/2f80643c66d8f1448b13537a7b24eb45.svg b/docs/images/chapters/arclength/2f80643c66d8f1448b13537a7b24eb45.svg deleted file mode 100644 index 1ac2d5e3..00000000 --- a/docs/images/chapters/arclength/2f80643c66d8f1448b13537a7b24eb45.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/arclength/56533f47e73ad9fea08fa9bb3f597d49.png b/docs/images/chapters/arclength/56533f47e73ad9fea08fa9bb3f597d49.png index 4cc00cf3..97953e45 100644 Binary files a/docs/images/chapters/arclength/56533f47e73ad9fea08fa9bb3f597d49.png and b/docs/images/chapters/arclength/56533f47e73ad9fea08fa9bb3f597d49.png differ diff --git a/docs/images/chapters/arclength/5ce02cbdbc47585c588f2656d5161a32.png b/docs/images/chapters/arclength/5ce02cbdbc47585c588f2656d5161a32.png index 6372e0a1..98e4894a 100644 Binary files a/docs/images/chapters/arclength/5ce02cbdbc47585c588f2656d5161a32.png and b/docs/images/chapters/arclength/5ce02cbdbc47585c588f2656d5161a32.png differ diff --git a/docs/images/chapters/arclength/85620f0332fcf16f56c580794fd094c5.svg b/docs/images/chapters/arclength/85620f0332fcf16f56c580794fd094c5.svg new file mode 100644 index 00000000..bdeddfa9 --- /dev/null +++ b/docs/images/chapters/arclength/85620f0332fcf16f56c580794fd094c5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/arclength/b76753476ad6ecfe4b8f39bcf9432980.svg b/docs/images/chapters/arclength/b76753476ad6ecfe4b8f39bcf9432980.svg new file mode 100644 index 00000000..a9dd18c8 --- /dev/null +++ b/docs/images/chapters/arclength/b76753476ad6ecfe4b8f39bcf9432980.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/arclength/f251e86158649c0e57f7a772ebff83b4.svg b/docs/images/chapters/arclength/f251e86158649c0e57f7a772ebff83b4.svg deleted file mode 100644 index 675d15f5..00000000 --- a/docs/images/chapters/arclength/f251e86158649c0e57f7a772ebff83b4.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/arclength/fe2663b205d14c157a5a02bfbbd55987.png b/docs/images/chapters/arclength/fe2663b205d14c157a5a02bfbbd55987.png index d19b73bc..6cd4b182 100644 Binary files a/docs/images/chapters/arclength/fe2663b205d14c157a5a02bfbbd55987.png and b/docs/images/chapters/arclength/fe2663b205d14c157a5a02bfbbd55987.png differ diff --git a/docs/images/chapters/bsplines/2421f47aa4fe1c0d830d53b2e6563c04.svg b/docs/images/chapters/bsplines/2421f47aa4fe1c0d830d53b2e6563c04.svg new file mode 100644 index 00000000..9fc67edf --- /dev/null +++ b/docs/images/chapters/bsplines/2421f47aa4fe1c0d830d53b2e6563c04.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/bsplines/2514e1aa0565840e33fde0b146e3efe2.svg b/docs/images/chapters/bsplines/2514e1aa0565840e33fde0b146e3efe2.svg new file mode 100644 index 00000000..b7b968bd --- /dev/null +++ b/docs/images/chapters/bsplines/2514e1aa0565840e33fde0b146e3efe2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/bsplines/49af474c33ce0ee0733626ea3d988570.svg b/docs/images/chapters/bsplines/49af474c33ce0ee0733626ea3d988570.svg new file mode 100644 index 00000000..bde14b0f --- /dev/null +++ b/docs/images/chapters/bsplines/49af474c33ce0ee0733626ea3d988570.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/bsplines/a88566be442b67fb71f727de6bdb66df.svg b/docs/images/chapters/bsplines/a88566be442b67fb71f727de6bdb66df.svg deleted file mode 100644 index b6ae592a..00000000 --- a/docs/images/chapters/bsplines/a88566be442b67fb71f727de6bdb66df.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/bsplines/c7af721e5e201fc3742bce67ff6cd560.svg b/docs/images/chapters/bsplines/c7af721e5e201fc3742bce67ff6cd560.svg deleted file mode 100644 index 318ec473..00000000 --- a/docs/images/chapters/bsplines/c7af721e5e201fc3742bce67ff6cd560.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/bsplines/cbdf5a61de10eeb6f23be077cf047ab5.svg b/docs/images/chapters/bsplines/cbdf5a61de10eeb6f23be077cf047ab5.svg deleted file mode 100644 index 8f58bdba..00000000 --- a/docs/images/chapters/bsplines/cbdf5a61de10eeb6f23be077cf047ab5.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/bsplines/e62558cdfd8abaf22511e8e68c7afb4a.svg b/docs/images/chapters/bsplines/e62558cdfd8abaf22511e8e68c7afb4a.svg new file mode 100644 index 00000000..7162095c --- /dev/null +++ b/docs/images/chapters/bsplines/e62558cdfd8abaf22511e8e68c7afb4a.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/bsplines/ee203de6e554936588eb93adead0a3e5.svg b/docs/images/chapters/bsplines/ee203de6e554936588eb93adead0a3e5.svg deleted file mode 100644 index c25e7948..00000000 --- a/docs/images/chapters/bsplines/ee203de6e554936588eb93adead0a3e5.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/canonical/e61fd49e554a0ffc7d64893c75cd376d.svg b/docs/images/chapters/canonical/e61fd49e554a0ffc7d64893c75cd376d.svg deleted file mode 100644 index 31325d78..00000000 --- a/docs/images/chapters/canonical/e61fd49e554a0ffc7d64893c75cd376d.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/canonical/fff37fa4275e43302f71cf052417a19f.svg b/docs/images/chapters/canonical/fff37fa4275e43302f71cf052417a19f.svg new file mode 100644 index 00000000..d8b2ab16 --- /dev/null +++ b/docs/images/chapters/canonical/fff37fa4275e43302f71cf052417a19f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/00357d2a2168fe313cd0b38d95a1a681.svg b/docs/images/chapters/catmullconv/00357d2a2168fe313cd0b38d95a1a681.svg deleted file mode 100644 index bb3f7d82..00000000 --- a/docs/images/chapters/catmullconv/00357d2a2168fe313cd0b38d95a1a681.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/012a8ab7a4de935c1c8d61dcd14fc62c.svg b/docs/images/chapters/catmullconv/012a8ab7a4de935c1c8d61dcd14fc62c.svg new file mode 100644 index 00000000..ea170f65 --- /dev/null +++ b/docs/images/chapters/catmullconv/012a8ab7a4de935c1c8d61dcd14fc62c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/032409c03915a6ba75864e1dceae416d.svg b/docs/images/chapters/catmullconv/032409c03915a6ba75864e1dceae416d.svg new file mode 100644 index 00000000..baa32fa7 --- /dev/null +++ b/docs/images/chapters/catmullconv/032409c03915a6ba75864e1dceae416d.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/1f9fc156aeed9eb092573cd7446593d9.svg b/docs/images/chapters/catmullconv/1f9fc156aeed9eb092573cd7446593d9.svg deleted file mode 100644 index d880b477..00000000 --- a/docs/images/chapters/catmullconv/1f9fc156aeed9eb092573cd7446593d9.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/c1f8861583b4176a9b607aa6a05f9356.svg b/docs/images/chapters/catmullconv/389a1ea8c9e92df9a2b38718e34bae7b.svg similarity index 100% rename from docs/images/chapters/catmullconv/c1f8861583b4176a9b607aa6a05f9356.svg rename to docs/images/chapters/catmullconv/389a1ea8c9e92df9a2b38718e34bae7b.svg diff --git a/docs/images/chapters/catmullconv/639ca0b74a805c3aebac79b181eac908.svg b/docs/images/chapters/catmullconv/639ca0b74a805c3aebac79b181eac908.svg new file mode 100644 index 00000000..0dd27f6b --- /dev/null +++ b/docs/images/chapters/catmullconv/639ca0b74a805c3aebac79b181eac908.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/8a2a00812363fe1a6cfa7f81b48d31d1.svg b/docs/images/chapters/catmullconv/8a2a00812363fe1a6cfa7f81b48d31d1.svg deleted file mode 100644 index aa26f769..00000000 --- a/docs/images/chapters/catmullconv/8a2a00812363fe1a6cfa7f81b48d31d1.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/8d3a5ca7188f53b914229133b3dbe5fe.svg b/docs/images/chapters/catmullconv/8d3a5ca7188f53b914229133b3dbe5fe.svg deleted file mode 100644 index d880b477..00000000 --- a/docs/images/chapters/catmullconv/8d3a5ca7188f53b914229133b3dbe5fe.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/902c290a790b4d44d10236f4a1456cdc.svg b/docs/images/chapters/catmullconv/902c290a790b4d44d10236f4a1456cdc.svg new file mode 100644 index 00000000..c0395cce --- /dev/null +++ b/docs/images/chapters/catmullconv/902c290a790b4d44d10236f4a1456cdc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/9593c057c84ebf9beb70fd57a11c7e12.svg b/docs/images/chapters/catmullconv/9593c057c84ebf9beb70fd57a11c7e12.svg deleted file mode 100644 index 7c783bfd..00000000 --- a/docs/images/chapters/catmullconv/9593c057c84ebf9beb70fd57a11c7e12.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/98ddf6415bd9827a6d899b21d0a5f736.svg b/docs/images/chapters/catmullconv/98ddf6415bd9827a6d899b21d0a5f736.svg new file mode 100644 index 00000000..c0395cce --- /dev/null +++ b/docs/images/chapters/catmullconv/98ddf6415bd9827a6d899b21d0a5f736.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/9ae99b090883023a485be7be098858e9.svg b/docs/images/chapters/catmullconv/9ae99b090883023a485be7be098858e9.svg new file mode 100644 index 00000000..27050200 --- /dev/null +++ b/docs/images/chapters/catmullconv/9ae99b090883023a485be7be098858e9.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/a323848e706c473833cda0b02bc220ef.svg b/docs/images/chapters/catmullconv/a323848e706c473833cda0b02bc220ef.svg new file mode 100644 index 00000000..89f8397d --- /dev/null +++ b/docs/images/chapters/catmullconv/a323848e706c473833cda0b02bc220ef.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/c0e30b49fbfce6f6b3c81eaa6ca5154f.svg b/docs/images/chapters/catmullconv/c0e30b49fbfce6f6b3c81eaa6ca5154f.svg deleted file mode 100644 index f4f9bc9b..00000000 --- a/docs/images/chapters/catmullconv/c0e30b49fbfce6f6b3c81eaa6ca5154f.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/d09e7466c267614c89ead28d6a900ba1.svg b/docs/images/chapters/catmullconv/d09e7466c267614c89ead28d6a900ba1.svg deleted file mode 100644 index 0d73182c..00000000 --- a/docs/images/chapters/catmullconv/d09e7466c267614c89ead28d6a900ba1.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/defc6fa4b51fa3c1945d15449f0f392d.svg b/docs/images/chapters/catmullconv/defc6fa4b51fa3c1945d15449f0f392d.svg deleted file mode 100644 index 2ae488c9..00000000 --- a/docs/images/chapters/catmullconv/defc6fa4b51fa3c1945d15449f0f392d.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/catmullconv/e653724c11600cbf682f1c809c8c6508.svg b/docs/images/chapters/catmullconv/e653724c11600cbf682f1c809c8c6508.svg new file mode 100644 index 00000000..232e2a0c --- /dev/null +++ b/docs/images/chapters/catmullconv/e653724c11600cbf682f1c809c8c6508.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/circleintersection/2f42c862a0a9d0764727d42b16cf68a0.svg b/docs/images/chapters/circleintersection/2f42c862a0a9d0764727d42b16cf68a0.svg new file mode 100644 index 00000000..2699a596 --- /dev/null +++ b/docs/images/chapters/circleintersection/2f42c862a0a9d0764727d42b16cf68a0.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/circleintersection/373248ec6a579bacf6c6a317e6db597a.svg b/docs/images/chapters/circleintersection/373248ec6a579bacf6c6a317e6db597a.svg new file mode 100644 index 00000000..1c3dac4f --- /dev/null +++ b/docs/images/chapters/circleintersection/373248ec6a579bacf6c6a317e6db597a.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/circleintersection/3e0594855ca99fb87dcc65a693e1ad22.svg b/docs/images/chapters/circleintersection/3e0594855ca99fb87dcc65a693e1ad22.svg deleted file mode 100644 index f916f7ea..00000000 --- a/docs/images/chapters/circleintersection/3e0594855ca99fb87dcc65a693e1ad22.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/circleintersection/674c42035da16a426ef7fe23277eea11.svg b/docs/images/chapters/circleintersection/674c42035da16a426ef7fe23277eea11.svg deleted file mode 100644 index 57b7c20c..00000000 --- a/docs/images/chapters/circleintersection/674c42035da16a426ef7fe23277eea11.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/circles_cubic/065efe85cac2f359ea4d5d4bae94da97.svg b/docs/images/chapters/circles_cubic/065efe85cac2f359ea4d5d4bae94da97.svg new file mode 100644 index 00000000..0eb401c9 --- /dev/null +++ b/docs/images/chapters/circles_cubic/065efe85cac2f359ea4d5d4bae94da97.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/circles_cubic/329dc34299d2fdb3c5f17828e3a23da0.svg b/docs/images/chapters/circles_cubic/329dc34299d2fdb3c5f17828e3a23da0.svg deleted file mode 100644 index 7b252622..00000000 --- a/docs/images/chapters/circles_cubic/329dc34299d2fdb3c5f17828e3a23da0.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/circles_cubic/38b58b3c759b9bf340a3cf3de8bc599e.svg b/docs/images/chapters/circles_cubic/38b58b3c759b9bf340a3cf3de8bc599e.svg deleted file mode 100644 index 12aa5b8a..00000000 --- a/docs/images/chapters/circles_cubic/38b58b3c759b9bf340a3cf3de8bc599e.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/circles_cubic/496c0ee8945080a32bc02f78bc83ad43.svg b/docs/images/chapters/circles_cubic/496c0ee8945080a32bc02f78bc83ad43.svg new file mode 100644 index 00000000..c6bc08b5 --- /dev/null +++ b/docs/images/chapters/circles_cubic/496c0ee8945080a32bc02f78bc83ad43.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/circles_cubic/750e2c874fb58237608ebade1589fccc.svg b/docs/images/chapters/circles_cubic/750e2c874fb58237608ebade1589fccc.svg deleted file mode 100644 index 8ebfa042..00000000 --- a/docs/images/chapters/circles_cubic/750e2c874fb58237608ebade1589fccc.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/circles_cubic/c509dc6fecd7992cb45a0b4d8f1bd001.svg b/docs/images/chapters/circles_cubic/c509dc6fecd7992cb45a0b4d8f1bd001.svg new file mode 100644 index 00000000..d9bc14e1 --- /dev/null +++ b/docs/images/chapters/circles_cubic/c509dc6fecd7992cb45a0b4d8f1bd001.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/control/1b8c5e574dc67bfb0afc3fb0a8727378.png b/docs/images/chapters/control/1b8c5e574dc67bfb0afc3fb0a8727378.png index 39aaa2f1..7bc49082 100644 Binary files a/docs/images/chapters/control/1b8c5e574dc67bfb0afc3fb0a8727378.png and b/docs/images/chapters/control/1b8c5e574dc67bfb0afc3fb0a8727378.png differ diff --git a/docs/images/chapters/control/4b206c16ccf8a06a0834fe9e5254560c.png b/docs/images/chapters/control/4b206c16ccf8a06a0834fe9e5254560c.png deleted file mode 100644 index fc16b535..00000000 Binary files a/docs/images/chapters/control/4b206c16ccf8a06a0834fe9e5254560c.png and /dev/null differ diff --git a/docs/images/chapters/control/501494295f07ba5049286489206d98f0.svg b/docs/images/chapters/control/501494295f07ba5049286489206d98f0.svg deleted file mode 100644 index 7b88284c..00000000 --- a/docs/images/chapters/control/501494295f07ba5049286489206d98f0.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/control/9df7dc66b51db8e3046e1f359874c38e.svg b/docs/images/chapters/control/80cdfeab6ed6038f0e550ef5c1dcb7dd.svg similarity index 100% rename from docs/images/chapters/control/9df7dc66b51db8e3046e1f359874c38e.svg rename to docs/images/chapters/control/80cdfeab6ed6038f0e550ef5c1dcb7dd.svg diff --git a/docs/images/chapters/control/8332e5d34b7344bbee2a2e1f4521ce46.png b/docs/images/chapters/control/8332e5d34b7344bbee2a2e1f4521ce46.png index 29e2128f..8fa2d8b5 100644 Binary files a/docs/images/chapters/control/8332e5d34b7344bbee2a2e1f4521ce46.png and b/docs/images/chapters/control/8332e5d34b7344bbee2a2e1f4521ce46.png differ diff --git a/docs/images/chapters/control/a337e3f97387b52d387fc01605314497.svg b/docs/images/chapters/control/a337e3f97387b52d387fc01605314497.svg new file mode 100644 index 00000000..2f8262c6 --- /dev/null +++ b/docs/images/chapters/control/a337e3f97387b52d387fc01605314497.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/control/b58fb122c5c8159938182c185f287142.svg b/docs/images/chapters/control/b58fb122c5c8159938182c185f287142.svg deleted file mode 100644 index 78e2414a..00000000 --- a/docs/images/chapters/control/b58fb122c5c8159938182c185f287142.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/control/be82cd31c4892a8f0582b1b5285231d9.png b/docs/images/chapters/control/be82cd31c4892a8f0582b1b5285231d9.png deleted file mode 100644 index 5cfe86ff..00000000 Binary files a/docs/images/chapters/control/be82cd31c4892a8f0582b1b5285231d9.png and /dev/null differ diff --git a/docs/images/chapters/control/c26d2655e8741ef7e2eeb4f6554fc7a5.png b/docs/images/chapters/control/c26d2655e8741ef7e2eeb4f6554fc7a5.png index 9894b8c7..6359f53a 100644 Binary files a/docs/images/chapters/control/c26d2655e8741ef7e2eeb4f6554fc7a5.png and b/docs/images/chapters/control/c26d2655e8741ef7e2eeb4f6554fc7a5.png differ diff --git a/docs/images/chapters/control/c2f2fe0ef5d0089d9dd8e5e3999405cb.svg b/docs/images/chapters/control/c2f2fe0ef5d0089d9dd8e5e3999405cb.svg new file mode 100644 index 00000000..3e42bd91 --- /dev/null +++ b/docs/images/chapters/control/c2f2fe0ef5d0089d9dd8e5e3999405cb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/control/f700cd59e6021b0e06b819105ec931da.png b/docs/images/chapters/control/f700cd59e6021b0e06b819105ec931da.png deleted file mode 100644 index 4659b5a2..00000000 Binary files a/docs/images/chapters/control/f700cd59e6021b0e06b819105ec931da.png and /dev/null differ diff --git a/docs/images/chapters/curvefitting/06605e008956609e8844ef95697c9096.svg b/docs/images/chapters/curvefitting/06605e008956609e8844ef95697c9096.svg deleted file mode 100644 index 0e69dda5..00000000 --- a/docs/images/chapters/curvefitting/06605e008956609e8844ef95697c9096.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/curvefitting/940455f4016ab1be6d46c6f176fd2f76.svg b/docs/images/chapters/curvefitting/097aa1948b6cdbf9dc7579643a7af246.svg similarity index 100% rename from docs/images/chapters/curvefitting/940455f4016ab1be6d46c6f176fd2f76.svg rename to docs/images/chapters/curvefitting/097aa1948b6cdbf9dc7579643a7af246.svg diff --git a/docs/images/chapters/curvefitting/134baa1043d0849f31a1943d6d5bc607.svg b/docs/images/chapters/curvefitting/134baa1043d0849f31a1943d6d5bc607.svg new file mode 100644 index 00000000..89d9ceb4 --- /dev/null +++ b/docs/images/chapters/curvefitting/134baa1043d0849f31a1943d6d5bc607.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/curvefitting/17d5fbeffcdcceca98cdba537295d258.svg b/docs/images/chapters/curvefitting/17d5fbeffcdcceca98cdba537295d258.svg new file mode 100644 index 00000000..e9fac0fe --- /dev/null +++ b/docs/images/chapters/curvefitting/17d5fbeffcdcceca98cdba537295d258.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/curvefitting/31d659cbc72bf304abf4c9a75b6b81de.svg b/docs/images/chapters/curvefitting/31d659cbc72bf304abf4c9a75b6b81de.svg deleted file mode 100644 index 869937f0..00000000 --- a/docs/images/chapters/curvefitting/31d659cbc72bf304abf4c9a75b6b81de.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/curvefitting/409d10c3005b0c93489d72a5dba692d7.svg b/docs/images/chapters/curvefitting/409d10c3005b0c93489d72a5dba692d7.svg deleted file mode 100644 index 7397a05a..00000000 --- a/docs/images/chapters/curvefitting/409d10c3005b0c93489d72a5dba692d7.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/curvefitting/4e6e20c823c8cc72e0cc00e4ab5b7556.svg b/docs/images/chapters/curvefitting/4e6e20c823c8cc72e0cc00e4ab5b7556.svg new file mode 100644 index 00000000..10be2fd5 --- /dev/null +++ b/docs/images/chapters/curvefitting/4e6e20c823c8cc72e0cc00e4ab5b7556.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/curvefitting/505ab1ada6a187e9ba392d19739ac2c5.svg b/docs/images/chapters/curvefitting/505ab1ada6a187e9ba392d19739ac2c5.svg deleted file mode 100644 index 6b97b0a5..00000000 --- a/docs/images/chapters/curvefitting/505ab1ada6a187e9ba392d19739ac2c5.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/curvefitting/7c6b50cee5dc685515943a199d7a65fc.svg b/docs/images/chapters/curvefitting/8928f757abd1376abdc4069e1aa774f2.svg similarity index 63% rename from docs/images/chapters/curvefitting/7c6b50cee5dc685515943a199d7a65fc.svg rename to docs/images/chapters/curvefitting/8928f757abd1376abdc4069e1aa774f2.svg index 87002d07..838a5828 100644 --- a/docs/images/chapters/curvefitting/7c6b50cee5dc685515943a199d7a65fc.svg +++ b/docs/images/chapters/curvefitting/8928f757abd1376abdc4069e1aa774f2.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/docs/images/chapters/curvefitting/8a66af7570bac674966f6316820ea31b.svg b/docs/images/chapters/curvefitting/8a66af7570bac674966f6316820ea31b.svg new file mode 100644 index 00000000..406ce39f --- /dev/null +++ b/docs/images/chapters/curvefitting/8a66af7570bac674966f6316820ea31b.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/curvefitting/9651a687e1522b00bcba063881230902.svg b/docs/images/chapters/curvefitting/9651a687e1522b00bcba063881230902.svg deleted file mode 100644 index 98588d0c..00000000 --- a/docs/images/chapters/curvefitting/9651a687e1522b00bcba063881230902.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/curvefitting/a6faaf6083c818431988fef49421cc47.svg b/docs/images/chapters/curvefitting/a6faaf6083c818431988fef49421cc47.svg deleted file mode 100644 index e618c6a9..00000000 --- a/docs/images/chapters/curvefitting/a6faaf6083c818431988fef49421cc47.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/curvefitting/464dbfb5adb6233108053dfac6fa4fe5.svg b/docs/images/chapters/curvefitting/d39ca235454ced9681b523be056864d2.svg similarity index 100% rename from docs/images/chapters/curvefitting/464dbfb5adb6233108053dfac6fa4fe5.svg rename to docs/images/chapters/curvefitting/d39ca235454ced9681b523be056864d2.svg diff --git a/docs/images/chapters/curvefitting/dd303afb51d580fb2bf1b914c010f83d.svg b/docs/images/chapters/curvefitting/dd303afb51d580fb2bf1b914c010f83d.svg new file mode 100644 index 00000000..f10573ec --- /dev/null +++ b/docs/images/chapters/curvefitting/dd303afb51d580fb2bf1b914c010f83d.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/curvefitting/ff701138fd7a6e35700a2e1ee3e9c020.svg b/docs/images/chapters/curvefitting/ff701138fd7a6e35700a2e1ee3e9c020.svg new file mode 100644 index 00000000..86025bd5 --- /dev/null +++ b/docs/images/chapters/curvefitting/ff701138fd7a6e35700a2e1ee3e9c020.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/curveintersection/0a865d627f82a72444b9edce61be6f09.png b/docs/images/chapters/curveintersection/0a865d627f82a72444b9edce61be6f09.png deleted file mode 100644 index b7f3b5e0..00000000 Binary files a/docs/images/chapters/curveintersection/0a865d627f82a72444b9edce61be6f09.png and /dev/null differ diff --git a/docs/images/chapters/curveintersection/75661040b6b7b247def5edd5f0996cdb.png b/docs/images/chapters/curveintersection/75661040b6b7b247def5edd5f0996cdb.png deleted file mode 100644 index 1da34d5d..00000000 Binary files a/docs/images/chapters/curveintersection/75661040b6b7b247def5edd5f0996cdb.png and /dev/null differ diff --git a/docs/images/chapters/derivatives/897cfd8648720dc21463a9358cc65ab4.svg b/docs/images/chapters/derivatives/02cecadc92b8ff681edc8edb0ace53ce.svg similarity index 100% rename from docs/images/chapters/derivatives/897cfd8648720dc21463a9358cc65ab4.svg rename to docs/images/chapters/derivatives/02cecadc92b8ff681edc8edb0ace53ce.svg diff --git a/docs/images/chapters/derivatives/153d99ce571bd664945394a1203a9eba.svg b/docs/images/chapters/derivatives/153d99ce571bd664945394a1203a9eba.svg new file mode 100644 index 00000000..3e42bd91 --- /dev/null +++ b/docs/images/chapters/derivatives/153d99ce571bd664945394a1203a9eba.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/derivatives/171357d936dee742b43b9ffb7600c742.svg b/docs/images/chapters/derivatives/171357d936dee742b43b9ffb7600c742.svg new file mode 100644 index 00000000..76451738 --- /dev/null +++ b/docs/images/chapters/derivatives/171357d936dee742b43b9ffb7600c742.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/derivatives/2368534c6e964e6d4a54904cc99b8986.svg b/docs/images/chapters/derivatives/2368534c6e964e6d4a54904cc99b8986.svg new file mode 100644 index 00000000..52ec935d --- /dev/null +++ b/docs/images/chapters/derivatives/2368534c6e964e6d4a54904cc99b8986.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/derivatives/2fc50617b6886534d1ab4638ed8a24ac.svg b/docs/images/chapters/derivatives/2fc50617b6886534d1ab4638ed8a24ac.svg deleted file mode 100644 index 10a2db42..00000000 --- a/docs/images/chapters/derivatives/2fc50617b6886534d1ab4638ed8a24ac.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/derivatives/3cd7b36839a248eb35f0b678d7bf5508.svg b/docs/images/chapters/derivatives/3cd7b36839a248eb35f0b678d7bf5508.svg new file mode 100644 index 00000000..2f8262c6 --- /dev/null +++ b/docs/images/chapters/derivatives/3cd7b36839a248eb35f0b678d7bf5508.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/derivatives/50616f9c922967c0c9c179af9b091947.svg b/docs/images/chapters/derivatives/4eeb75f5de2d13a39f894625d3222443.svg similarity index 59% rename from docs/images/chapters/derivatives/50616f9c922967c0c9c179af9b091947.svg rename to docs/images/chapters/derivatives/4eeb75f5de2d13a39f894625d3222443.svg index 9dfa27fa..e6f95782 100644 --- a/docs/images/chapters/derivatives/50616f9c922967c0c9c179af9b091947.svg +++ b/docs/images/chapters/derivatives/4eeb75f5de2d13a39f894625d3222443.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/docs/images/chapters/derivatives/501494295f07ba5049286489206d98f0.svg b/docs/images/chapters/derivatives/501494295f07ba5049286489206d98f0.svg deleted file mode 100644 index 7b88284c..00000000 --- a/docs/images/chapters/derivatives/501494295f07ba5049286489206d98f0.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/derivatives/a7c61e0e8b42010df6dab641c92ef13d.svg b/docs/images/chapters/derivatives/5d7af72e00fb0390af5281d918d77055.svg similarity index 100% rename from docs/images/chapters/derivatives/a7c61e0e8b42010df6dab641c92ef13d.svg rename to docs/images/chapters/derivatives/5d7af72e00fb0390af5281d918d77055.svg diff --git a/docs/images/chapters/derivatives/8324bf1885267fe157bf316e261d1b30.svg b/docs/images/chapters/derivatives/8324bf1885267fe157bf316e261d1b30.svg deleted file mode 100644 index f14eff34..00000000 --- a/docs/images/chapters/derivatives/8324bf1885267fe157bf316e261d1b30.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/derivatives/869b60a8e6b992e6f62bc6a50b36deeb.svg b/docs/images/chapters/derivatives/869b60a8e6b992e6f62bc6a50b36deeb.svg new file mode 100644 index 00000000..e3c04a42 --- /dev/null +++ b/docs/images/chapters/derivatives/869b60a8e6b992e6f62bc6a50b36deeb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/derivatives/67ca2710769505572e097ffb40de099f.svg b/docs/images/chapters/derivatives/8f78fdb9ef54b1bc4dbc00f07263cc97.svg similarity index 100% rename from docs/images/chapters/derivatives/67ca2710769505572e097ffb40de099f.svg rename to docs/images/chapters/derivatives/8f78fdb9ef54b1bc4dbc00f07263cc97.svg diff --git a/docs/images/chapters/derivatives/f67d2d379ba6dfaa7f7686a7d1eae367.svg b/docs/images/chapters/derivatives/a7b79877822a8f60e45552dcafc0815d.svg similarity index 100% rename from docs/images/chapters/derivatives/f67d2d379ba6dfaa7f7686a7d1eae367.svg rename to docs/images/chapters/derivatives/a7b79877822a8f60e45552dcafc0815d.svg diff --git a/docs/images/chapters/derivatives/b58fb122c5c8159938182c185f287142.svg b/docs/images/chapters/derivatives/b58fb122c5c8159938182c185f287142.svg deleted file mode 100644 index 78e2414a..00000000 --- a/docs/images/chapters/derivatives/b58fb122c5c8159938182c185f287142.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/derivatives/d575699ab7d13c62f47d3071c0b00da3.svg b/docs/images/chapters/derivatives/d575699ab7d13c62f47d3071c0b00da3.svg deleted file mode 100644 index ce4840f5..00000000 --- a/docs/images/chapters/derivatives/d575699ab7d13c62f47d3071c0b00da3.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/explanation/05c2d5954eb9dec5ce9f6eb7e89f1e0c.svg b/docs/images/chapters/explanation/05c2d5954eb9dec5ce9f6eb7e89f1e0c.svg deleted file mode 100644 index f82f95bc..00000000 --- a/docs/images/chapters/explanation/05c2d5954eb9dec5ce9f6eb7e89f1e0c.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/explanation/2493468e73b73f43eba8f66f0c189d1a.svg b/docs/images/chapters/explanation/2493468e73b73f43eba8f66f0c189d1a.svg deleted file mode 100644 index b20000a0..00000000 --- a/docs/images/chapters/explanation/2493468e73b73f43eba8f66f0c189d1a.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/explanation/b5977078d36d847fb299cbe3e7e2c3ba.svg b/docs/images/chapters/explanation/29695045f04fd06c75bfda7845121213.svg similarity index 100% rename from docs/images/chapters/explanation/b5977078d36d847fb299cbe3e7e2c3ba.svg rename to docs/images/chapters/explanation/29695045f04fd06c75bfda7845121213.svg diff --git a/docs/images/chapters/explanation/2c47081c2a9c20d2110f13daa482a3ab.svg b/docs/images/chapters/explanation/2c47081c2a9c20d2110f13daa482a3ab.svg deleted file mode 100644 index 68a70358..00000000 --- a/docs/images/chapters/explanation/2c47081c2a9c20d2110f13daa482a3ab.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/explanation/39330ef5591cf0f3205564ad47255d4f.svg b/docs/images/chapters/explanation/39330ef5591cf0f3205564ad47255d4f.svg new file mode 100644 index 00000000..cd21d6e7 --- /dev/null +++ b/docs/images/chapters/explanation/39330ef5591cf0f3205564ad47255d4f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/explanation/39d33ea94e7527ed221a809ca6054174.svg b/docs/images/chapters/explanation/39d33ea94e7527ed221a809ca6054174.svg new file mode 100644 index 00000000..d1e1f690 --- /dev/null +++ b/docs/images/chapters/explanation/39d33ea94e7527ed221a809ca6054174.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/explanation/4bf2d790d2f50bf7767c948e0b9f9822.svg b/docs/images/chapters/explanation/4bf2d790d2f50bf7767c948e0b9f9822.svg new file mode 100644 index 00000000..27a03dc9 --- /dev/null +++ b/docs/images/chapters/explanation/4bf2d790d2f50bf7767c948e0b9f9822.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/explanation/4def87a6683264d420f84562776f4b6c.svg b/docs/images/chapters/explanation/4def87a6683264d420f84562776f4b6c.svg new file mode 100644 index 00000000..ebd85186 --- /dev/null +++ b/docs/images/chapters/explanation/4def87a6683264d420f84562776f4b6c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/explanation/668d140df9db486e5ff2d7c127eaa9d4.svg b/docs/images/chapters/explanation/668d140df9db486e5ff2d7c127eaa9d4.svg new file mode 100644 index 00000000..f34d2313 --- /dev/null +++ b/docs/images/chapters/explanation/668d140df9db486e5ff2d7c127eaa9d4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/explanation/6aa5d4e20e83be1c95eaad792517dde9.svg b/docs/images/chapters/explanation/6aa5d4e20e83be1c95eaad792517dde9.svg deleted file mode 100644 index 9e38f941..00000000 --- a/docs/images/chapters/explanation/6aa5d4e20e83be1c95eaad792517dde9.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/explanation/6d58ec36bfb3fcff24248dc46889428a.svg b/docs/images/chapters/explanation/6d58ec36bfb3fcff24248dc46889428a.svg deleted file mode 100644 index ed6c08d3..00000000 --- a/docs/images/chapters/explanation/6d58ec36bfb3fcff24248dc46889428a.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/explanation/7a44f3eaa167a5022e2281c62e90fff8.svg b/docs/images/chapters/explanation/7a44f3eaa167a5022e2281c62e90fff8.svg new file mode 100644 index 00000000..98e4befd --- /dev/null +++ b/docs/images/chapters/explanation/7a44f3eaa167a5022e2281c62e90fff8.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/explanation/7f74178029422a35267fd033b392fe4c.svg b/docs/images/chapters/explanation/7f74178029422a35267fd033b392fe4c.svg new file mode 100644 index 00000000..f1d635c3 --- /dev/null +++ b/docs/images/chapters/explanation/7f74178029422a35267fd033b392fe4c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/explanation/8986c536df8153b30197c3a5407d233a.svg b/docs/images/chapters/explanation/8986c536df8153b30197c3a5407d233a.svg deleted file mode 100644 index dfbbde5a..00000000 --- a/docs/images/chapters/explanation/8986c536df8153b30197c3a5407d233a.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/explanation/9229934d71b0b02921bc92594ef11a98.svg b/docs/images/chapters/explanation/9229934d71b0b02921bc92594ef11a98.svg deleted file mode 100644 index 69f2287e..00000000 --- a/docs/images/chapters/explanation/9229934d71b0b02921bc92594ef11a98.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/explanation/9734aff037ac23a73504ff7cc846eab7.svg b/docs/images/chapters/explanation/9734aff037ac23a73504ff7cc846eab7.svg new file mode 100644 index 00000000..34f68620 --- /dev/null +++ b/docs/images/chapters/explanation/9734aff037ac23a73504ff7cc846eab7.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/explanation/9c921b7b8a8db831f787c1329e29f7cb.svg b/docs/images/chapters/explanation/9c921b7b8a8db831f787c1329e29f7cb.svg new file mode 100644 index 00000000..fc312a9e --- /dev/null +++ b/docs/images/chapters/explanation/9c921b7b8a8db831f787c1329e29f7cb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/explanation/a5bb1312adc5e9e23bee6b47555a6e8f.svg b/docs/images/chapters/explanation/a5bb1312adc5e9e23bee6b47555a6e8f.svg new file mode 100644 index 00000000..94b48f4d --- /dev/null +++ b/docs/images/chapters/explanation/a5bb1312adc5e9e23bee6b47555a6e8f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/explanation/adc7729f7872d71f3fbb1a79741ce10f.svg b/docs/images/chapters/explanation/adc7729f7872d71f3fbb1a79741ce10f.svg deleted file mode 100644 index c2d62666..00000000 --- a/docs/images/chapters/explanation/adc7729f7872d71f3fbb1a79741ce10f.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/explanation/af40980136c291814e8970dc2a3d8e63.svg b/docs/images/chapters/explanation/af40980136c291814e8970dc2a3d8e63.svg new file mode 100644 index 00000000..cce59def --- /dev/null +++ b/docs/images/chapters/explanation/af40980136c291814e8970dc2a3d8e63.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/explanation/dc48cdf8f492b44c7602eb64ce2b9986.svg b/docs/images/chapters/explanation/dc48cdf8f492b44c7602eb64ce2b9986.svg deleted file mode 100644 index 4c2c8df8..00000000 --- a/docs/images/chapters/explanation/dc48cdf8f492b44c7602eb64ce2b9986.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/explanation/f79dd2f2d992e22b8d057fdc641290b0.svg b/docs/images/chapters/explanation/f79dd2f2d992e22b8d057fdc641290b0.svg deleted file mode 100644 index d307f8b4..00000000 --- a/docs/images/chapters/explanation/f79dd2f2d992e22b8d057fdc641290b0.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/explanation/fa3ed9a4ab61d80ec175d29533b5728e.svg b/docs/images/chapters/explanation/fa3ed9a4ab61d80ec175d29533b5728e.svg deleted file mode 100644 index 769caa5b..00000000 --- a/docs/images/chapters/explanation/fa3ed9a4ab61d80ec175d29533b5728e.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/extended/fd520a6e2c7f39e90496e5cf494cce2e.svg b/docs/images/chapters/extended/08cd4a8bf4557862c095066728e6ed5e.svg similarity index 100% rename from docs/images/chapters/extended/fd520a6e2c7f39e90496e5cf494cce2e.svg rename to docs/images/chapters/extended/08cd4a8bf4557862c095066728e6ed5e.svg diff --git a/docs/images/chapters/extended/4e0fa763b173e3a683587acf83733353.svg b/docs/images/chapters/extended/4e0fa763b173e3a683587acf83733353.svg new file mode 100644 index 00000000..6b2f9771 --- /dev/null +++ b/docs/images/chapters/extended/4e0fa763b173e3a683587acf83733353.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/extended/b0eb0b24e7fa29c545ab1479d2df0554.svg b/docs/images/chapters/extended/5a7a12213ca36f2f833e638ea0174d4a.svg similarity index 100% rename from docs/images/chapters/extended/b0eb0b24e7fa29c545ab1479d2df0554.svg rename to docs/images/chapters/extended/5a7a12213ca36f2f833e638ea0174d4a.svg diff --git a/docs/images/chapters/extended/dfd6ded3f0addcf43e0a1581627a2220.svg b/docs/images/chapters/extended/dfd6ded3f0addcf43e0a1581627a2220.svg new file mode 100644 index 00000000..51a76104 --- /dev/null +++ b/docs/images/chapters/extended/dfd6ded3f0addcf43e0a1581627a2220.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/extended/e2e71b397009b51af8a3ee848bc727b4.svg b/docs/images/chapters/extended/e2e71b397009b51af8a3ee848bc727b4.svg deleted file mode 100644 index 9f7786ca..00000000 --- a/docs/images/chapters/extended/e2e71b397009b51af8a3ee848bc727b4.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/extended/f56f59f3c0b057c8ec79a477e4e38bec.svg b/docs/images/chapters/extended/f56f59f3c0b057c8ec79a477e4e38bec.svg deleted file mode 100644 index ac4c488f..00000000 --- a/docs/images/chapters/extended/f56f59f3c0b057c8ec79a477e4e38bec.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/extremities/2c398b492aadc90eb4e4853fc20b23e9.svg b/docs/images/chapters/extremities/2c398b492aadc90eb4e4853fc20b23e9.svg deleted file mode 100644 index c810f40e..00000000 --- a/docs/images/chapters/extremities/2c398b492aadc90eb4e4853fc20b23e9.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/extremities/3125ab785fb039994582552790a2674b.svg b/docs/images/chapters/extremities/3125ab785fb039994582552790a2674b.svg new file mode 100644 index 00000000..e9a3725f --- /dev/null +++ b/docs/images/chapters/extremities/3125ab785fb039994582552790a2674b.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/extremities/bf0ad4611c47f8548396e40595c02b55.svg b/docs/images/chapters/extremities/bf0ad4611c47f8548396e40595c02b55.svg new file mode 100644 index 00000000..e106ba88 --- /dev/null +++ b/docs/images/chapters/extremities/bf0ad4611c47f8548396e40595c02b55.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/extremities/c4858be225d004441b2aefedacda89a3.svg b/docs/images/chapters/extremities/c4858be225d004441b2aefedacda89a3.svg deleted file mode 100644 index ed3b2aee..00000000 --- a/docs/images/chapters/extremities/c4858be225d004441b2aefedacda89a3.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/inflections/f9f2258e59b038659087a5e87ba2e0af.svg b/docs/images/chapters/inflections/35299f4eb8e0bed76b68c7beb2038031.svg similarity index 100% rename from docs/images/chapters/inflections/f9f2258e59b038659087a5e87ba2e0af.svg rename to docs/images/chapters/inflections/35299f4eb8e0bed76b68c7beb2038031.svg diff --git a/docs/images/chapters/inflections/be9e409d619ecd735b0fbc219bec6d07.svg b/docs/images/chapters/inflections/8278b9bec92ae49927283396692b51d5.svg similarity index 100% rename from docs/images/chapters/inflections/be9e409d619ecd735b0fbc219bec6d07.svg rename to docs/images/chapters/inflections/8278b9bec92ae49927283396692b51d5.svg diff --git a/docs/images/chapters/inflections/a283e01df17f3d763ec89621f2af6c5c.svg b/docs/images/chapters/inflections/852f0346f025c671b8a1ce6b628028aa.svg similarity index 100% rename from docs/images/chapters/inflections/a283e01df17f3d763ec89621f2af6c5c.svg rename to docs/images/chapters/inflections/852f0346f025c671b8a1ce6b628028aa.svg diff --git a/docs/images/chapters/matrixsplit/206f539367fa1aaefc230709e4f2068e.svg b/docs/images/chapters/matrixsplit/206f539367fa1aaefc230709e4f2068e.svg new file mode 100644 index 00000000..aee66390 --- /dev/null +++ b/docs/images/chapters/matrixsplit/206f539367fa1aaefc230709e4f2068e.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/matrixsplit/266b71339b55ad3a312a9f41e6bcf988.svg b/docs/images/chapters/matrixsplit/266b71339b55ad3a312a9f41e6bcf988.svg new file mode 100644 index 00000000..bfef7ec3 --- /dev/null +++ b/docs/images/chapters/matrixsplit/266b71339b55ad3a312a9f41e6bcf988.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/matrixsplit/4549b95450db3c73479e8902e4939427.svg b/docs/images/chapters/matrixsplit/4549b95450db3c73479e8902e4939427.svg new file mode 100644 index 00000000..a3da0176 --- /dev/null +++ b/docs/images/chapters/matrixsplit/4549b95450db3c73479e8902e4939427.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/matrixsplit/55b45214ba90c96978cdc9cdfee24fef.svg b/docs/images/chapters/matrixsplit/55b45214ba90c96978cdc9cdfee24fef.svg deleted file mode 100644 index e2b0b970..00000000 --- a/docs/images/chapters/matrixsplit/55b45214ba90c96978cdc9cdfee24fef.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/matrixsplit/598739d23cf8dbcdebe033e4c7f1d28a.svg b/docs/images/chapters/matrixsplit/598739d23cf8dbcdebe033e4c7f1d28a.svg deleted file mode 100644 index 2a0ee900..00000000 --- a/docs/images/chapters/matrixsplit/598739d23cf8dbcdebe033e4c7f1d28a.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/matrixsplit/7a1e792cd3fa6f3482459e154abf2e7d.svg b/docs/images/chapters/matrixsplit/7a1e792cd3fa6f3482459e154abf2e7d.svg deleted file mode 100644 index 6352ea3e..00000000 --- a/docs/images/chapters/matrixsplit/7a1e792cd3fa6f3482459e154abf2e7d.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/matrixsplit/63d1337d275abf7b296d500b9b5821fd.svg b/docs/images/chapters/matrixsplit/8349aa18563bb43427ae2383f1e212ae.svg similarity index 62% rename from docs/images/chapters/matrixsplit/63d1337d275abf7b296d500b9b5821fd.svg rename to docs/images/chapters/matrixsplit/8349aa18563bb43427ae2383f1e212ae.svg index 8879e5c7..6c25bf4b 100644 --- a/docs/images/chapters/matrixsplit/63d1337d275abf7b296d500b9b5821fd.svg +++ b/docs/images/chapters/matrixsplit/8349aa18563bb43427ae2383f1e212ae.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/docs/images/chapters/matrixsplit/aa17f7e82cf50498f90deb6a21a2489a.svg b/docs/images/chapters/matrixsplit/aa17f7e82cf50498f90deb6a21a2489a.svg new file mode 100644 index 00000000..532e5ffb --- /dev/null +++ b/docs/images/chapters/matrixsplit/aa17f7e82cf50498f90deb6a21a2489a.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/matrixsplit/baedd4067516584d425b93331b7ce04f.svg b/docs/images/chapters/matrixsplit/baedd4067516584d425b93331b7ce04f.svg deleted file mode 100644 index bfe4b273..00000000 --- a/docs/images/chapters/matrixsplit/baedd4067516584d425b93331b7ce04f.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/matrixsplit/d9d04b9b6c66788d18832a383d6f7ea0.svg b/docs/images/chapters/matrixsplit/da4ebf090f84d9b5d48b0f1e79bb3e7b.svg similarity index 52% rename from docs/images/chapters/matrixsplit/d9d04b9b6c66788d18832a383d6f7ea0.svg rename to docs/images/chapters/matrixsplit/da4ebf090f84d9b5d48b0f1e79bb3e7b.svg index 93dba041..c8fac6db 100644 --- a/docs/images/chapters/matrixsplit/d9d04b9b6c66788d18832a383d6f7ea0.svg +++ b/docs/images/chapters/matrixsplit/da4ebf090f84d9b5d48b0f1e79bb3e7b.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/docs/images/chapters/molding/2e65bc9c934380c2de6a24bcd5c1c7b7.svg b/docs/images/chapters/molding/2e65bc9c934380c2de6a24bcd5c1c7b7.svg new file mode 100644 index 00000000..ef65e929 --- /dev/null +++ b/docs/images/chapters/molding/2e65bc9c934380c2de6a24bcd5c1c7b7.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/molding/48887d68a861a0acdf8313e23fb19880.svg b/docs/images/chapters/molding/48887d68a861a0acdf8313e23fb19880.svg new file mode 100644 index 00000000..26ab4b25 --- /dev/null +++ b/docs/images/chapters/molding/48887d68a861a0acdf8313e23fb19880.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/molding/6f12fcc00f4106bbc920d7451398d3b2.svg b/docs/images/chapters/molding/6f12fcc00f4106bbc920d7451398d3b2.svg deleted file mode 100644 index 59451769..00000000 --- a/docs/images/chapters/molding/6f12fcc00f4106bbc920d7451398d3b2.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/molding/70262c533569a7da06cc1b950e932d6f.svg b/docs/images/chapters/molding/70262c533569a7da06cc1b950e932d6f.svg deleted file mode 100644 index de6c0325..00000000 --- a/docs/images/chapters/molding/70262c533569a7da06cc1b950e932d6f.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/pointvectors/33afd1a141ec444989c393b3e51ec9ca.svg b/docs/images/chapters/pointvectors/33afd1a141ec444989c393b3e51ec9ca.svg new file mode 100644 index 00000000..2ff19cd8 --- /dev/null +++ b/docs/images/chapters/pointvectors/33afd1a141ec444989c393b3e51ec9ca.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/pointvectors/5863bd013ad6594f63f8dfa51ff4adc0.png b/docs/images/chapters/pointvectors/5863bd013ad6594f63f8dfa51ff4adc0.png deleted file mode 100644 index 2ee3127f..00000000 Binary files a/docs/images/chapters/pointvectors/5863bd013ad6594f63f8dfa51ff4adc0.png and /dev/null differ diff --git a/docs/images/chapters/pointvectors/58b19accb8a68c665ff5cbed610eea4e.svg b/docs/images/chapters/pointvectors/58b19accb8a68c665ff5cbed610eea4e.svg deleted file mode 100644 index e91a6c67..00000000 --- a/docs/images/chapters/pointvectors/58b19accb8a68c665ff5cbed610eea4e.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/pointvectors/8b15a314beca97071b0ccb22c969355d.svg b/docs/images/chapters/pointvectors/8b15a314beca97071b0ccb22c969355d.svg deleted file mode 100644 index 77314421..00000000 --- a/docs/images/chapters/pointvectors/8b15a314beca97071b0ccb22c969355d.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/pointvectors/b60cdba673c2c9fc84c800f07fd18145.svg b/docs/images/chapters/pointvectors/b60cdba673c2c9fc84c800f07fd18145.svg deleted file mode 100644 index 612dfc51..00000000 --- a/docs/images/chapters/pointvectors/b60cdba673c2c9fc84c800f07fd18145.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/pointvectors/c3d5f3506b763b718e567f90dbb78324.svg b/docs/images/chapters/pointvectors/c3d5f3506b763b718e567f90dbb78324.svg new file mode 100644 index 00000000..f6af659e --- /dev/null +++ b/docs/images/chapters/pointvectors/c3d5f3506b763b718e567f90dbb78324.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/pointvectors/da069c7d6cbdb516c5454371dae84e7f.svg b/docs/images/chapters/pointvectors/da069c7d6cbdb516c5454371dae84e7f.svg new file mode 100644 index 00000000..acc07560 --- /dev/null +++ b/docs/images/chapters/pointvectors/da069c7d6cbdb516c5454371dae84e7f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/pointvectors/f1b4e81d22f4c44d4618b0f55a1a88c5.png b/docs/images/chapters/pointvectors/f1b4e81d22f4c44d4618b0f55a1a88c5.png deleted file mode 100644 index 403dac6d..00000000 Binary files a/docs/images/chapters/pointvectors/f1b4e81d22f4c44d4618b0f55a1a88c5.png and /dev/null differ diff --git a/docs/images/chapters/polybezier/2249056953a47ab1944bb5a41dcbed8c.svg b/docs/images/chapters/polybezier/2249056953a47ab1944bb5a41dcbed8c.svg new file mode 100644 index 00000000..e38059b3 --- /dev/null +++ b/docs/images/chapters/polybezier/2249056953a47ab1944bb5a41dcbed8c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/polybezier/ec93d3c42f0ae52a05d0aff9739675e5.svg b/docs/images/chapters/polybezier/ec93d3c42f0ae52a05d0aff9739675e5.svg deleted file mode 100644 index 16c75145..00000000 --- a/docs/images/chapters/polybezier/ec93d3c42f0ae52a05d0aff9739675e5.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/reordering/56130afc4cb313e0e74cf670d34590f6.svg b/docs/images/chapters/reordering/0cf0d5f856ec204dc32e0e42691cc70a.svg similarity index 100% rename from docs/images/chapters/reordering/56130afc4cb313e0e74cf670d34590f6.svg rename to docs/images/chapters/reordering/0cf0d5f856ec204dc32e0e42691cc70a.svg diff --git a/docs/images/chapters/reordering/74e038deabd9e240606fa3f07ba98269.svg b/docs/images/chapters/reordering/74e038deabd9e240606fa3f07ba98269.svg new file mode 100644 index 00000000..3835ea2a --- /dev/null +++ b/docs/images/chapters/reordering/74e038deabd9e240606fa3f07ba98269.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/reordering/8090b63b005bf3edb916b97bda317a0e.svg b/docs/images/chapters/reordering/9fc4ecc087d389dd0111bcba165cd5d0.svg similarity index 100% rename from docs/images/chapters/reordering/8090b63b005bf3edb916b97bda317a0e.svg rename to docs/images/chapters/reordering/9fc4ecc087d389dd0111bcba165cd5d0.svg diff --git a/docs/images/chapters/reordering/c4874e1205aabe624e5504abe154eae9.png b/docs/images/chapters/reordering/c4874e1205aabe624e5504abe154eae9.png index 46170a67..576497c1 100644 Binary files a/docs/images/chapters/reordering/c4874e1205aabe624e5504abe154eae9.png and b/docs/images/chapters/reordering/c4874e1205aabe624e5504abe154eae9.png differ diff --git a/docs/images/chapters/reordering/e9fc9c715bb55a702db68b2bb6da0a68.svg b/docs/images/chapters/reordering/e9fc9c715bb55a702db68b2bb6da0a68.svg deleted file mode 100644 index 56f9b36c..00000000 --- a/docs/images/chapters/reordering/e9fc9c715bb55a702db68b2bb6da0a68.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/weightcontrol/2ec04091c55fe31bf85ac28c5b6d95cb.svg b/docs/images/chapters/weightcontrol/2ec04091c55fe31bf85ac28c5b6d95cb.svg deleted file mode 100644 index bfcda18d..00000000 --- a/docs/images/chapters/weightcontrol/2ec04091c55fe31bf85ac28c5b6d95cb.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/weightcontrol/55f079880a77c126c70106e62ff941d9.svg b/docs/images/chapters/weightcontrol/55f079880a77c126c70106e62ff941d9.svg new file mode 100644 index 00000000..e8dfa85f --- /dev/null +++ b/docs/images/chapters/weightcontrol/55f079880a77c126c70106e62ff941d9.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/weightcontrol/85d526fb17f9e859dcd7d40d22192e37.svg b/docs/images/chapters/weightcontrol/ceac4259d2aed0767c7765d2237ca1a3.svg similarity index 100% rename from docs/images/chapters/weightcontrol/85d526fb17f9e859dcd7d40d22192e37.svg rename to docs/images/chapters/weightcontrol/ceac4259d2aed0767c7765d2237ca1a3.svg diff --git a/docs/images/chapters/whatis/06bbc5c11ad3fd88ff93eb2c06177b66.svg b/docs/images/chapters/whatis/3437a38af1218ca206e921e48678c07e.svg similarity index 100% rename from docs/images/chapters/whatis/06bbc5c11ad3fd88ff93eb2c06177b66.svg rename to docs/images/chapters/whatis/3437a38af1218ca206e921e48678c07e.svg diff --git a/docs/images/chapters/whatis/35964d0485747082c0a8bedc0a16822b.svg b/docs/images/chapters/whatis/35964d0485747082c0a8bedc0a16822b.svg new file mode 100644 index 00000000..98f98e1f --- /dev/null +++ b/docs/images/chapters/whatis/35964d0485747082c0a8bedc0a16822b.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/whatis/c3f06301f5ce610df1217bc633257297.svg b/docs/images/chapters/whatis/c3f06301f5ce610df1217bc633257297.svg deleted file mode 100644 index 62ad7c58..00000000 --- a/docs/images/chapters/whatis/c3f06301f5ce610df1217bc633257297.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/whatis/c7f8cdd755d744412476b87230d0400d.svg b/docs/images/chapters/whatis/c7f8cdd755d744412476b87230d0400d.svg new file mode 100644 index 00000000..5be3bea1 --- /dev/null +++ b/docs/images/chapters/whatis/c7f8cdd755d744412476b87230d0400d.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/chapters/whatis/e0600b3be5b95f105a1cf2a2c0378b98.svg b/docs/images/chapters/whatis/e0600b3be5b95f105a1cf2a2c0378b98.svg deleted file mode 100644 index 785f4fb5..00000000 --- a/docs/images/chapters/whatis/e0600b3be5b95f105a1cf2a2c0378b98.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/images/chapters/yforx/4d23ee228c5b1cbc40e380496c2184d1.svg b/docs/images/chapters/yforx/021718d3b46893b271f90083ccdceaf8.svg similarity index 100% rename from docs/images/chapters/yforx/4d23ee228c5b1cbc40e380496c2184d1.svg rename to docs/images/chapters/yforx/021718d3b46893b271f90083ccdceaf8.svg diff --git a/docs/images/chapters/yforx/699459d89ca6622c90c1e42e4aa03f32.svg b/docs/images/chapters/yforx/058a76e3e7d67c03f733e075829a6252.svg similarity index 100% rename from docs/images/chapters/yforx/699459d89ca6622c90c1e42e4aa03f32.svg rename to docs/images/chapters/yforx/058a76e3e7d67c03f733e075829a6252.svg diff --git a/docs/images/chapters/yforx/316e7fae61e10014000d770209779ab6.svg b/docs/images/chapters/yforx/378d0fd8cefa688d530ac38930d66844.svg similarity index 100% rename from docs/images/chapters/yforx/316e7fae61e10014000d770209779ab6.svg rename to docs/images/chapters/yforx/378d0fd8cefa688d530ac38930d66844.svg diff --git a/docs/images/snippets/abc/131454dcbac04e567f322979f4af80c6.ascii b/docs/images/snippets/abc/131454dcbac04e567f322979f4af80c6.ascii new file mode 100644 index 00000000..f8eb0655 --- /dev/null +++ b/docs/images/snippets/abc/131454dcbac04e567f322979f4af80c6.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + distance(B,C) + ratio(t) = ────────────── = Constant + distance(A,B) diff --git a/docs/images/snippets/abc/51a9d0588be822a5c80ea38f7d348641.ascii b/docs/images/snippets/abc/51a9d0588be822a5c80ea38f7d348641.ascii new file mode 100644 index 00000000..b9fa5fa4 --- /dev/null +++ b/docs/images/snippets/abc/51a9d0588be822a5c80ea38f7d348641.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + C - B B - C + A = B - ───────── = B + ───────── + ratio(t) ratio(t) diff --git a/docs/images/snippets/abc/5924e162b50272c40c842fad14b8fa48.ascii b/docs/images/snippets/abc/5924e162b50272c40c842fad14b8fa48.ascii new file mode 100644 index 00000000..8c413b3c --- /dev/null +++ b/docs/images/snippets/abc/5924e162b50272c40c842fad14b8fa48.ascii @@ -0,0 +1,7 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + 2 2 + t + (1-t) - 1 + ratio(t) = |───────────────| + quadratic 2 2 + t + (1-t) diff --git a/docs/images/snippets/abc/634d373310711268cc188f45e5699d8d.ascii b/docs/images/snippets/abc/634d373310711268cc188f45e5699d8d.ascii new file mode 100644 index 00000000..27bc301e --- /dev/null +++ b/docs/images/snippets/abc/634d373310711268cc188f45e5699d8d.ascii @@ -0,0 +1,10 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ╭ v - start + │ 1 + │ C '= start + ─────────── + ╡ 1 t + │ v - end + │ 2 + │ C '= end + ───────── + ╰ 2 1 - t diff --git a/docs/images/snippets/abc/8c6662f605722fb2ff6cd7f65243a126.ascii b/docs/images/snippets/abc/8c6662f605722fb2ff6cd7f65243a126.ascii new file mode 100644 index 00000000..a4d5fb8d --- /dev/null +++ b/docs/images/snippets/abc/8c6662f605722fb2ff6cd7f65243a126.ascii @@ -0,0 +1,4 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + C = u(t) · P + (1-u(t)) · P + start end diff --git a/docs/images/snippets/abc/8cd992c1ceaae2e67695285beef23a24.ascii b/docs/images/snippets/abc/8cd992c1ceaae2e67695285beef23a24.ascii new file mode 100644 index 00000000..32c7f760 --- /dev/null +++ b/docs/images/snippets/abc/8cd992c1ceaae2e67695285beef23a24.ascii @@ -0,0 +1,7 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + 3 3 + t + (1-t) - 1 + ratio(t) = |───────────────| + cubic 3 3 + t + (1-t) diff --git a/docs/images/snippets/abc/8e7cfee39c98f2ddf9b635a914066cf6.ascii b/docs/images/snippets/abc/8e7cfee39c98f2ddf9b635a914066cf6.ascii new file mode 100644 index 00000000..afc09ab9 --- /dev/null +++ b/docs/images/snippets/abc/8e7cfee39c98f2ddf9b635a914066cf6.ascii @@ -0,0 +1,7 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + 2 + (1-t) + u(t) = ─────────── + quadratic 2 2 + t + (1-t) diff --git a/docs/images/snippets/abc/a0b99054cc82ca1fb147f077e175ef10.ascii b/docs/images/snippets/abc/a0b99054cc82ca1fb147f077e175ef10.ascii new file mode 100644 index 00000000..1858a2ac --- /dev/null +++ b/docs/images/snippets/abc/a0b99054cc82ca1fb147f077e175ef10.ascii @@ -0,0 +1,7 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + 3 + (1-t) + u(t) = ─────────── + cubic 3 3 + t + (1-t) diff --git a/docs/images/snippets/arclength/85620f0332fcf16f56c580794fd094c5.ascii b/docs/images/snippets/arclength/85620f0332fcf16f56c580794fd094c5.ascii new file mode 100644 index 00000000..714299cc --- /dev/null +++ b/docs/images/snippets/arclength/85620f0332fcf16f56c580794fd094c5.ascii @@ -0,0 +1,6 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌─────────────────┐ + ╭ z │ 2 2 + length = | ⟍│(dx/dt) +(dy/dt) dt + ╯ 0 diff --git a/docs/images/snippets/arclength/b76753476ad6ecfe4b8f39bcf9432980.ascii b/docs/images/snippets/arclength/b76753476ad6ecfe4b8f39bcf9432980.ascii new file mode 100644 index 00000000..10c3da8f --- /dev/null +++ b/docs/images/snippets/arclength/b76753476ad6ecfe4b8f39bcf9432980.ascii @@ -0,0 +1,9 @@ + \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌─────────────────┐ +╭ 1 │ 2 2 ╭ 1 +| ⟍│(dx/dt) +(dy/dt) dt = | f(t) dt ≃ ┌ \underset strip 1 \underbrace C · f(t ) + ... + \underset strip n \underbrace C · f(t ) ┐ = +╯ -1 ╯ -1 └ 1 1 n n ┘ + __ n + \underset strips 1 through n \underbrace ❯ C · f(t ) + ‾‾ i=1 i i diff --git a/docs/images/snippets/bsplines/2421f47aa4fe1c0d830d53b2e6563c04.ascii b/docs/images/snippets/bsplines/2421f47aa4fe1c0d830d53b2e6563c04.ascii new file mode 100644 index 00000000..a5531f0d --- /dev/null +++ b/docs/images/snippets/bsplines/2421f47aa4fe1c0d830d53b2e6563c04.ascii @@ -0,0 +1,7 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ╭ t- knot ╮ ╭ knot -t ╮ + │ i │ │ (i+k) │ + N (t) = │ ───────────────────── │ · N (t) + │ ─────────────────────── │ · N (t) + i,k │ knot - knot │ i,k-1 │ knot - knot │ i+1,k-1 + ╰ (i+k-1) i ╯ ╰ (i+k) (i+1) ╯ diff --git a/docs/images/snippets/bsplines/2514e1aa0565840e33fde0b146e3efe2.ascii b/docs/images/snippets/bsplines/2514e1aa0565840e33fde0b146e3efe2.ascii new file mode 100644 index 00000000..6a4fc7bd --- /dev/null +++ b/docs/images/snippets/bsplines/2514e1aa0565840e33fde0b146e3efe2.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ╭ 1 if t ∈[ knot , knot ) + N (t) = ╡ i i+1 + i,1 ╰ 0 otherwise diff --git a/docs/images/snippets/bsplines/49af474c33ce0ee0733626ea3d988570.ascii b/docs/images/snippets/bsplines/49af474c33ce0ee0733626ea3d988570.ascii new file mode 100644 index 00000000..ae16d003 --- /dev/null +++ b/docs/images/snippets/bsplines/49af474c33ce0ee0733626ea3d988570.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + k 0 ╭ 1 if t ∈[ knot , knot ) + d (t) = 0, d (t) = N (t) = ╡ i i+1 + 0 i i,1 ╰ 0 otherwise diff --git a/docs/images/snippets/bsplines/e62558cdfd8abaf22511e8e68c7afb4a.ascii b/docs/images/snippets/bsplines/e62558cdfd8abaf22511e8e68c7afb4a.ascii new file mode 100644 index 00000000..340f3fb5 --- /dev/null +++ b/docs/images/snippets/bsplines/e62558cdfd8abaf22511e8e68c7afb4a.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + t - knots[i] + α = ─────────────────────────── + i,k knots[i+1+n-k] - knots[i] diff --git a/docs/images/snippets/canonical/fff37fa4275e43302f71cf052417a19f.ascii b/docs/images/snippets/canonical/fff37fa4275e43302f71cf052417a19f.ascii new file mode 100644 index 00000000..51769205 --- /dev/null +++ b/docs/images/snippets/canonical/fff37fa4275e43302f71cf052417a19f.ascii @@ -0,0 +1,24 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ╭ (-x +x )(-y +y ) ╮ + │ 1 2 1 4 │ + │ -x + x - ──────────────── │ + │ 1 4 -y +y │ + │ 1 2 │ + │ ─────────────────────────── │ + │ (-x +x )(-y +y ) │ + │ 1 2 1 3 │ + │ -x +x -──────────────── │ + │ 1 3 -y +y │ + mapped = (x) = │ 1 2 │ + 4 y │ ╭ -y +y ╮ ╭ (-x +x )(-y +y ) ╮ │ + │ │ 1 3 │ │ 1 2 1 4 │ │ + │ │ 1 - ────── │ │ -x + x - ──────────────── │ │ + │ (-y +y ) │ -y +y │ │ 1 4 -y +y │ │ + │ 1 4 ╰ 1 2 ╯ ╰ 1 2 ╯ │ + │ ──────── + ────────────────────────────────────────────── │ + │ -y +y (-x +x )(-y +y ) │ + │ 1 2 1 2 1 3 │ + │ -x +x -──────────────── │ + │ 1 3 -y +y │ + ╰ 1 2 ╯ diff --git a/docs/images/snippets/catmullconv/012a8ab7a4de935c1c8d61dcd14fc62c.ascii b/docs/images/snippets/catmullconv/012a8ab7a4de935c1c8d61dcd14fc62c.ascii new file mode 100644 index 00000000..224d8fa8 --- /dev/null +++ b/docs/images/snippets/catmullconv/012a8ab7a4de935c1c8d61dcd14fc62c.ascii @@ -0,0 +1,10 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ P ┐ ┌ P + 6(P - P ) ┐ + │ 1 │ │ 4 1 2 │ + │ P │ │ P │ + │ 2 │ \Rightarrow │ 1 │ + │ P │ Bézier │ P │ CatmullRom + │ 3 │ │ 4 │ + │ P │ │ P + 6(P - P ) │ + └ 4 ┘ └ 1 4 3 ┘ diff --git a/docs/images/snippets/catmullconv/032409c03915a6ba75864e1dceae416d.ascii b/docs/images/snippets/catmullconv/032409c03915a6ba75864e1dceae416d.ascii new file mode 100644 index 00000000..eaea3f72 --- /dev/null +++ b/docs/images/snippets/catmullconv/032409c03915a6ba75864e1dceae416d.ascii @@ -0,0 +1,10 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ 0 1 0 0 ┐ ┌ P ┐ + │ 0 0 1 0 │ │ 1 │ + ┌ 1 0 0 0 ┐ │ -1 1 │ │ P │ + CatmullRom(t) = ┌ 2 3 ┐ · │ 0 0 1 0 │ · │ ── 0 ── 0 │ · │ 2 │ + └ 1 t t t ┘ │ -3 3 -2 -1 │ │ 2τ 2τ │ │ P │ + └ 2 -2 1 1 ┘ │ -1 1 │ │ 3 │ + │ 0 ── 0 ── │ │ P │ + └ 2τ 2τ ┘ └ 4 ┘ diff --git a/docs/images/snippets/catmullconv/389a1ea8c9e92df9a2b38718e34bae7b.ascii b/docs/images/snippets/catmullconv/389a1ea8c9e92df9a2b38718e34bae7b.ascii new file mode 100644 index 00000000..b1b40ccd --- /dev/null +++ b/docs/images/snippets/catmullconv/389a1ea8c9e92df9a2b38718e34bae7b.ascii @@ -0,0 +1,10 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ P ┐ + │ 1 │ + ┌ 1 0 0 0 ┐ │ P │ + Bézier(t) = ┌ 2 3 ┐ · │ -3 3 0 0 │ · │ 2 │ + └ 1 t t t ┘ │ 3 -6 3 0 │ │ P │ + └ -1 3 -3 1 ┘ │ 3 │ + │ P │ + └ 4 ┘ diff --git a/docs/images/snippets/catmullconv/639ca0b74a805c3aebac79b181eac908.ascii b/docs/images/snippets/catmullconv/639ca0b74a805c3aebac79b181eac908.ascii new file mode 100644 index 00000000..8a301512 --- /dev/null +++ b/docs/images/snippets/catmullconv/639ca0b74a805c3aebac79b181eac908.ascii @@ -0,0 +1,14 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ V = P ┐ + │ 1 2 │ + ┌ P ┐ │ V = P │ + │ 1 │ │ 2 3 │ + │ P │ │ P - P │ + │ 2 │ = │ 3 1 │ + │ P │points │ V' = ─────── │ point-tangent + │ 3 │ │ 1 2 │ + │ P │ │ P - P │ + └ 4 ┘ │ 4 2 │ + │ V' = ─────── │ + └ 2 2 ┘ diff --git a/docs/images/snippets/catmullconv/902c290a790b4d44d10236f4a1456cdc.ascii b/docs/images/snippets/catmullconv/902c290a790b4d44d10236f4a1456cdc.ascii new file mode 100644 index 00000000..83393491 --- /dev/null +++ b/docs/images/snippets/catmullconv/902c290a790b4d44d10236f4a1456cdc.ascii @@ -0,0 +1,10 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ V ┐ + │ 1 │ + ┌ 1 0 0 0 ┐ │ V │ + CatmullRom(t) = ┌ 2 3 ┐ · │ 0 0 1 0 │ · │ 2 │ + └ 1 t t t ┘ │ -3 3 -2 -1 │ │ V' │ + └ 2 -2 1 1 ┘ │ 1 │ + │ V' │ + └ 2 ┘ diff --git a/docs/images/snippets/catmullconv/98ddf6415bd9827a6d899b21d0a5f736.ascii b/docs/images/snippets/catmullconv/98ddf6415bd9827a6d899b21d0a5f736.ascii new file mode 100644 index 00000000..83393491 --- /dev/null +++ b/docs/images/snippets/catmullconv/98ddf6415bd9827a6d899b21d0a5f736.ascii @@ -0,0 +1,10 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ V ┐ + │ 1 │ + ┌ 1 0 0 0 ┐ │ V │ + CatmullRom(t) = ┌ 2 3 ┐ · │ 0 0 1 0 │ · │ 2 │ + └ 1 t t t ┘ │ -3 3 -2 -1 │ │ V' │ + └ 2 -2 1 1 ┘ │ 1 │ + │ V' │ + └ 2 ┘ diff --git a/docs/images/snippets/catmullconv/9ae99b090883023a485be7be098858e9.ascii b/docs/images/snippets/catmullconv/9ae99b090883023a485be7be098858e9.ascii new file mode 100644 index 00000000..1d57baff --- /dev/null +++ b/docs/images/snippets/catmullconv/9ae99b090883023a485be7be098858e9.ascii @@ -0,0 +1,10 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ P ┐ ┌ P ┐ + │ 1 │ │ 1 │ + │ P │ │ P │ + │ 2 │ \Rightarrow │ 4 │ + │ P │ Bézier │ P + 3(P - P ) │ CatmullRom + │ 3 │ │ 4 1 2 │ + │ P │ │ P + 3(P - P ) │ + └ 4 ┘ └ 1 4 3 ┘ diff --git a/docs/images/snippets/catmullconv/a323848e706c473833cda0b02bc220ef.ascii b/docs/images/snippets/catmullconv/a323848e706c473833cda0b02bc220ef.ascii new file mode 100644 index 00000000..68fcdb6a --- /dev/null +++ b/docs/images/snippets/catmullconv/a323848e706c473833cda0b02bc220ef.ascii @@ -0,0 +1,14 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ P ┐ + │ 2 │ + ┌ P ┐ │ P -P │ + │ 1 │ │ 3 1 │ + │ P │ │ P + ────── │ + │ 2 │ \Rightarrow │ 2 6 · τ │ + │ P │ CatmullRom │ P -P │ Bézier + │ 3 │ │ 4 2 │ + │ P │ │ P - ────── │ + └ 4 ┘ │ 3 6 · τ │ + │ P │ + └ 3 ┘ diff --git a/docs/images/snippets/catmullconv/e653724c11600cbf682f1c809c8c6508.ascii b/docs/images/snippets/catmullconv/e653724c11600cbf682f1c809c8c6508.ascii new file mode 100644 index 00000000..e4c8099d --- /dev/null +++ b/docs/images/snippets/catmullconv/e653724c11600cbf682f1c809c8c6508.ascii @@ -0,0 +1,12 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ 0 1 0 0 ┐ + │ -1 1 │ ┌ P ┐ + │ ── 0 ── 0 │ │ 1 │ + │ 2τ 2τ │ │ P │ + CatmullRom(t) = ┌ 2 3 ┐ · │ 1 1 1 -1 │ · │ 2 │ + └ 1 t t t ┘ │ ─ ── - 3 3 - ─ ── │ │ P │ + │ τ 2t t 2t │ │ 3 │ + │ -1 1 1 1 │ │ P │ + │ ── 2 - ── ── - 2 ── │ └ 4 ┘ + └ 2t 2τ 2τ 2t ┘ diff --git a/docs/images/snippets/circleintersection/2f42c862a0a9d0764727d42b16cf68a0.ascii b/docs/images/snippets/circleintersection/2f42c862a0a9d0764727d42b16cf68a0.ascii new file mode 100644 index 00000000..6cb05741 --- /dev/null +++ b/docs/images/snippets/circleintersection/2f42c862a0a9d0764727d42b16cf68a0.ascii @@ -0,0 +1,11 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + r= dist(B(t), c) + ┌─────────────────────────┐ + │ 2 2 + = │(B t - c ) + (B t - c ) + ⟍│ x x y y + ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │╭ 3 2 2 3 ╮2 ╭ 3 2 2 3 ╮2 + = ││ x (1-t) + 3 x (1-t) t + 2 x (1-t) t + x t - c │ + │ y (1-t) + 3 y (1-t) t + 2 y (1-t) t + y t - c │ + ⟍│╰ 1 2 3 4 x ╯ ╰ 1 2 3 4 y ╯ diff --git a/docs/images/snippets/circleintersection/373248ec6a579bacf6c6a317e6db597a.ascii b/docs/images/snippets/circleintersection/373248ec6a579bacf6c6a317e6db597a.ascii new file mode 100644 index 00000000..b7afcee9 --- /dev/null +++ b/docs/images/snippets/circleintersection/373248ec6a579bacf6c6a317e6db597a.ascii @@ -0,0 +1,3 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + dist(B(t), c) = r diff --git a/docs/images/snippets/circles_cubic/065efe85cac2f359ea4d5d4bae94da97.ascii b/docs/images/snippets/circles_cubic/065efe85cac2f359ea4d5d4bae94da97.ascii new file mode 100644 index 00000000..4980b769 --- /dev/null +++ b/docs/images/snippets/circles_cubic/065efe85cac2f359ea4d5d4bae94da97.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + 4 ╭ φ ╮ + C = ┌ cos(φ) + f · sin(φ) ┐ , with f = ─ tan │ ─ │ + 2 └ sin(φ) - f · cos(φ) ┘ 3 ╰ 4 ╯ diff --git a/docs/images/snippets/circles_cubic/496c0ee8945080a32bc02f78bc83ad43.ascii b/docs/images/snippets/circles_cubic/496c0ee8945080a32bc02f78bc83ad43.ascii new file mode 100644 index 00000000..1c87ca6d --- /dev/null +++ b/docs/images/snippets/circles_cubic/496c0ee8945080a32bc02f78bc83ad43.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + 4 ╭ φ ╮ + C = ┌ 1 ┐ , with f = ─ tan │ ─ │ + 1 └ f ┘ 3 ╰ 4 ╯ diff --git a/docs/images/snippets/circles_cubic/c509dc6fecd7992cb45a0b4d8f1bd001.ascii b/docs/images/snippets/circles_cubic/c509dc6fecd7992cb45a0b4d8f1bd001.ascii new file mode 100644 index 00000000..d11e31d6 --- /dev/null +++ b/docs/images/snippets/circles_cubic/c509dc6fecd7992cb45a0b4d8f1bd001.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ╭ 1 ╮ 1 4 + ||A,C|| = d + d = d + d · ratio │ ─ │ = d + ─d = ─d + 2 1 2 2 3 ╰ 2 ╯ 2 3 2 3 2 diff --git a/docs/images/snippets/control/3ec466bf6e1aff44b35b8e37cc86cc3e.ascii b/docs/images/snippets/control/3ec466bf6e1aff44b35b8e37cc86cc3e.ascii new file mode 100644 index 00000000..6b0389a1 --- /dev/null +++ b/docs/images/snippets/control/3ec466bf6e1aff44b35b8e37cc86cc3e.ascii @@ -0,0 +1,5 @@ +\usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontipaexm.ttf + + __ n n-i i + Bézier(n,t) = ❯ \underset 二項係数部分の項\underbrace\binomni · \ \underset 多項式部分の項\underbrace(1-t) · t · \ \underset重み\underbracew + ‾‾ i=0 i diff --git a/docs/images/snippets/control/6890c4028109e7d30a0b4b89f6fbe292.ascii b/docs/images/snippets/control/6890c4028109e7d30a0b4b89f6fbe292.ascii new file mode 100644 index 00000000..84c3fd7c --- /dev/null +++ b/docs/images/snippets/control/6890c4028109e7d30a0b4b89f6fbe292.ascii @@ -0,0 +1,7 @@ + \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + __ n n-i i +Bézier(n,t) = ❯ \underset binomial term\underbrace\binomni · \ \underset polynomial term\underbrace(1-t) · t · \ + ‾‾ i=0 + \undersetweight\underbracew + i diff --git a/docs/images/snippets/control/80cdfeab6ed6038f0e550ef5c1dcb7dd.ascii b/docs/images/snippets/control/80cdfeab6ed6038f0e550ef5c1dcb7dd.ascii new file mode 100644 index 00000000..6a5dfe6b --- /dev/null +++ b/docs/images/snippets/control/80cdfeab6ed6038f0e550ef5c1dcb7dd.ascii @@ -0,0 +1,5 @@ +\usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontipaexm.ttf + + __ n n-i i + Bézier(n,t) = ❯ \underset 二項係数部分の項\underbrace\binomni · \ \underset 多項式部分の項\underbrace(1-t) · t · \ \underset 重み\underbracew + ‾‾ i=0 i diff --git a/docs/images/snippets/control/87d587388add62445ec0f3e7d7295094.ascii b/docs/images/snippets/control/87d587388add62445ec0f3e7d7295094.ascii new file mode 100644 index 00000000..ee160ac1 --- /dev/null +++ b/docs/images/snippets/control/87d587388add62445ec0f3e7d7295094.ascii @@ -0,0 +1,7 @@ + \usepackageunicode-math \setmainfont[Ligatures=TeX]Linux Libertine O \setmathfontXITS Math + + __ n n-i i +Bézier(n,t) = ❯ \underset биноминальный термин\underbrace\binomni · \ \underset полиноминальный термин\underbrace(1-t) · t · \ + ‾‾ i=0 + \undersetвес\underbracew + i diff --git a/docs/images/snippets/control/a337e3f97387b52d387fc01605314497.ascii b/docs/images/snippets/control/a337e3f97387b52d387fc01605314497.ascii new file mode 100644 index 00000000..6c8d9694 --- /dev/null +++ b/docs/images/snippets/control/a337e3f97387b52d387fc01605314497.ascii @@ -0,0 +1,7 @@ + \usepackageunicode-math \setmainfont[Ligatures=TeX]Linux Libertine O \setmathfontXITS Math + + __ n n-i i +Bézier(n,t) = ❯ \underset биноминальный термин\underbrace\binomni · \ \underset полиноминальный термин\underbrace(1-t) · t · \ \underset + ‾‾ i=0 + вес\underbracew + i diff --git a/docs/images/snippets/control/c2f2fe0ef5d0089d9dd8e5e3999405cb.ascii b/docs/images/snippets/control/c2f2fe0ef5d0089d9dd8e5e3999405cb.ascii new file mode 100644 index 00000000..2e1eac5e --- /dev/null +++ b/docs/images/snippets/control/c2f2fe0ef5d0089d9dd8e5e3999405cb.ascii @@ -0,0 +1,7 @@ + \usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontgbsn00lp.ttf + + __ n n-i i +Bézier(n,t) = ❯ \underset binomial term\underbrace\binomni · \ \underset polynomial term\underbrace(1-t) · t · \ \underset + ‾‾ i=0 + weight\underbracew + i diff --git a/docs/images/snippets/curvefitting/097aa1948b6cdbf9dc7579643a7af246.ascii b/docs/images/snippets/curvefitting/097aa1948b6cdbf9dc7579643a7af246.ascii new file mode 100644 index 00000000..9272dba9 --- /dev/null +++ b/docs/images/snippets/curvefitting/097aa1948b6cdbf9dc7579643a7af246.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + __ n 2 + E(C) = ❯ (p - Bézier(s )) + ‾‾ i=1 i i diff --git a/docs/images/snippets/curvefitting/134baa1043d0849f31a1943d6d5bc607.ascii b/docs/images/snippets/curvefitting/134baa1043d0849f31a1943d6d5bc607.ascii new file mode 100644 index 00000000..1a6bcb00 --- /dev/null +++ b/docs/images/snippets/curvefitting/134baa1043d0849f31a1943d6d5bc607.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ a 0 0 ┐ ┌ 1 0 0 ┐ ┌ a ┐ + B = T · M · C = ┌ 2 ┐ · │ -2a 2b 0 │ = ┌ 2 ┐ · │ -2 2 0 │ · │ b │ + quadratic └ 1 t t ┘ └ a -2b c ┘ └ 1 t t ┘ └ 1 -2 1 ┘ └ c ┘ diff --git a/docs/images/snippets/curvefitting/17d5fbeffcdcceca98cdba537295d258.ascii b/docs/images/snippets/curvefitting/17d5fbeffcdcceca98cdba537295d258.ascii new file mode 100644 index 00000000..4a235f5a --- /dev/null +++ b/docs/images/snippets/curvefitting/17d5fbeffcdcceca98cdba537295d258.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + 3 2 2 3 + B =a(1-t) + 3b(1-t) t + 3c(1-t)t + dt + cubic diff --git a/docs/images/snippets/curvefitting/4e6e20c823c8cc72e0cc00e4ab5b7556.ascii b/docs/images/snippets/curvefitting/4e6e20c823c8cc72e0cc00e4ab5b7556.ascii new file mode 100644 index 00000000..0a85fa31 --- /dev/null +++ b/docs/images/snippets/curvefitting/4e6e20c823c8cc72e0cc00e4ab5b7556.ascii @@ -0,0 +1,6 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ 1 0 0 0 ┐ ┌ a ┐ + B = T · M · C = ┌ 2 3 ┐ · │ -3 3 0 0 │ · │ b │ + cubic └ 1 t t t ┘ │ 3 -6 3 0 │ │ c │ + └ -1 3 -3 1 ┘ └ d ┘ diff --git a/docs/images/snippets/curvefitting/8928f757abd1376abdc4069e1aa774f2.ascii b/docs/images/snippets/curvefitting/8928f757abd1376abdc4069e1aa774f2.ascii new file mode 100644 index 00000000..39708cf8 --- /dev/null +++ b/docs/images/snippets/curvefitting/8928f757abd1376abdc4069e1aa774f2.ascii @@ -0,0 +1,9 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + B =a + cubic + - 3at + 3bt + 2 2 2 + + 3at - 6bt +3ct + 3 3 3 3 + - at + 3bt -3ct + dt diff --git a/docs/images/snippets/curvefitting/8a66af7570bac674966f6316820ea31b.ascii b/docs/images/snippets/curvefitting/8a66af7570bac674966f6316820ea31b.ascii new file mode 100644 index 00000000..e8fcab3b --- /dev/null +++ b/docs/images/snippets/curvefitting/8a66af7570bac674966f6316820ea31b.ascii @@ -0,0 +1,7 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ 1 0 0 0 0 ┐ ┌ a ┐ + │ -4 4 0 0 0 │ │ b │ + B = T · M · C = ┌ 2 3 4 ┐ · │ 6 -12 6 0 0 │ · │ c │ + quartic └ 1 t t t t ┘ │ -4 12 -12 4 0 │ │ d │ + └ 1 -4 6 -4 1 ┘ └ e ┘ diff --git a/docs/images/snippets/curvefitting/d39ca235454ced9681b523be056864d2.ascii b/docs/images/snippets/curvefitting/d39ca235454ced9681b523be056864d2.ascii new file mode 100644 index 00000000..4cf5c5e4 --- /dev/null +++ b/docs/images/snippets/curvefitting/d39ca235454ced9681b523be056864d2.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + 2 + E(C) = (p - Bézier(s )) + i i i diff --git a/docs/images/snippets/curvefitting/dd303afb51d580fb2bf1b914c010f83d.ascii b/docs/images/snippets/curvefitting/dd303afb51d580fb2bf1b914c010f83d.ascii new file mode 100644 index 00000000..2b38a216 --- /dev/null +++ b/docs/images/snippets/curvefitting/dd303afb51d580fb2bf1b914c010f83d.ascii @@ -0,0 +1,7 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + 2 2 + B = a (1-t) + 2 b (1-t) t + c t + quadratic + 2 2 2 + = a - 2at + at + 2bt - 2bt + ct diff --git a/docs/images/snippets/curvefitting/ff701138fd7a6e35700a2e1ee3e9c020.ascii b/docs/images/snippets/curvefitting/ff701138fd7a6e35700a2e1ee3e9c020.ascii new file mode 100644 index 00000000..17c63901 --- /dev/null +++ b/docs/images/snippets/curvefitting/ff701138fd7a6e35700a2e1ee3e9c020.ascii @@ -0,0 +1,7 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + B =a + quadratic + - 2at+ 2bt + 2 2 2 + + at - 2bt + ct diff --git a/docs/images/snippets/derivatives/02cecadc92b8ff681edc8edb0ace53ce.ascii b/docs/images/snippets/derivatives/02cecadc92b8ff681edc8edb0ace53ce.ascii new file mode 100644 index 00000000..27521999 --- /dev/null +++ b/docs/images/snippets/derivatives/02cecadc92b8ff681edc8edb0ace53ce.ascii @@ -0,0 +1,14 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + Bézier (t) = B (t) · w + B (t) · w + B (t) · w + B (t) · w + ... + n,k n,0 0 n,1 1 n,2 2 n,3 3 + d + Bézier (t) ── = n · (B (t) - B (t)) · w + + n,k dt n-1,-1 n-1,0 0 + n · (B (t) - B (t)) · w + + n-1,0 n-1,1 1 + n · (B (t) - B (t)) · w + + n-1,1 n-1,2 2 + n · (B (t) - B (t)) · w + + n-1,2 n-1,3 3 + ... diff --git a/docs/images/snippets/derivatives/153d99ce571bd664945394a1203a9eba.ascii b/docs/images/snippets/derivatives/153d99ce571bd664945394a1203a9eba.ascii new file mode 100644 index 00000000..6bafb566 --- /dev/null +++ b/docs/images/snippets/derivatives/153d99ce571bd664945394a1203a9eba.ascii @@ -0,0 +1,7 @@ + \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + __ n n-i i +Bézier(n,t) = ❯ \underset binomial term\underbrace\binomni · \ \underset polynomial term\underbrace(1-t) · t · \ \underset + ‾‾ i=0 + weight\underbracew + i diff --git a/docs/images/snippets/derivatives/171357d936dee742b43b9ffb7600c742.ascii b/docs/images/snippets/derivatives/171357d936dee742b43b9ffb7600c742.ascii new file mode 100644 index 00000000..c0002991 --- /dev/null +++ b/docs/images/snippets/derivatives/171357d936dee742b43b9ffb7600c742.ascii @@ -0,0 +1,5 @@ +\usepackageunicode-math \setmainfont[Ligatures=TeX]Linux Libertine O \setmathfontXITS Math + + d __ n-1 __ n-1 + Bézier (t) ── = ❯ n · B (t) · (w - w ) = ❯ B (t) · \underset вес производной \underbracen · (w - w ) + n,k dt ‾‾ k=0 n-1,k k+1 k ‾‾ k=0 n-1,k k+1 k diff --git a/docs/images/snippets/derivatives/2368534c6e964e6d4a54904cc99b8986.ascii b/docs/images/snippets/derivatives/2368534c6e964e6d4a54904cc99b8986.ascii new file mode 100644 index 00000000..4c419367 --- /dev/null +++ b/docs/images/snippets/derivatives/2368534c6e964e6d4a54904cc99b8986.ascii @@ -0,0 +1,7 @@ + \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + __ k k-i i +Bézier'(n,t) = ❯ \underset binomial term\underbrace\binomki · \ \underset polynomial term\underbrace(1-t) · t · \ \underset derivative + ‾‾ i=0 + weight\underbracen · (w - w ) , with k=n-1 + i+1 i diff --git a/docs/images/snippets/derivatives/2e90e21710bf1bcbbfecbb464d27244a.ascii b/docs/images/snippets/derivatives/2e90e21710bf1bcbbfecbb464d27244a.ascii new file mode 100644 index 00000000..fd6b9ea1 --- /dev/null +++ b/docs/images/snippets/derivatives/2e90e21710bf1bcbbfecbb464d27244a.ascii @@ -0,0 +1,7 @@ + \usepackageunicode-math \setmainfont[Ligatures=TeX]Linux Libertine O \setmathfontXITS Math + + __ k k-i i +Bézier'(n,t) = ❯ \undersetбиноминальный термин\underbrace\binomki · \ \undersetполиноминальный термин\underbrace(1-t) · t · \ + ‾‾ i=0 + \undersetвес производной\underbracen · (w - w ) , with k=n-1 + i+1 i diff --git a/docs/images/snippets/derivatives/3cd7b36839a248eb35f0b678d7bf5508.ascii b/docs/images/snippets/derivatives/3cd7b36839a248eb35f0b678d7bf5508.ascii new file mode 100644 index 00000000..17eccb78 --- /dev/null +++ b/docs/images/snippets/derivatives/3cd7b36839a248eb35f0b678d7bf5508.ascii @@ -0,0 +1,7 @@ + \usepackageunicode-math \setmainfont[Ligatures=TeX]Linux Libertine O \setmathfontXITS Math + + __ n n-i i +Bézier(n,t) = ❯ \underset биноминальный термин\underbrace\binomni · \ \underset полиноминальный термин\underbrace(1-t) · t · \ \underset + ‾‾ i=0 + вес\underbracew + i diff --git a/docs/images/snippets/derivatives/4eeb75f5de2d13a39f894625d3222443.ascii b/docs/images/snippets/derivatives/4eeb75f5de2d13a39f894625d3222443.ascii new file mode 100644 index 00000000..fec66bd6 --- /dev/null +++ b/docs/images/snippets/derivatives/4eeb75f5de2d13a39f894625d3222443.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + d __ n-1 __ n-1 + Bézier (t) ── = ❯ n · B (t) · (w - w ) = ❯ B (t) · \underset derivative weights \underbracen · (w - w ) + n,k dt ‾‾ k=0 n-1,k k+1 k ‾‾ k=0 n-1,k k+1 k diff --git a/docs/images/snippets/derivatives/5d7af72e00fb0390af5281d918d77055.ascii b/docs/images/snippets/derivatives/5d7af72e00fb0390af5281d918d77055.ascii new file mode 100644 index 00000000..df3609a0 --- /dev/null +++ b/docs/images/snippets/derivatives/5d7af72e00fb0390af5281d918d77055.ascii @@ -0,0 +1,6 @@ + \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + d +Bézier (t) ── = n · B (t) · (w - w ) + n · B (t) · (w - w ) + n · B (t) · (w - w ) + + n,k dt (n-1),\colorblue0 1 0 (n-1),\colorred1 2 1 (n-1),\colormagenta2 3 2 + ... diff --git a/docs/images/snippets/derivatives/869b60a8e6b992e6f62bc6a50b36deeb.ascii b/docs/images/snippets/derivatives/869b60a8e6b992e6f62bc6a50b36deeb.ascii new file mode 100644 index 00000000..85f341ff --- /dev/null +++ b/docs/images/snippets/derivatives/869b60a8e6b992e6f62bc6a50b36deeb.ascii @@ -0,0 +1,7 @@ + \usepackageunicode-math \setmainfont[Ligatures=TeX]Linux Libertine O \setmathfontXITS Math + + __ k k-i i +Bézier'(n,t) = ❯ \underset биноминальный термин\underbrace\binomki · \ \underset полиноминальный термин\underbrace(1-t) · t · \ + ‾‾ i=0 + \underset вес производной\underbracen · (w - w ) , with k=n-1 + i+1 i diff --git a/docs/images/snippets/derivatives/8f78fdb9ef54b1bc4dbc00f07263cc97.ascii b/docs/images/snippets/derivatives/8f78fdb9ef54b1bc4dbc00f07263cc97.ascii new file mode 100644 index 00000000..91f9ff0b --- /dev/null +++ b/docs/images/snippets/derivatives/8f78fdb9ef54b1bc4dbc00f07263cc97.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + __ n-1 + Bézier'(n,t) = ❯ Bézier(n-1,t) · n · (w -w ) + ‾‾ i=0 i i+1 i diff --git a/docs/images/snippets/derivatives/a7b79877822a8f60e45552dcafc0815d.ascii b/docs/images/snippets/derivatives/a7b79877822a8f60e45552dcafc0815d.ascii new file mode 100644 index 00000000..6585b9d4 --- /dev/null +++ b/docs/images/snippets/derivatives/a7b79877822a8f60e45552dcafc0815d.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + __ n-1 + Bézier'(n,t) = n · ❯ (b -b ) · Bézier(n-1,t) + ‾‾ i=0 i+1 i i diff --git a/docs/images/snippets/derivatives/bbe9d45ab271549dea5ef54982fcaaa5.ascii b/docs/images/snippets/derivatives/bbe9d45ab271549dea5ef54982fcaaa5.ascii new file mode 100644 index 00000000..cd0ec93e --- /dev/null +++ b/docs/images/snippets/derivatives/bbe9d45ab271549dea5ef54982fcaaa5.ascii @@ -0,0 +1,7 @@ + \usepackageunicode-math \setmainfont[Ligatures=TeX]Linux Libertine O \setmathfontXITS Math + + __ n n-i i +Bézier(n,t) = ❯ \undersetбиноминальный термин\underbrace\binomni · \ \undersetполиноминальный термин\underbrace(1-t) · t · \ + ‾‾ i=0 + \undersetвес\underbracew + i diff --git a/docs/images/snippets/explanation/29695045f04fd06c75bfda7845121213.ascii b/docs/images/snippets/explanation/29695045f04fd06c75bfda7845121213.ascii new file mode 100644 index 00000000..cd4a8901 --- /dev/null +++ b/docs/images/snippets/explanation/29695045f04fd06c75bfda7845121213.ascii @@ -0,0 +1,5 @@ +\usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontipaexm.ttf + + __ n n-i i + Bézier(n,t) = ❯ \underset 二項係数部分の項\underbrace\binomni · \ \underset 多項式部分の項\underbrace(1-t) · t + ‾‾ i=0 diff --git a/docs/images/snippets/explanation/39330ef5591cf0f3205564ad47255d4f.ascii b/docs/images/snippets/explanation/39330ef5591cf0f3205564ad47255d4f.ascii new file mode 100644 index 00000000..a1de268f --- /dev/null +++ b/docs/images/snippets/explanation/39330ef5591cf0f3205564ad47255d4f.ascii @@ -0,0 +1,7 @@ +\usepackageunicode-math \setmainfont[Ligatures=TeX]Linux Libertine O \setmathfontXITS Math + + линийный= (1-t) + t + 2 2 + квадратый= (1-t) + 2 · (1-t) · t + t + 3 2 2 3 + кубический= (1-t) + 3 · (1-t) · t + 3 · (1-t) · t + t diff --git a/docs/images/snippets/explanation/39d33ea94e7527ed221a809ca6054174.ascii b/docs/images/snippets/explanation/39d33ea94e7527ed221a809ca6054174.ascii new file mode 100644 index 00000000..389a9490 --- /dev/null +++ b/docs/images/snippets/explanation/39d33ea94e7527ed221a809ca6054174.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + __ n n-i i + Bézier(n,t) = ❯ \underset binomial term\underbrace\binomni · \ \underset polynomial term\underbrace(1-t) · t + ‾‾ i=0 diff --git a/docs/images/snippets/explanation/4bf2d790d2f50bf7767c948e0b9f9822.ascii b/docs/images/snippets/explanation/4bf2d790d2f50bf7767c948e0b9f9822.ascii new file mode 100644 index 00000000..de7e8f83 --- /dev/null +++ b/docs/images/snippets/explanation/4bf2d790d2f50bf7767c948e0b9f9822.ascii @@ -0,0 +1,7 @@ +\usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontipaexm.ttf + + 1次= (1-t) + t + 2 2 + 2次= (1-t) + 2 · (1-t) · t + t + 3 2 2 3 + 3次= (1-t) + 3 · (1-t) · t + 3 · (1-t) · t + t diff --git a/docs/images/snippets/explanation/4def87a6683264d420f84562776f4b6c.ascii b/docs/images/snippets/explanation/4def87a6683264d420f84562776f4b6c.ascii new file mode 100644 index 00000000..3cc491c8 --- /dev/null +++ b/docs/images/snippets/explanation/4def87a6683264d420f84562776f4b6c.ascii @@ -0,0 +1,8 @@ + \usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontipaexm.ttf + +1次= \colorbluea + \colorredb +2次= \colorbluea · \colorbluea + \colorbluea · \colorredb + \colorredb · \colorredb +3次= \colorbluea · \colorbluea · \colorbluea + \colorbluea · \colorbluea · \colorredb + \colorbluea · \colorredb · \colorredb + \colorredb · \c + + + olorredb · \colorredb diff --git a/docs/images/snippets/explanation/668d140df9db486e5ff2d7c127eaa9d4.ascii b/docs/images/snippets/explanation/668d140df9db486e5ff2d7c127eaa9d4.ascii new file mode 100644 index 00000000..ef6d3f1a --- /dev/null +++ b/docs/images/snippets/explanation/668d140df9db486e5ff2d7c127eaa9d4.ascii @@ -0,0 +1,5 @@ +\usepackageunicode-math \setmainfont[Ligatures=TeX]Linux Libertine O \setmathfontXITS Math + + __ n n-i i + Bézier(n,t) = ❯ \underset биноминальный термин\underbrace\binomni · \ \underset полиноминальный термин\underbrace(1-t) · t + ‾‾ i=0 diff --git a/docs/images/snippets/explanation/79832780f9209be5569447c4d988e54b.ascii b/docs/images/snippets/explanation/79832780f9209be5569447c4d988e54b.ascii new file mode 100644 index 00000000..7e4a09a6 --- /dev/null +++ b/docs/images/snippets/explanation/79832780f9209be5569447c4d988e54b.ascii @@ -0,0 +1,5 @@ +\usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontipaexm.ttf + + __ n n-i i + Bézier(n,t) = ❯ \underset 二項係数部分の項\underbrace\binomni · \ \underset 多項式部分の項\underbrace(1-t) · t + ‾‾ i=0 diff --git a/docs/images/snippets/explanation/7a44f3eaa167a5022e2281c62e90fff8.ascii b/docs/images/snippets/explanation/7a44f3eaa167a5022e2281c62e90fff8.ascii new file mode 100644 index 00000000..bf17a8c5 --- /dev/null +++ b/docs/images/snippets/explanation/7a44f3eaa167a5022e2281c62e90fff8.ascii @@ -0,0 +1,8 @@ + \usepackageunicode-math \setmainfont[Ligatures=TeX]Linux Libertine O \setmathfontXITS Math + + линийный= \colorbluea + \colorredb + квадратый= \colorbluea · \colorbluea + \colorbluea · \colorredb + \colorredb · \colorredb +кубический= \colorbluea · \colorbluea · \colorbluea + \colorbluea · \colorbluea · \colorredb + \colorbluea · \colorredb · \colorredb + \colorre + + + db · \colorredb · \colorredb diff --git a/docs/images/snippets/explanation/7f74178029422a35267fd033b392fe4c.ascii b/docs/images/snippets/explanation/7f74178029422a35267fd033b392fe4c.ascii new file mode 100644 index 00000000..ff567ba6 --- /dev/null +++ b/docs/images/snippets/explanation/7f74178029422a35267fd033b392fe4c.ascii @@ -0,0 +1,7 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + linear= (1-t) + t + 2 2 + square= (1-t) + 2 · (1-t) · t + t + 3 2 2 3 + cubic= (1-t) + 3 · (1-t) · t + 3 · (1-t) · t + t diff --git a/docs/images/snippets/explanation/9734aff037ac23a73504ff7cc846eab7.ascii b/docs/images/snippets/explanation/9734aff037ac23a73504ff7cc846eab7.ascii new file mode 100644 index 00000000..5c482a92 --- /dev/null +++ b/docs/images/snippets/explanation/9734aff037ac23a73504ff7cc846eab7.ascii @@ -0,0 +1,6 @@ +\usepackageunicode-math \setmainfont[Ligatures=TeX]Linux Libertine O \setmathfontXITS Math + + линийный= 1 + 1 + квадратый= 1 + 2 + 1 + кубический= 1 + 3 + 3 + 1 + квартический= 1 + 4 + 6 + 4 + 1 diff --git a/docs/images/snippets/explanation/9c921b7b8a8db831f787c1329e29f7cb.ascii b/docs/images/snippets/explanation/9c921b7b8a8db831f787c1329e29f7cb.ascii new file mode 100644 index 00000000..9284a2ad --- /dev/null +++ b/docs/images/snippets/explanation/9c921b7b8a8db831f787c1329e29f7cb.ascii @@ -0,0 +1,6 @@ +\usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontipaexm.ttf + + 1次= 1 + 1 + 2次= 1 + 2 + 1 + 3次= 1 + 3 + 3 + 1 + 4次= 1 + 4 + 6 + 4 + 1 diff --git a/docs/images/snippets/explanation/a5bb1312adc5e9e23bee6b47555a6e8f.ascii b/docs/images/snippets/explanation/a5bb1312adc5e9e23bee6b47555a6e8f.ascii new file mode 100644 index 00000000..553bf649 --- /dev/null +++ b/docs/images/snippets/explanation/a5bb1312adc5e9e23bee6b47555a6e8f.ascii @@ -0,0 +1,8 @@ + \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + +linear= \colorbluea + \colorredb +square= \colorbluea · \colorbluea + \colorbluea · \colorredb + \colorredb · \colorredb + cubic= \colorbluea · \colorbluea · \colorbluea + \colorbluea · \colorbluea · \colorredb + \colorbluea · \colorredb · \colorredb + \colorredb + + + · \colorredb · \colorredb diff --git a/docs/images/snippets/explanation/af40980136c291814e8970dc2a3d8e63.ascii b/docs/images/snippets/explanation/af40980136c291814e8970dc2a3d8e63.ascii new file mode 100644 index 00000000..271cd244 --- /dev/null +++ b/docs/images/snippets/explanation/af40980136c291814e8970dc2a3d8e63.ascii @@ -0,0 +1,6 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + linear= 1 + 1 + square= 1 + 2 + 1 + cubic= 1 + 3 + 3 + 1 + quartic= 1 + 4 + 6 + 4 + 1 diff --git a/docs/images/snippets/extended/08cd4a8bf4557862c095066728e6ed5e.ascii b/docs/images/snippets/extended/08cd4a8bf4557862c095066728e6ed5e.ascii new file mode 100644 index 00000000..cb9ef993 --- /dev/null +++ b/docs/images/snippets/extended/08cd4a8bf4557862c095066728e6ed5e.ascii @@ -0,0 +1,4 @@ +\usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontipaexm.ttf + + 混ぜ合わさった値 = a · 値 + (1 - a) · 値 + 1 2 diff --git a/docs/images/snippets/extended/4e0fa763b173e3a683587acf83733353.ascii b/docs/images/snippets/extended/4e0fa763b173e3a683587acf83733353.ascii new file mode 100644 index 00000000..a6d2320b --- /dev/null +++ b/docs/images/snippets/extended/4e0fa763b173e3a683587acf83733353.ascii @@ -0,0 +1,4 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + m = a · value + (1 - a) · value + 1 2 diff --git a/docs/images/snippets/extended/5a7a12213ca36f2f833e638ea0174d4a.ascii b/docs/images/snippets/extended/5a7a12213ca36f2f833e638ea0174d4a.ascii new file mode 100644 index 00000000..cf911ef2 --- /dev/null +++ b/docs/images/snippets/extended/5a7a12213ca36f2f833e638ea0174d4a.ascii @@ -0,0 +1,4 @@ +\usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontipaexm.ttf + + 混ぜ合わさった値 = a · 値 + b · 値 + 1 2 diff --git a/docs/images/snippets/extended/dfd6ded3f0addcf43e0a1581627a2220.ascii b/docs/images/snippets/extended/dfd6ded3f0addcf43e0a1581627a2220.ascii new file mode 100644 index 00000000..bf6e7bb5 --- /dev/null +++ b/docs/images/snippets/extended/dfd6ded3f0addcf43e0a1581627a2220.ascii @@ -0,0 +1,4 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + mixture = a · value + b · value + 1 2 diff --git a/docs/images/snippets/extremities/3125ab785fb039994582552790a2674b.ascii b/docs/images/snippets/extremities/3125ab785fb039994582552790a2674b.ascii new file mode 100644 index 00000000..cae6081b --- /dev/null +++ b/docs/images/snippets/extremities/3125ab785fb039994582552790a2674b.ascii @@ -0,0 +1,7 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌────────┐ + │ 2 + 2 -b ±⟍│b - 4ac + Given f(t) = at + bt + c, f(t)=0 when t = ─────────────── + 2a diff --git a/docs/images/snippets/extremities/bf0ad4611c47f8548396e40595c02b55.ascii b/docs/images/snippets/extremities/bf0ad4611c47f8548396e40595c02b55.ascii new file mode 100644 index 00000000..98718442 --- /dev/null +++ b/docs/images/snippets/extremities/bf0ad4611c47f8548396e40595c02b55.ascii @@ -0,0 +1,6 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + B(t) uses { p ,p ,p ,p } + 1 2 3 4 + B'(t) uses { v ,v ,v }, where v = 3(p -p ), v = 3(p -p ), v = 3(p -p ) + 1 2 3 1 2 1 2 3 2 3 4 3 diff --git a/docs/images/snippets/inflections/35299f4eb8e0bed76b68c7beb2038031.ascii b/docs/images/snippets/inflections/35299f4eb8e0bed76b68c7beb2038031.ascii new file mode 100644 index 00000000..2e8de6e9 --- /dev/null +++ b/docs/images/snippets/inflections/35299f4eb8e0bed76b68c7beb2038031.ascii @@ -0,0 +1,10 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + 3 2 2 3 + Bézier(t) = x (1-t) + 3x (1-t) t + 3x (1-t)t + x t + 1 2 3 4 + \prime 2 2 + Bézier (t) = a(1-t) + 2b(1-t)t + ct { a=3(x -x ),b=3(x -x ),c=3(x -x ) } + 2 1 3 2 4 3 + \prime\prime + Bézier (t) = u(1-t) + vt {u=2(b-a),v=2(c-b)}\ diff --git a/docs/images/snippets/inflections/8278b9bec92ae49927283396692b51d5.ascii b/docs/images/snippets/inflections/8278b9bec92ae49927283396692b51d5.ascii new file mode 100644 index 00000000..d6e925a0 --- /dev/null +++ b/docs/images/snippets/inflections/8278b9bec92ae49927283396692b51d5.ascii @@ -0,0 +1,9 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + 3 2 2 3 + Bézier(t) = y (1-t) + 3y (1-t) t + 3y (1-t)t + y t + 1 2 3 4 + \prime 2 2 + Bézier (t) = d(1-t) + 2e(1-t)t + ft + \prime\prime + Bézier (t) = w(1-t) + zt diff --git a/docs/images/snippets/inflections/852f0346f025c671b8a1ce6b628028aa.ascii b/docs/images/snippets/inflections/852f0346f025c671b8a1ce6b628028aa.ascii new file mode 100644 index 00000000..08c35d78 --- /dev/null +++ b/docs/images/snippets/inflections/852f0346f025c671b8a1ce6b628028aa.ascii @@ -0,0 +1,4 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + C(t) = Bézier \prime(t) · Bézier \prime\prime(t) - Bézier \prime(t) · Bézier \prime\prime(t) + x y y x diff --git a/docs/images/snippets/matrixsplit/206f539367fa1aaefc230709e4f2068e.ascii b/docs/images/snippets/matrixsplit/206f539367fa1aaefc230709e4f2068e.ascii new file mode 100644 index 00000000..0cc1d356 --- /dev/null +++ b/docs/images/snippets/matrixsplit/206f539367fa1aaefc230709e4f2068e.ascii @@ -0,0 +1,8 @@ +\usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontipaexm.ttf + + ┌ P ┐ + │ 1 │ + = ┌ 2 ┐ · M \underset …こうじゃ!\underbrace \kern 1.25em · \kern 1.25em Q \kern 1.25em · \kern 1.25em │ P │ + └ 1 t t ┘ │ 2 │ + │ P │ + └ 3 ┘ diff --git a/docs/images/snippets/matrixsplit/266b71339b55ad3a312a9f41e6bcf988.ascii b/docs/images/snippets/matrixsplit/266b71339b55ad3a312a9f41e6bcf988.ascii new file mode 100644 index 00000000..42df6a71 --- /dev/null +++ b/docs/images/snippets/matrixsplit/266b71339b55ad3a312a9f41e6bcf988.ascii @@ -0,0 +1,8 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ P ┐ + │ 1 │ + = ┌ 2 ┐ · M \underset ...to get this!\underbrace \kern 1.25em · \kern 1.25em Q \kern 1.25em · \kern 1.25em │ P │ + └ 1 t t ┘ │ 2 │ + │ P │ + └ 3 ┘ diff --git a/docs/images/snippets/matrixsplit/4549b95450db3c73479e8902e4939427.ascii b/docs/images/snippets/matrixsplit/4549b95450db3c73479e8902e4939427.ascii new file mode 100644 index 00000000..4e981e34 --- /dev/null +++ b/docs/images/snippets/matrixsplit/4549b95450db3c73479e8902e4939427.ascii @@ -0,0 +1,8 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ P ┐ + -1 │ 1 │ + = ┌ 2 ┐ · \underset into this...\underbrace M · M · Z · M · │ P │ + └ 1 t t ┘ │ 2 │ + │ P │ + └ 3 ┘ diff --git a/docs/images/snippets/matrixsplit/8349aa18563bb43427ae2383f1e212ae.ascii b/docs/images/snippets/matrixsplit/8349aa18563bb43427ae2383f1e212ae.ascii new file mode 100644 index 00000000..f845e1fd --- /dev/null +++ b/docs/images/snippets/matrixsplit/8349aa18563bb43427ae2383f1e212ae.ascii @@ -0,0 +1,8 @@ +\usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontipaexm.ttf + + ┌ P ┐ + │ 1 │ + = ┌ 2 ┐ · \underset これを…\underbrace\kern 2.25em Z · M \kern 2.25em · │ P │ + └ 1 t t ┘ │ 2 │ + │ P │ + └ 3 ┘ diff --git a/docs/images/snippets/matrixsplit/aa17f7e82cf50498f90deb6a21a2489a.ascii b/docs/images/snippets/matrixsplit/aa17f7e82cf50498f90deb6a21a2489a.ascii new file mode 100644 index 00000000..34b7315b --- /dev/null +++ b/docs/images/snippets/matrixsplit/aa17f7e82cf50498f90deb6a21a2489a.ascii @@ -0,0 +1,8 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ P ┐ + │ 1 │ + = ┌ 2 ┐ · \underset we turn this...\underbrace\kern 2.25em Z · M \kern 2.25em · │ P │ + └ 1 t t ┘ │ 2 │ + │ P │ + └ 3 ┘ diff --git a/docs/images/snippets/matrixsplit/da4ebf090f84d9b5d48b0f1e79bb3e7b.ascii b/docs/images/snippets/matrixsplit/da4ebf090f84d9b5d48b0f1e79bb3e7b.ascii new file mode 100644 index 00000000..7bc93369 --- /dev/null +++ b/docs/images/snippets/matrixsplit/da4ebf090f84d9b5d48b0f1e79bb3e7b.ascii @@ -0,0 +1,8 @@ +\usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontipaexm.ttf + + ┌ P ┐ + -1 │ 1 │ + = ┌ 2 ┐ · \underset …こうして…\underbrace M · M · Z · M · │ P │ + └ 1 t t ┘ │ 2 │ + │ P │ + └ 3 ┘ diff --git a/docs/images/snippets/molding/2e65bc9c934380c2de6a24bcd5c1c7b7.ascii b/docs/images/snippets/molding/2e65bc9c934380c2de6a24bcd5c1c7b7.ascii new file mode 100644 index 00000000..4da8e4ab --- /dev/null +++ b/docs/images/snippets/molding/2e65bc9c934380c2de6a24bcd5c1c7b7.ascii @@ -0,0 +1,6 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + C - B B - C + A = B - ────────── = B + ────────── + ratio(t) ratio(t) + q q diff --git a/docs/images/snippets/molding/48887d68a861a0acdf8313e23fb19880.ascii b/docs/images/snippets/molding/48887d68a861a0acdf8313e23fb19880.ascii new file mode 100644 index 00000000..25ab67d6 --- /dev/null +++ b/docs/images/snippets/molding/48887d68a861a0acdf8313e23fb19880.ascii @@ -0,0 +1,4 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + C = u(t) · Start + (1-u(t) ) · End + q q diff --git a/docs/images/snippets/pointvectors/33afd1a141ec444989c393b3e51ec9ca.ascii b/docs/images/snippets/pointvectors/33afd1a141ec444989c393b3e51ec9ca.ascii new file mode 100644 index 00000000..a21a609d --- /dev/null +++ b/docs/images/snippets/pointvectors/33afd1a141ec444989c393b3e51ec9ca.ascii @@ -0,0 +1,16 @@ +\usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontipaexm.ttf + + ┌─────────────────┐ + │ 2 2 + d = \| tangent(t)\| = │B' (t) + B' (t) + ⟍│ x y + + tangent (t) B' (t) + ^ x x + x(t) = \| tangent (t)\| =─────────────── = ────── + x \| tangent(t)\| d + + tangent (t) B' (t) + ^ y y + y(t) = \| tangent (t)\| = ─────────────── = ────── + y \| tangent(t)\| d diff --git a/docs/images/snippets/pointvectors/4d89f0042fc367f1614537c7f05389fb.ascii b/docs/images/snippets/pointvectors/4d89f0042fc367f1614537c7f05389fb.ascii new file mode 100644 index 00000000..25b4285d --- /dev/null +++ b/docs/images/snippets/pointvectors/4d89f0042fc367f1614537c7f05389fb.ascii @@ -0,0 +1,16 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌─────────────────┐ + │ 2 2 + d = \|tangent(t)\| = │B' (t) + B' (t) + ⟍│ x y + + tangent (t) B' (t) + ^ x x + x(t) = \| tangent (t)\| =────────────── = ────── + x \|tangent(t)\| d + + tangent (t) B' (t) + ^ y y + y(t) = \| tangent (t)\| = ────────────── = ────── + y \|tangent(t)\| d diff --git a/docs/images/snippets/pointvectors/afdd2dbe7690ed09ea91df63471b480b.ascii b/docs/images/snippets/pointvectors/afdd2dbe7690ed09ea91df63471b480b.ascii new file mode 100644 index 00000000..5f6e0673 --- /dev/null +++ b/docs/images/snippets/pointvectors/afdd2dbe7690ed09ea91df63471b480b.ascii @@ -0,0 +1,9 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ^ \pi ^ \pi ^ + normal (t) = x(t) · cos ─── - y(t) · sin ─── = - y(t) + x 2 2 + + ^ \pi ^ \pi ^ + normal (t) = \undersetquarter circle rotation \underbrace x(t) · sin ─── + y(t) · cos ─── = x(t) + y 2 2 diff --git a/docs/images/snippets/pointvectors/c3d5f3506b763b718e567f90dbb78324.ascii b/docs/images/snippets/pointvectors/c3d5f3506b763b718e567f90dbb78324.ascii new file mode 100644 index 00000000..4585c7ae --- /dev/null +++ b/docs/images/snippets/pointvectors/c3d5f3506b763b718e567f90dbb78324.ascii @@ -0,0 +1,9 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ^ \pi ^ \pi ^ + normal (t) = x(t) · cos ─── - y(t) · sin ─── = - y(t) + x 2 2 + + ^ \pi ^ \pi ^ + normal (t) = \underset quarter circle rotation \underbrace x(t) · sin ─── + y(t) · cos ─── = x(t) + y 2 2 diff --git a/docs/images/snippets/pointvectors/da069c7d6cbdb516c5454371dae84e7f.ascii b/docs/images/snippets/pointvectors/da069c7d6cbdb516c5454371dae84e7f.ascii new file mode 100644 index 00000000..37b640a4 --- /dev/null +++ b/docs/images/snippets/pointvectors/da069c7d6cbdb516c5454371dae84e7f.ascii @@ -0,0 +1,7 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + tangent (t) = B' (t) + x x + + tangent (t) = B' (t) + y y diff --git a/docs/images/snippets/polybezier/2249056953a47ab1944bb5a41dcbed8c.ascii b/docs/images/snippets/polybezier/2249056953a47ab1944bb5a41dcbed8c.ascii new file mode 100644 index 00000000..36d62e0d --- /dev/null +++ b/docs/images/snippets/polybezier/2249056953a47ab1944bb5a41dcbed8c.ascii @@ -0,0 +1,6 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ┌ B + (B - A ) ┐ ┌ 2B - A ┐ + Mirrored = │ x x x │ = │ x x │ + │ B + (B - A ) │ │ 2B - A │ + └ y y y ┘ └ y y ┘ diff --git a/docs/images/snippets/reordering/0cf0d5f856ec204dc32e0e42691cc70a.ascii b/docs/images/snippets/reordering/0cf0d5f856ec204dc32e0e42691cc70a.ascii new file mode 100644 index 00000000..087ea198 --- /dev/null +++ b/docs/images/snippets/reordering/0cf0d5f856ec204dc32e0e42691cc70a.ascii @@ -0,0 +1,6 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + Bézier(n,t)= (1-t) B(n,t) + t B(n,t) + __ n n __ n n + = ❯ w (1 - t) B (t) + ❯ w t B (t) + ‾‾ i=0 i i ‾‾ i=0 i i diff --git a/docs/images/snippets/reordering/74e038deabd9e240606fa3f07ba98269.ascii b/docs/images/snippets/reordering/74e038deabd9e240606fa3f07ba98269.ascii new file mode 100644 index 00000000..da33d525 --- /dev/null +++ b/docs/images/snippets/reordering/74e038deabd9e240606fa3f07ba98269.ascii @@ -0,0 +1,9 @@ + \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + __ k k-i i +Bézier(k,t) = ❯ \underset binomial term\underbrace\binomki · \ \underset polynomial term\underbrace(1-t) · t · \ \underset new + ‾‾ i=0 + ╭ (k-i) · w + i · w ╮ + │ i i-1 │ + weights\underbrace│ ─────────────────────── │ , with k = n+1 and w =0 when i = 0 + ╰ k ╯ i-1 diff --git a/docs/images/snippets/reordering/9fc4ecc087d389dd0111bcba165cd5d0.ascii b/docs/images/snippets/reordering/9fc4ecc087d389dd0111bcba165cd5d0.ascii new file mode 100644 index 00000000..1fa197dc --- /dev/null +++ b/docs/images/snippets/reordering/9fc4ecc087d389dd0111bcba165cd5d0.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + __ n n n n-i i + Bézier(n,t) = ❯ w B (t) , where B (t) = \binomni · (1-t) · t + ‾‾ i=0 i i i diff --git a/docs/images/snippets/weightcontrol/55f079880a77c126c70106e62ff941d9.ascii b/docs/images/snippets/weightcontrol/55f079880a77c126c70106e62ff941d9.ascii new file mode 100644 index 00000000..28f15b93 --- /dev/null +++ b/docs/images/snippets/weightcontrol/55f079880a77c126c70106e62ff941d9.ascii @@ -0,0 +1,9 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + __ n n-i i + ❯ \binomni · (1-t) · t · w · \colorblueratio + ‾‾ i=0 i i + Rational Bézier(n,t) = ─────────────────────────────────────────────────────────── + __ n n-i i + \colorblue ❯ \binomni · (1-t) · t · ratio + ‾‾ i=0 i diff --git a/docs/images/snippets/weightcontrol/ceac4259d2aed0767c7765d2237ca1a3.ascii b/docs/images/snippets/weightcontrol/ceac4259d2aed0767c7765d2237ca1a3.ascii new file mode 100644 index 00000000..f1659f8a --- /dev/null +++ b/docs/images/snippets/weightcontrol/ceac4259d2aed0767c7765d2237ca1a3.ascii @@ -0,0 +1,5 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + __ n n-i i + Bézier(n,t) = ❯ \binomni · (1-t) · t · w + ‾‾ i=0 i diff --git a/docs/images/snippets/whatis/3437a38af1218ca206e921e48678c07e.ascii b/docs/images/snippets/whatis/3437a38af1218ca206e921e48678c07e.ascii new file mode 100644 index 00000000..fc0843cf --- /dev/null +++ b/docs/images/snippets/whatis/3437a38af1218ca206e921e48678c07e.ascii @@ -0,0 +1,11 @@ +\usepackagexeCJK \xeCJKsetupCJKmath=true \setCJKmainfontipaexm.ttf + + ╭ p = 一方の点 ╮ + │ 1 │ + │ p = もう一方の点 │ + │ 2 │ + │ 距離= (p - p ) │ のとき、新しい点 = p + 距離 · 比率 + │ 2 1 │ 1 + │ 百分率 │ + │ 比率= ──── │ + ╰ 100 ╯ diff --git a/docs/images/snippets/whatis/35964d0485747082c0a8bedc0a16822b.ascii b/docs/images/snippets/whatis/35964d0485747082c0a8bedc0a16822b.ascii new file mode 100644 index 00000000..c118242f --- /dev/null +++ b/docs/images/snippets/whatis/35964d0485747082c0a8bedc0a16822b.ascii @@ -0,0 +1,11 @@ +\usepackageunicode-math \setmainfont[Ligatures=TeX]Linux Libertine O \setmathfontXITS Math + + ╭ p = неикая точка ╮ + │ 1 │ + │ p = неикая другая точка │ + │ 2 │ + Дано │ расстояние= (p - p ) │, наша новая точка = p + расстояние · соотношение + │ 2 1 │ 1 + │ процентаж │ + │ соотношение= ────────── │ + ╰ 100 ╯ diff --git a/docs/images/snippets/whatis/c7f8cdd755d744412476b87230d0400d.ascii b/docs/images/snippets/whatis/c7f8cdd755d744412476b87230d0400d.ascii new file mode 100644 index 00000000..3a98fb94 --- /dev/null +++ b/docs/images/snippets/whatis/c7f8cdd755d744412476b87230d0400d.ascii @@ -0,0 +1,11 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + ╭ p = some point ╮ + │ 1 │ + │ p = some other point │ + │ 2 │ + Given │ distance= (p - p ) │, our new point = p + distance · ratio + │ 2 1 │ 1 + │ percentage │ + │ ratio= ─────────── │ + ╰ 100 ╯ diff --git a/docs/images/snippets/yforx/021718d3b46893b271f90083ccdceaf8.ascii b/docs/images/snippets/yforx/021718d3b46893b271f90083ccdceaf8.ascii new file mode 100644 index 00000000..6bdb24e2 --- /dev/null +++ b/docs/images/snippets/yforx/021718d3b46893b271f90083ccdceaf8.ascii @@ -0,0 +1,4 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + 3 2 + x(t) = (-a + 3b- 3c + d)t + (3a - 6b + 3c)t + (-3a + 3b)t + a diff --git a/docs/images/snippets/yforx/058a76e3e7d67c03f733e075829a6252.ascii b/docs/images/snippets/yforx/058a76e3e7d67c03f733e075829a6252.ascii new file mode 100644 index 00000000..64fa9f99 --- /dev/null +++ b/docs/images/snippets/yforx/058a76e3e7d67c03f733e075829a6252.ascii @@ -0,0 +1,4 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + 3 2 + (-a + 3b - 3c + d)t + (3a - 6b + 3c)t + (-3a + 3b)t + (a-x) = 0 diff --git a/docs/images/snippets/yforx/378d0fd8cefa688d530ac38930d66844.ascii b/docs/images/snippets/yforx/378d0fd8cefa688d530ac38930d66844.ascii new file mode 100644 index 00000000..57a30ec8 --- /dev/null +++ b/docs/images/snippets/yforx/378d0fd8cefa688d530ac38930d66844.ascii @@ -0,0 +1,4 @@ +\setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math + + 3 2 2 3 + x(t) = a(1-t) + 3b(1-t) t + 3c(1-t)t + dt diff --git a/docs/index.html b/docs/index.html index 0071c3b1..6da63a68 100644 --- a/docs/index.html +++ b/docs/index.html @@ -38,7 +38,7 @@ - + @@ -537,17 +537,17 @@ - +

So let's look at that in action: the following graphic is interactive in that you can use your up and down arrow keys to increase or decrease the interpolation ratio, to see what happens. We start with three points, which gives us two lines. Linear interpolation over @@ -689,15 +689,15 @@ @@ -731,19 +731,19 @@ and remove the weights for a moment, we get this:

@@ -755,14 +755,14 @@ square= \colorbluea · \colorbluea + \colorbluea · \colorredb + \colorredb @@ -1047,15 +1047,15 @@ function Bezier(3,t): called "weights", and we can add them to our original Bézier function:

- +

That looks complicated, but as it so happens, the "weights" are actually just the coordinate values we want our curve to have: for an nth order curve, w0 is our start coordinate, wn is our last coordinate, and everything in between @@ -1197,7 +1197,7 @@ function Bezier(3,t,w[]): --> @@ -1394,10 +1394,10 @@ function RationalBezier(3,t,w[],r[]): - +

The obvious start and end values here need to be a=1, b=0, so that the mixed value is 100% value 1, and 0% value 2, and a=0, b=1, so that the mixed value is 0% value 1 and 100% value 2. Additionally, we don't want "a" and "b" to be independent: @@ -1409,10 +1409,10 @@ function RationalBezier(3,t,w[],r[]): - +

With this we can guarantee that we never sum above 100%. By restricting a to values in the interval [0,1], we will always be somewhere between our two values (inclusively), and we will always sum to a 100% mix. @@ -2106,16 +2106,16 @@ function drawCurve(points[], t): - +

However, this rule also has as direct consequence that you cannot generally safely lower a curve from nth order to (n-1)th order, because the control points cannot be "pulled apart" cleanly. We can @@ -2545,11 +2545,11 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse - +

Then, we apply one of those silly (actually, super useful) calculus tricks: since our t value is always between zero and one (inclusive), we know that (1-t) plus t always sums to 1. As such, we can express any value as a sum of @@ -2568,12 +2568,12 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse - +

So far so good. Now, to see why we did this, let's write out the (1-t) and t parts, and see what that gives us. I promise, it's about to make sense. We start with (1-t): @@ -2794,12 +2794,12 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math __ n-1 - Bézier'(n,t) = n · ❯ (b -b ) · Bézier(n-1,t) - ‾‾ i=0 i+1 i i + Bézier'(n,t) = n · ❯ (b -b ) · Bézier(n-1,t) + ‾‾ i=0 i+1 i i -->

And that's just a summation of lower order curves:

@@ -3119,9 +3119,9 @@ Bézier'(n,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \unders -->

@@ -3129,27 +3129,27 @@ Bézier'(n,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \unders point, and then do whatever it is we want to do based on those directions:

@@ -3162,16 +3162,16 @@ Bézier'(n,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \unders \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ^ \pi ^ \pi ^ - normal (t) = x(t) · cos ─── - y(t) · sin ─── = - y(t) + normal (t) = x(t) · cos ─── - y(t) · sin ─── = - y(t) x 2 2 - - ^ \pi ^ \pi ^ - normal (t) = \undersetquarter circle rotation \underbrace x(t) · sin ─── + y(t) · cos ─── = x(t) - y 2 2 + + ^ \pi ^ \pi ^ + normal (t) = \underset quarter circle rotation \underbrace x(t) · sin ─── + y(t) · cos ─── = x(t) + y 2 2 --> frames: @@ -3735,14 +3735,14 @@ generateRMFrames(steps) -> frames: - +

Okay, well, that looks plain ridiculous, but: notice that every coordinate value is being offset by the initial translation, and also notice that a lot of terms in that expression are repeated. Even though the maths looks crazy as a single expression, we can just @@ -5064,18 +5064,20 @@ function getCubicRoots(pa, pb, pc, pd) { - +

We can rewrite this to a plain polynomial form, by just fully writing out the expansion and then collecting the polynomial factors, as:

- +

Nothing special here: that's a standard cubic polynomial in "power" form (i.e. all the terms are ordered by their power of t). So, given that a, b, c, d, and x(t) are all @@ -5084,9 +5086,10 @@ function getCubicRoots(pa, pb, pc, pd) { - +

You might be wondering "where did all the other 'minus x' for all the other values a, b, c, and d go?" and the answer there is that they all cancel out, so the only one we actually need to subtract is the one at the end. Handy! So now we just solve this equation using @@ -5183,7 +5186,7 @@ y = curve.get(t).y - +

This formula says that the length of a parametric curve is in fact equal to the area underneath a function that looks a remarkable amount like Pythagoras' rule for computing the diagonal of a straight angled triangle. This sounds pretty simple, right? Sadly, @@ -5214,13 +5217,13 @@ y = curve.get(t).y - +

In plain text: an integral function can always be treated as the sum of an (infinite) number of (infinitely thin) rectangular strips sitting "under" the function's plotted graph. To illustrate this idea, the following graph shows the integral for a sinusoid function. The @@ -5990,10 +5993,10 @@ lli = function(line1, line2): - +

If we can figure out what the function u(t) looks like, we'll be done. Although we do need to remember that this u(t) will have a different form depending on whether we're working with quadratic or cubic curves. @@ -6005,24 +6008,24 @@ lli = function(line1, line2): - +

And

- +

So, if we know the start and end coordinates and the t value, we know C without having to calculate the A or even B coordinates. In fact, we can do the same for the ratio function. As another function of t, we technically @@ -6033,33 +6036,33 @@ lli = function(line1, line2): - +

Working out the maths for this, we see the following two formulae for quadratic and cubic curves:

- +

And

- +

Which now leaves us with some powerful tools: given three points (start, end, and "some point on the curve"), as well as a t value, we can construct curves. We can compute C using the start and end points and our @@ -6069,11 +6072,11 @@ lli = function(line1, line2): - +

With A found, finding e1 and e2 for quadratic curves is a matter of running the linear interpolation with t between start and A to yield e1, and between A and end to yield @@ -6098,16 +6101,16 @@ lli = function(line1, line2): - +

So: if we have a curve's start and end points, then for any t value we implicitly know all the ABC values, which (combined with an educated guess on appropriate e1 and e2 coordinates for cubic curves) gives us the necessary information @@ -6393,12 +6396,12 @@ for (coordinate, index) in LUT: @@ -6406,7 +6409,7 @@ for (coordinate, index) in LUT: - +

And then the associated A:

- +

And we're done, because that's our new quadratic control point!

@@ -6832,16 +6835,16 @@ findClosest(start, p, r, LUT): @@ -6855,13 +6858,13 @@ findClosest(start, p, r, LUT): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ┌ a 0 0 ┐ ┌ 1 0 0 ┐ ┌ a ┐ - B = T · M · C = ┌ 2 ┐ · │ -2a 2b 0 │ = ┌ 2 ┐ · │ -2 2 0 │ · │ b │ + B = T · M · C = ┌ 2 ┐ · │ -2a 2b 0 │ = ┌ 2 ┐ · │ -2 2 0 │ · │ b │ quadratic └ 1 t t ┘ └ a -2b c ┘ └ 1 t t ┘ └ 1 -2 1 ┘ └ c ┘ --> @@ -6869,14 +6872,14 @@ findClosest(start, p, r, LUT): @@ -6884,18 +6887,18 @@ findClosest(start, p, r, LUT): @@ -6904,14 +6907,14 @@ findClosest(start, p, r, LUT): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ┌ 1 0 0 0 ┐ ┌ a ┐ - B = T · M · C = ┌ 2 3 ┐ · │ -3 3 0 0 │ · │ b │ + B = T · M · C = ┌ 2 3 ┐ · │ -3 3 0 0 │ · │ b │ cubic └ 1 t t t ┘ │ 3 -6 3 0 │ │ c │ └ -1 3 -3 1 ┘ └ d ┘ --> @@ -6921,14 +6924,14 @@ findClosest(start, p, r, LUT): ┌ 1 0 0 0 0 ┐ ┌ a ┐ │ -4 4 0 0 0 │ │ b │ - B = T · M · C = ┌ 2 3 4 ┐ · │ 6 -12 6 0 0 │ · │ c │ + B = T · M · C = ┌ 2 3 4 ┐ · │ 6 -12 6 0 0 │ · │ c │ quartic └ 1 t t t t ┘ │ -4 12 -12 4 0 │ │ d │ └ 1 -4 6 -4 1 ┘ └ e ┘ --> @@ -7031,13 +7034,13 @@ findClosest(start, p, r, LUT): @@ -7430,18 +7433,18 @@ for p = 1 to points.length-3 (inclusive): @@ -7984,19 +7987,19 @@ for p = 1 to points.length-3 (inclusive): @@ -8004,19 +8007,19 @@ for p = 1 to points.length-3 (inclusive): @@ -8109,7 +8112,7 @@ for p = 1 to points.length-3 (inclusive): │ B + (B - A ) │ │ 2B - A │ └ y y y ┘ └ y y ┘ --> - +

So let's implement that and see what it gets us. The following two graphics show a quadratic and a cubic poly-Bézier curve again, but this time moving the control points around moves others, too. However, you might see something unexpected going on for quadratic curves... @@ -8895,13 +8898,13 @@ for p = 1 to points.length-3 (inclusive): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ╭ 1 ╮ 1 4 - ||A,C|| = d + d = d + d · ratio │ ─ │ = d + ─d = ─d - 2 1 2 2 3 ╰ 2 ╯ 2 3 2 3 2 + ||A,C|| = d + d = d + d · ratio │ ─ │ = d + ─d = ─d + 2 1 2 2 3 ╰ 2 ╯ 2 3 2 3 2 --> @@ -9049,14 +9052,14 @@ for p = 1 to points.length-3 (inclusive): @@ -9064,14 +9067,14 @@ for p = 1 to points.length-3 (inclusive): @@ -9314,13 +9317,13 @@ for p = 1 to points.length-3 (inclusive): - +

So this is where we see the interpolation: N(t) for an (i,k) pair (that is, for a step in the above summation, on a specific knot interval) is a mix between N(t) for (i,k-1) and N(t) for (i+1,k-1), so we see that this is a recursive @@ -9330,11 +9333,11 @@ for p = 1 to points.length-3 (inclusive): - +

And this function finally has a straight up evaluation: if a t value lies within a knot-specific interval once we reach a k=1 value, it "counts", otherwise it doesn't. We did cheat a little, though, because for all these values we need to scale @@ -9366,11 +9369,11 @@ for p = 1 to points.length-3 (inclusive): - +

That looks complicated, but it's not. Computing alpha is just a fraction involving known, plain numbers. And, once we have our alpha value, we also have (1-alpha) because it's a trivial subtraction. Computing the d() function is thus mostly a @@ -9381,11 +9384,11 @@ for p = 1 to points.length-3 (inclusive): - +

So, we actually see two stopping conditions: either i becomes 0, in which case d() is zero, or k becomes zero, in which case we get the same "either 1 or 0" that we saw in the N() function above. diff --git a/docs/ja-JP/index.html b/docs/ja-JP/index.html index 0e81940d..68fe1327 100644 --- a/docs/ja-JP/index.html +++ b/docs/ja-JP/index.html @@ -41,7 +41,7 @@ - + @@ -530,17 +530,17 @@ - +

では、実際に見てみましょう。下の図はインタラクティブになっています。上下キーで補間の比率が増減しますので、どうなるか確かめてみましょう。最初に3点があり、それを結んで2本の直線が引かれています。この直線の上でそれぞれ線形補間を行うと、2つの点が得られます。この2点の間でさらに線形補間を行うと、1つの点を得ることができます。そして、あらゆる比率に対して同様に点を求め、それをすべて集めると、このようにベジエ曲線ができるのです。

@@ -667,16 +667,16 @@ @@ -686,16 +686,16 @@

@@ -705,19 +705,19 @@ 多項式部分の項がどうなっているのか、同じぐらい簡単な方法で考えることができます。仮に、(1-t)aに、tbに書き換え、さらに重みを一旦削除してしまえば、このようになります。

@@ -727,13 +727,13 @@ - +

複雑そうに見えますが、運がいいことに「重み」というのは実はただの座標値です。というのはn次の曲線の場合、w0が始点の座標、wnが終点の座標となり、その間はどれも制御点の座標になります。例えば、始点が(120,160)、制御点が(35,200)と(220,260)、終点が(220,40)となる3次ベジエ曲線は、次のようになります。

@@ -1165,7 +1165,7 @@ function Bezier(3,t,w[]): --> @@ -1367,10 +1367,10 @@ function RationalBezier(3,t,w[],r[]): - +

明らかに、始点ではa=1, b=0とする必要があります。こうすれば、値1が100%、値2が0%で混ぜ合わさるからです。また、終点ではa=0, b=1 - +

こうすれば、和が100%を超えることはないと保証できます。aの値を区間[0,1]に制限してしまえば、混ぜ合わさった値は常に2つの値の間のどこか(両端を含む)になり、また和は常に100%になります。

@@ -2070,14 +2070,14 @@ function drawCurve(points[], t): ┌ P ┐ │ 1 │ - = ┌ 2 ┐ · \undersetこれを…\underbrace\kern 2.25em Z · M \kern 2.25em · │ P │ - └ 1 t t ┘ │ 2 │ + = ┌ 2 ┐ · \underset これを…\underbrace\kern 2.25em Z · M \kern 2.25em · │ P │ + └ 1 t t ┘ │ 2 │ │ P │ └ 3 ┘ --> - +

However, this rule also has as direct consequence that you cannot generally safely lower a curve from nth order to (n-1)th order, because the control points cannot be "pulled apart" cleanly. We can @@ -2494,11 +2494,11 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse - +

Then, we apply one of those silly (actually, super useful) calculus tricks: since our t value is always between zero and one (inclusive), we know that (1-t) plus t always sums to 1. As such, we can express any value as a sum of @@ -2517,12 +2517,12 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse - +

So far so good. Now, to see why we did this, let's write out the (1-t) and t parts, and see what that gives us. I promise, it's about to make sense. We start with (1-t): @@ -2750,12 +2750,12 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math __ n-1 - Bézier'(n,t) = n · ❯ (b -b ) · Bézier(n-1,t) - ‾‾ i=0 i+1 i i + Bézier'(n,t) = n · ❯ (b -b ) · Bézier(n-1,t) + ‾‾ i=0 i+1 i i -->

And that's just a summation of lower order curves:

@@ -3075,9 +3075,9 @@ Bézier'(n,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \unders -->

@@ -3085,27 +3085,27 @@ Bézier'(n,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \unders point, and then do whatever it is we want to do based on those directions:

@@ -3118,16 +3118,16 @@ Bézier'(n,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \unders \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ^ \pi ^ \pi ^ - normal (t) = x(t) · cos ─── - y(t) · sin ─── = - y(t) + normal (t) = x(t) · cos ─── - y(t) · sin ─── = - y(t) x 2 2 - - ^ \pi ^ \pi ^ - normal (t) = \undersetquarter circle rotation \underbrace x(t) · sin ─── + y(t) · cos ─── = x(t) - y 2 2 + + ^ \pi ^ \pi ^ + normal (t) = \underset quarter circle rotation \underbrace x(t) · sin ─── + y(t) · cos ─── = x(t) + y 2 2 --> frames: @@ -3713,14 +3713,14 @@ generateRMFrames(steps) -> frames: - +

Okay, well, that looks plain ridiculous, but: notice that every coordinate value is being offset by the initial translation, and also notice that a lot of terms in that expression are repeated. Even though the maths looks crazy as a single expression, we can just @@ -5105,18 +5105,20 @@ function getCubicRoots(pa, pb, pc, pd) { - +

We can rewrite this to a plain polynomial form, by just fully writing out the expansion and then collecting the polynomial factors, as:

- +

Nothing special here: that's a standard cubic polynomial in "power" form (i.e. all the terms are ordered by their power of t). So, given that a, b, c, d, and x(t) are all @@ -5125,9 +5127,10 @@ function getCubicRoots(pa, pb, pc, pd) { - +

You might be wondering "where did all the other 'minus x' for all the other values a, b, c, and d go?" and the answer there is that they all cancel out, so the only one we actually need to subtract is the one at the end. Handy! So now we just solve this equation using @@ -5231,7 +5234,7 @@ y = curve.get(t).y - +

This formula says that the length of a parametric curve is in fact equal to the area underneath a function that looks a remarkable amount like Pythagoras' rule for computing the diagonal of a straight angled triangle. This sounds pretty simple, right? Sadly, @@ -5262,13 +5265,13 @@ y = curve.get(t).y - +

In plain text: an integral function can always be treated as the sum of an (infinite) number of (infinitely thin) rectangular strips sitting "under" the function's plotted graph. To illustrate this idea, the following graph shows the integral for a sinusoid function. The @@ -6107,10 +6110,10 @@ lli = function(line1, line2): - +

If we can figure out what the function u(t) looks like, we'll be done. Although we do need to remember that this u(t) will have a different form depending on whether we're working with quadratic or cubic curves. @@ -6122,24 +6125,24 @@ lli = function(line1, line2): - +

And

- +

So, if we know the start and end coordinates and the t value, we know C without having to calculate the A or even B coordinates. In fact, we can do the same for the ratio function. As another function of t, we technically @@ -6150,33 +6153,33 @@ lli = function(line1, line2): - +

Working out the maths for this, we see the following two formulae for quadratic and cubic curves:

- +

And

- +

Which now leaves us with some powerful tools: given three points (start, end, and "some point on the curve"), as well as a t value, we can construct curves. We can compute C using the start and end points and our @@ -6186,11 +6189,11 @@ lli = function(line1, line2): - +

With A found, finding e1 and e2 for quadratic curves is a matter of running the linear interpolation with t between start and A to yield e1, and between A and end to yield @@ -6215,16 +6218,16 @@ lli = function(line1, line2): - +

So: if we have a curve's start and end points, then for any t value we implicitly know all the ABC values, which (combined with an educated guess on appropriate e1 and e2 coordinates for cubic curves) gives us the necessary information @@ -6540,12 +6543,12 @@ for (coordinate, index) in LUT: @@ -6553,7 +6556,7 @@ for (coordinate, index) in LUT: - +

And then the associated A:

- +

And we're done, because that's our new quadratic control point!

@@ -6998,16 +7001,16 @@ findClosest(start, p, r, LUT): @@ -7021,13 +7024,13 @@ findClosest(start, p, r, LUT): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ┌ a 0 0 ┐ ┌ 1 0 0 ┐ ┌ a ┐ - B = T · M · C = ┌ 2 ┐ · │ -2a 2b 0 │ = ┌ 2 ┐ · │ -2 2 0 │ · │ b │ + B = T · M · C = ┌ 2 ┐ · │ -2a 2b 0 │ = ┌ 2 ┐ · │ -2 2 0 │ · │ b │ quadratic └ 1 t t ┘ └ a -2b c ┘ └ 1 t t ┘ └ 1 -2 1 ┘ └ c ┘ --> @@ -7035,14 +7038,14 @@ findClosest(start, p, r, LUT): @@ -7050,18 +7053,18 @@ findClosest(start, p, r, LUT): @@ -7070,14 +7073,14 @@ findClosest(start, p, r, LUT): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ┌ 1 0 0 0 ┐ ┌ a ┐ - B = T · M · C = ┌ 2 3 ┐ · │ -3 3 0 0 │ · │ b │ + B = T · M · C = ┌ 2 3 ┐ · │ -3 3 0 0 │ · │ b │ cubic └ 1 t t t ┘ │ 3 -6 3 0 │ │ c │ └ -1 3 -3 1 ┘ └ d ┘ --> @@ -7087,14 +7090,14 @@ findClosest(start, p, r, LUT): ┌ 1 0 0 0 0 ┐ ┌ a ┐ │ -4 4 0 0 0 │ │ b │ - B = T · M · C = ┌ 2 3 4 ┐ · │ 6 -12 6 0 0 │ · │ c │ + B = T · M · C = ┌ 2 3 4 ┐ · │ 6 -12 6 0 0 │ · │ c │ quartic └ 1 t t t t ┘ │ -4 12 -12 4 0 │ │ d │ └ 1 -4 6 -4 1 ┘ └ e ┘ --> @@ -7197,13 +7200,13 @@ findClosest(start, p, r, LUT): @@ -7610,18 +7613,18 @@ for p = 1 to points.length-3 (inclusive): @@ -8164,19 +8167,19 @@ for p = 1 to points.length-3 (inclusive): @@ -8184,19 +8187,19 @@ for p = 1 to points.length-3 (inclusive): @@ -8293,7 +8296,7 @@ for p = 1 to points.length-3 (inclusive): │ B + (B - A ) │ │ 2B - A │ └ y y y ┘ └ y y ┘ --> - +

So let's implement that and see what it gets us. The following two graphics show a quadratic and a cubic poly-Bézier curve again, but this time moving the control points around moves others, too. However, you might see something unexpected going on for quadratic curves... @@ -9113,13 +9116,13 @@ for p = 1 to points.length-3 (inclusive): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ╭ 1 ╮ 1 4 - ||A,C|| = d + d = d + d · ratio │ ─ │ = d + ─d = ─d - 2 1 2 2 3 ╰ 2 ╯ 2 3 2 3 2 + ||A,C|| = d + d = d + d · ratio │ ─ │ = d + ─d = ─d + 2 1 2 2 3 ╰ 2 ╯ 2 3 2 3 2 --> @@ -9267,14 +9270,14 @@ for p = 1 to points.length-3 (inclusive): @@ -9282,14 +9285,14 @@ for p = 1 to points.length-3 (inclusive): @@ -9568,13 +9571,13 @@ for p = 1 to points.length-3 (inclusive): - +

So this is where we see the interpolation: N(t) for an (i,k) pair (that is, for a step in the above summation, on a specific knot interval) is a mix between N(t) for (i,k-1) and N(t) for (i+1,k-1), so we see that this is a recursive @@ -9584,11 +9587,11 @@ for p = 1 to points.length-3 (inclusive): - +

And this function finally has a straight up evaluation: if a t value lies within a knot-specific interval once we reach a k=1 value, it "counts", otherwise it doesn't. We did cheat a little, though, because for all these values we need to scale @@ -9620,11 +9623,11 @@ for p = 1 to points.length-3 (inclusive): - +

That looks complicated, but it's not. Computing alpha is just a fraction involving known, plain numbers. And, once we have our alpha value, we also have (1-alpha) because it's a trivial subtraction. Computing the d() function is thus mostly a @@ -9635,11 +9638,11 @@ for p = 1 to points.length-3 (inclusive): - +

So, we actually see two stopping conditions: either i becomes 0, in which case d() is zero, or k becomes zero, in which case we get the same "either 1 or 0" that we saw in the N() function above. diff --git a/docs/news/2020-09-18.html b/docs/news/2020-09-18.html index 7d762d7c..7d39a659 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 d34ab120..95fa4ff6 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 18697a10..6616beec 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 ff3d7dd6..c28bdd6d 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 - Thu Feb 04 2021 00:46:16 +00:00 + Sun Feb 28 2021 12:18:43 +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://twitter.com/TheRealPomax">Pomax</a></p> - Sun Nov 22 2020 00:00:00 +00:00 + Sat Nov 21 2020 16:00:00 +00:00 2020-11-22.html Rewriting the tech stack @@ -119,7 +119,7 @@ draw() { <p>— <a href="https://twitter.com/TheRealPomax">Pomax</a></p> - Fri Sep 18 2020 00:00:00 +00:00 + Thu Sep 17 2020 17:00:00 +00:00 2020-09-18.html diff --git a/docs/ru-RU/index.html b/docs/ru-RU/index.html index 07790e10..fc0ddbe6 100644 --- a/docs/ru-RU/index.html +++ b/docs/ru-RU/index.html @@ -34,7 +34,7 @@ - + @@ -546,19 +546,19 @@ 80ти % до второй, вычислить результат можно следующим образом:

- +

Что же, посмотрим на это в действии: ниже представлена интерактивная проекция, кликнув на ползунок, можно пользоваться клавишами вниз-вверх для увеличения и уменьшения соотношения интерполяции и наблюдать получаемый результат. Сначала, основываясь на трех точках, @@ -716,18 +716,18 @@ b и т.д. принимающими "биноминальную" форму. Звучит сложно, но на практике выглядит понятнее:

@@ -736,18 +736,18 @@ ясно. Примите ко внимаю такие биномиальные термины:

@@ -765,20 +765,20 @@ t в b, убрав "веса", получим следующее:

@@ -787,17 +787,17 @@ функцию:

@@ -1106,15 +1106,15 @@ function Bezier(3,t): можем учесть их запись в нашей оригинальной функции Безье:

- +

Хоть и выглядит заморочено, но, так уж получается, в реальности "веса" просто значения координат на графике, к которым мы бы хотели, чтобы наша функция стремилась. Так, для кривой n-го порядка, w0 есть начальной координатой, wn конечной @@ -1266,7 +1266,7 @@ function Bezier(3,t,w[]): --> @@ -1469,10 +1469,10 @@ function RationalBezier(3,t,w[],r[]): - +

Очевидно, что начальное и конечное значения a и b должны быть a=1, b=0, чтобы в начале получать вывод 100% первого показателя и 0% второго; и a=0, b=1, чтобы в конце получать 0% value 1 и 100% value 2. В дополнение, мы не @@ -1484,10 +1484,10 @@ function RationalBezier(3,t,w[],r[]): - +

С этим у нас есть гарантия, что мы не получим суму значений пропорций более 100%. Мы ограничиваем значение a интервалом [0,1], потому всегда получаем вывод из пропорционального смешения двух показателей, с сумой смесителей не превышающей 100%. @@ -2215,16 +2215,16 @@ function drawCurve(points[], t): - +

However, this rule also has as direct consequence that you cannot generally safely lower a curve from nth order to (n-1)th order, because the control points cannot be "pulled apart" cleanly. We can @@ -2654,11 +2654,11 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse - +

Then, we apply one of those silly (actually, super useful) calculus tricks: since our t value is always between zero and one (inclusive), we know that (1-t) plus t always sums to 1. As such, we can express any value as a sum of @@ -2677,12 +2677,12 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse - +

So far so good. Now, to see why we did this, let's write out the (1-t) and t parts, and see what that gives us. I promise, it's about to make sense. We start with (1-t): @@ -2910,12 +2910,12 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math __ n-1 - Bézier'(n,t) = n · ❯ (b -b ) · Bézier(n-1,t) - ‾‾ i=0 i+1 i i + Bézier'(n,t) = n · ❯ (b -b ) · Bézier(n-1,t) + ‾‾ i=0 i+1 i i -->

И это по сути формула функции сумы на 1 порядок ниже:

Можно переписать по стандартной форме сумы, и готово:

@@ -3157,35 +3157,35 @@ Bézier (t) ── = n · B (t) · (w - w ) + n · B производная:

@@ -3236,9 +3236,9 @@ Bézier'(n,t) = ❯ \undersetбиноминальный термин\underb -->

@@ -3246,27 +3246,27 @@ Bézier'(n,t) = ❯ \undersetбиноминальный термин\underb point, and then do whatever it is we want to do based on those directions:

@@ -3279,16 +3279,16 @@ Bézier'(n,t) = ❯ \undersetбиноминальный термин\underb \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ^ \pi ^ \pi ^ - normal (t) = x(t) · cos ─── - y(t) · sin ─── = - y(t) + normal (t) = x(t) · cos ─── - y(t) · sin ─── = - y(t) x 2 2 - - ^ \pi ^ \pi ^ - normal (t) = \undersetquarter circle rotation \underbrace x(t) · sin ─── + y(t) · cos ─── = x(t) - y 2 2 + + ^ \pi ^ \pi ^ + normal (t) = \underset quarter circle rotation \underbrace x(t) · sin ─── + y(t) · cos ─── = x(t) + y 2 2 --> frames: @@ -3874,14 +3874,14 @@ generateRMFrames(steps) -> frames: - +

Okay, well, that looks plain ridiculous, but: notice that every coordinate value is being offset by the initial translation, and also notice that a lot of terms in that expression are repeated. Even though the maths looks crazy as a single expression, we can just @@ -5266,18 +5266,20 @@ function getCubicRoots(pa, pb, pc, pd) { - +

We can rewrite this to a plain polynomial form, by just fully writing out the expansion and then collecting the polynomial factors, as:

- +

Nothing special here: that's a standard cubic polynomial in "power" form (i.e. all the terms are ordered by their power of t). So, given that a, b, c, d, and x(t) are all @@ -5286,9 +5288,10 @@ function getCubicRoots(pa, pb, pc, pd) { - +

You might be wondering "where did all the other 'minus x' for all the other values a, b, c, and d go?" and the answer there is that they all cancel out, so the only one we actually need to subtract is the one at the end. Handy! So now we just solve this equation using @@ -5392,7 +5395,7 @@ y = curve.get(t).y - +

This formula says that the length of a parametric curve is in fact equal to the area underneath a function that looks a remarkable amount like Pythagoras' rule for computing the diagonal of a straight angled triangle. This sounds pretty simple, right? Sadly, @@ -5423,13 +5426,13 @@ y = curve.get(t).y - +

In plain text: an integral function can always be treated as the sum of an (infinite) number of (infinitely thin) rectangular strips sitting "under" the function's plotted graph. To illustrate this idea, the following graph shows the integral for a sinusoid function. The @@ -6268,10 +6271,10 @@ lli = function(line1, line2): - +

If we can figure out what the function u(t) looks like, we'll be done. Although we do need to remember that this u(t) will have a different form depending on whether we're working with quadratic or cubic curves. @@ -6283,24 +6286,24 @@ lli = function(line1, line2): - +

And

- +

So, if we know the start and end coordinates and the t value, we know C without having to calculate the A or even B coordinates. In fact, we can do the same for the ratio function. As another function of t, we technically @@ -6311,33 +6314,33 @@ lli = function(line1, line2): - +

Working out the maths for this, we see the following two formulae for quadratic and cubic curves:

- +

And

- +

Which now leaves us with some powerful tools: given three points (start, end, and "some point on the curve"), as well as a t value, we can construct curves. We can compute C using the start and end points and our @@ -6347,11 +6350,11 @@ lli = function(line1, line2): - +

With A found, finding e1 and e2 for quadratic curves is a matter of running the linear interpolation with t between start and A to yield e1, and between A and end to yield @@ -6376,16 +6379,16 @@ lli = function(line1, line2): - +

So: if we have a curve's start and end points, then for any t value we implicitly know all the ABC values, which (combined with an educated guess on appropriate e1 and e2 coordinates for cubic curves) gives us the necessary information @@ -6701,12 +6704,12 @@ for (coordinate, index) in LUT: @@ -6714,7 +6717,7 @@ for (coordinate, index) in LUT: - +

And then the associated A:

- +

And we're done, because that's our new quadratic control point!

@@ -7159,16 +7162,16 @@ findClosest(start, p, r, LUT): @@ -7182,13 +7185,13 @@ findClosest(start, p, r, LUT): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ┌ a 0 0 ┐ ┌ 1 0 0 ┐ ┌ a ┐ - B = T · M · C = ┌ 2 ┐ · │ -2a 2b 0 │ = ┌ 2 ┐ · │ -2 2 0 │ · │ b │ + B = T · M · C = ┌ 2 ┐ · │ -2a 2b 0 │ = ┌ 2 ┐ · │ -2 2 0 │ · │ b │ quadratic └ 1 t t ┘ └ a -2b c ┘ └ 1 t t ┘ └ 1 -2 1 ┘ └ c ┘ --> @@ -7196,14 +7199,14 @@ findClosest(start, p, r, LUT): @@ -7211,18 +7214,18 @@ findClosest(start, p, r, LUT): @@ -7231,14 +7234,14 @@ findClosest(start, p, r, LUT): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ┌ 1 0 0 0 ┐ ┌ a ┐ - B = T · M · C = ┌ 2 3 ┐ · │ -3 3 0 0 │ · │ b │ + B = T · M · C = ┌ 2 3 ┐ · │ -3 3 0 0 │ · │ b │ cubic └ 1 t t t ┘ │ 3 -6 3 0 │ │ c │ └ -1 3 -3 1 ┘ └ d ┘ --> @@ -7248,14 +7251,14 @@ findClosest(start, p, r, LUT): ┌ 1 0 0 0 0 ┐ ┌ a ┐ │ -4 4 0 0 0 │ │ b │ - B = T · M · C = ┌ 2 3 4 ┐ · │ 6 -12 6 0 0 │ · │ c │ + B = T · M · C = ┌ 2 3 4 ┐ · │ 6 -12 6 0 0 │ · │ c │ quartic └ 1 t t t t ┘ │ -4 12 -12 4 0 │ │ d │ └ 1 -4 6 -4 1 ┘ └ e ┘ --> @@ -7358,13 +7361,13 @@ findClosest(start, p, r, LUT): @@ -7771,18 +7774,18 @@ for p = 1 to points.length-3 (inclusive): @@ -8325,19 +8328,19 @@ for p = 1 to points.length-3 (inclusive): @@ -8345,19 +8348,19 @@ for p = 1 to points.length-3 (inclusive): @@ -8454,7 +8457,7 @@ for p = 1 to points.length-3 (inclusive): │ B + (B - A ) │ │ 2B - A │ └ y y y ┘ └ y y ┘ --> - +

So let's implement that and see what it gets us. The following two graphics show a quadratic and a cubic poly-Bézier curve again, but this time moving the control points around moves others, too. However, you might see something unexpected going on for quadratic curves... @@ -9274,13 +9277,13 @@ for p = 1 to points.length-3 (inclusive): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ╭ 1 ╮ 1 4 - ||A,C|| = d + d = d + d · ratio │ ─ │ = d + ─d = ─d - 2 1 2 2 3 ╰ 2 ╯ 2 3 2 3 2 + ||A,C|| = d + d = d + d · ratio │ ─ │ = d + ─d = ─d + 2 1 2 2 3 ╰ 2 ╯ 2 3 2 3 2 --> @@ -9428,14 +9431,14 @@ for p = 1 to points.length-3 (inclusive): @@ -9443,14 +9446,14 @@ for p = 1 to points.length-3 (inclusive): @@ -9729,13 +9732,13 @@ for p = 1 to points.length-3 (inclusive): - +

So this is where we see the interpolation: N(t) for an (i,k) pair (that is, for a step in the above summation, on a specific knot interval) is a mix between N(t) for (i,k-1) and N(t) for (i+1,k-1), so we see that this is a recursive @@ -9745,11 +9748,11 @@ for p = 1 to points.length-3 (inclusive): - +

And this function finally has a straight up evaluation: if a t value lies within a knot-specific interval once we reach a k=1 value, it "counts", otherwise it doesn't. We did cheat a little, though, because for all these values we need to scale @@ -9781,11 +9784,11 @@ for p = 1 to points.length-3 (inclusive): - +

That looks complicated, but it's not. Computing alpha is just a fraction involving known, plain numbers. And, once we have our alpha value, we also have (1-alpha) because it's a trivial subtraction. Computing the d() function is thus mostly a @@ -9796,11 +9799,11 @@ for p = 1 to points.length-3 (inclusive): - +

So, we actually see two stopping conditions: either i becomes 0, in which case d() is zero, or k becomes zero, in which case we get the same "either 1 or 0" that we saw in the N() function above. diff --git a/docs/uk-UA/index.html b/docs/uk-UA/index.html index 72bdd6fc..b531eaeb 100644 --- a/docs/uk-UA/index.html +++ b/docs/uk-UA/index.html @@ -39,7 +39,7 @@ - + @@ -546,17 +546,17 @@ - +

So let's look at that in action: the following graphic is interactive in that you can use your up and down arrow keys to increase or decrease the interpolation ratio, to see what happens. We start with three points, which gives us two lines. Linear interpolation over @@ -712,15 +712,15 @@ @@ -754,19 +754,19 @@ and remove the weights for a moment, we get this:

@@ -778,14 +778,14 @@ square= \colorbluea · \colorbluea + \colorbluea · \colorredb + \colorredb @@ -1094,15 +1094,15 @@ function Bezier(3,t): called "weights", and we can add them to our original Bézier function:

- +

That looks complicated, but as it so happens, the "weights" are actually just the coordinate values we want our curve to have: for an nth order curve, w0 is our start coordinate, wn is our last coordinate, and everything in between @@ -1251,7 +1251,7 @@ function Bezier(3,t,w[]): --> @@ -1455,10 +1455,10 @@ function RationalBezier(3,t,w[],r[]): - +

The obvious start and end values here need to be a=1, b=0, so that the mixed value is 100% value 1, and 0% value 2, and a=0, b=1, so that the mixed value is 0% value 1 and 100% value 2. Additionally, we don't want "a" and "b" to be independent: @@ -1470,10 +1470,10 @@ function RationalBezier(3,t,w[],r[]): - +

With this we can guarantee that we never sum above 100%. By restricting a to values in the interval [0,1], we will always be somewhere between our two values (inclusively), and we will always sum to a 100% mix. @@ -2190,16 +2190,16 @@ function drawCurve(points[], t): - +

However, this rule also has as direct consequence that you cannot generally safely lower a curve from nth order to (n-1)th order, because the control points cannot be "pulled apart" cleanly. We can @@ -2629,11 +2629,11 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse - +

Then, we apply one of those silly (actually, super useful) calculus tricks: since our t value is always between zero and one (inclusive), we know that (1-t) plus t always sums to 1. As such, we can express any value as a sum of @@ -2652,12 +2652,12 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse - +

So far so good. Now, to see why we did this, let's write out the (1-t) and t parts, and see what that gives us. I promise, it's about to make sense. We start with (1-t): @@ -2885,12 +2885,12 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math __ n-1 - Bézier'(n,t) = n · ❯ (b -b ) · Bézier(n-1,t) - ‾‾ i=0 i+1 i i + Bézier'(n,t) = n · ❯ (b -b ) · Bézier(n-1,t) + ‾‾ i=0 i+1 i i -->

And that's just a summation of lower order curves:

@@ -3210,9 +3210,9 @@ Bézier'(n,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \unders -->

@@ -3220,27 +3220,27 @@ Bézier'(n,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \unders point, and then do whatever it is we want to do based on those directions:

@@ -3253,16 +3253,16 @@ Bézier'(n,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \unders \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ^ \pi ^ \pi ^ - normal (t) = x(t) · cos ─── - y(t) · sin ─── = - y(t) + normal (t) = x(t) · cos ─── - y(t) · sin ─── = - y(t) x 2 2 - - ^ \pi ^ \pi ^ - normal (t) = \undersetquarter circle rotation \underbrace x(t) · sin ─── + y(t) · cos ─── = x(t) - y 2 2 + + ^ \pi ^ \pi ^ + normal (t) = \underset quarter circle rotation \underbrace x(t) · sin ─── + y(t) · cos ─── = x(t) + y 2 2 --> frames: @@ -3848,14 +3848,14 @@ generateRMFrames(steps) -> frames: - +

Okay, well, that looks plain ridiculous, but: notice that every coordinate value is being offset by the initial translation, and also notice that a lot of terms in that expression are repeated. Even though the maths looks crazy as a single expression, we can just @@ -5240,18 +5240,20 @@ function getCubicRoots(pa, pb, pc, pd) { - +

We can rewrite this to a plain polynomial form, by just fully writing out the expansion and then collecting the polynomial factors, as:

- +

Nothing special here: that's a standard cubic polynomial in "power" form (i.e. all the terms are ordered by their power of t). So, given that a, b, c, d, and x(t) are all @@ -5260,9 +5262,10 @@ function getCubicRoots(pa, pb, pc, pd) { - +

You might be wondering "where did all the other 'minus x' for all the other values a, b, c, and d go?" and the answer there is that they all cancel out, so the only one we actually need to subtract is the one at the end. Handy! So now we just solve this equation using @@ -5366,7 +5369,7 @@ y = curve.get(t).y - +

This formula says that the length of a parametric curve is in fact equal to the area underneath a function that looks a remarkable amount like Pythagoras' rule for computing the diagonal of a straight angled triangle. This sounds pretty simple, right? Sadly, @@ -5397,13 +5400,13 @@ y = curve.get(t).y - +

In plain text: an integral function can always be treated as the sum of an (infinite) number of (infinitely thin) rectangular strips sitting "under" the function's plotted graph. To illustrate this idea, the following graph shows the integral for a sinusoid function. The @@ -6242,10 +6245,10 @@ lli = function(line1, line2): - +

If we can figure out what the function u(t) looks like, we'll be done. Although we do need to remember that this u(t) will have a different form depending on whether we're working with quadratic or cubic curves. @@ -6257,24 +6260,24 @@ lli = function(line1, line2): - +

And

- +

So, if we know the start and end coordinates and the t value, we know C without having to calculate the A or even B coordinates. In fact, we can do the same for the ratio function. As another function of t, we technically @@ -6285,33 +6288,33 @@ lli = function(line1, line2): - +

Working out the maths for this, we see the following two formulae for quadratic and cubic curves:

- +

And

- +

Which now leaves us with some powerful tools: given three points (start, end, and "some point on the curve"), as well as a t value, we can construct curves. We can compute C using the start and end points and our @@ -6321,11 +6324,11 @@ lli = function(line1, line2): - +

With A found, finding e1 and e2 for quadratic curves is a matter of running the linear interpolation with t between start and A to yield e1, and between A and end to yield @@ -6350,16 +6353,16 @@ lli = function(line1, line2): - +

So: if we have a curve's start and end points, then for any t value we implicitly know all the ABC values, which (combined with an educated guess on appropriate e1 and e2 coordinates for cubic curves) gives us the necessary information @@ -6675,12 +6678,12 @@ for (coordinate, index) in LUT: @@ -6688,7 +6691,7 @@ for (coordinate, index) in LUT: - +

And then the associated A:

- +

And we're done, because that's our new quadratic control point!

@@ -7133,16 +7136,16 @@ findClosest(start, p, r, LUT): @@ -7156,13 +7159,13 @@ findClosest(start, p, r, LUT): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ┌ a 0 0 ┐ ┌ 1 0 0 ┐ ┌ a ┐ - B = T · M · C = ┌ 2 ┐ · │ -2a 2b 0 │ = ┌ 2 ┐ · │ -2 2 0 │ · │ b │ + B = T · M · C = ┌ 2 ┐ · │ -2a 2b 0 │ = ┌ 2 ┐ · │ -2 2 0 │ · │ b │ quadratic └ 1 t t ┘ └ a -2b c ┘ └ 1 t t ┘ └ 1 -2 1 ┘ └ c ┘ --> @@ -7170,14 +7173,14 @@ findClosest(start, p, r, LUT): @@ -7185,18 +7188,18 @@ findClosest(start, p, r, LUT): @@ -7205,14 +7208,14 @@ findClosest(start, p, r, LUT): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ┌ 1 0 0 0 ┐ ┌ a ┐ - B = T · M · C = ┌ 2 3 ┐ · │ -3 3 0 0 │ · │ b │ + B = T · M · C = ┌ 2 3 ┐ · │ -3 3 0 0 │ · │ b │ cubic └ 1 t t t ┘ │ 3 -6 3 0 │ │ c │ └ -1 3 -3 1 ┘ └ d ┘ --> @@ -7222,14 +7225,14 @@ findClosest(start, p, r, LUT): ┌ 1 0 0 0 0 ┐ ┌ a ┐ │ -4 4 0 0 0 │ │ b │ - B = T · M · C = ┌ 2 3 4 ┐ · │ 6 -12 6 0 0 │ · │ c │ + B = T · M · C = ┌ 2 3 4 ┐ · │ 6 -12 6 0 0 │ · │ c │ quartic └ 1 t t t t ┘ │ -4 12 -12 4 0 │ │ d │ └ 1 -4 6 -4 1 ┘ └ e ┘ --> @@ -7332,13 +7335,13 @@ findClosest(start, p, r, LUT): @@ -7745,18 +7748,18 @@ for p = 1 to points.length-3 (inclusive): @@ -8299,19 +8302,19 @@ for p = 1 to points.length-3 (inclusive): @@ -8319,19 +8322,19 @@ for p = 1 to points.length-3 (inclusive): @@ -8428,7 +8431,7 @@ for p = 1 to points.length-3 (inclusive): │ B + (B - A ) │ │ 2B - A │ └ y y y ┘ └ y y ┘ --> - +

So let's implement that and see what it gets us. The following two graphics show a quadratic and a cubic poly-Bézier curve again, but this time moving the control points around moves others, too. However, you might see something unexpected going on for quadratic curves... @@ -9248,13 +9251,13 @@ for p = 1 to points.length-3 (inclusive): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ╭ 1 ╮ 1 4 - ||A,C|| = d + d = d + d · ratio │ ─ │ = d + ─d = ─d - 2 1 2 2 3 ╰ 2 ╯ 2 3 2 3 2 + ||A,C|| = d + d = d + d · ratio │ ─ │ = d + ─d = ─d + 2 1 2 2 3 ╰ 2 ╯ 2 3 2 3 2 --> @@ -9402,14 +9405,14 @@ for p = 1 to points.length-3 (inclusive): @@ -9417,14 +9420,14 @@ for p = 1 to points.length-3 (inclusive): @@ -9703,13 +9706,13 @@ for p = 1 to points.length-3 (inclusive): - +

So this is where we see the interpolation: N(t) for an (i,k) pair (that is, for a step in the above summation, on a specific knot interval) is a mix between N(t) for (i,k-1) and N(t) for (i+1,k-1), so we see that this is a recursive @@ -9719,11 +9722,11 @@ for p = 1 to points.length-3 (inclusive): - +

And this function finally has a straight up evaluation: if a t value lies within a knot-specific interval once we reach a k=1 value, it "counts", otherwise it doesn't. We did cheat a little, though, because for all these values we need to scale @@ -9755,11 +9758,11 @@ for p = 1 to points.length-3 (inclusive): - +

That looks complicated, but it's not. Computing alpha is just a fraction involving known, plain numbers. And, once we have our alpha value, we also have (1-alpha) because it's a trivial subtraction. Computing the d() function is thus mostly a @@ -9770,11 +9773,11 @@ for p = 1 to points.length-3 (inclusive): - +

So, we actually see two stopping conditions: either i becomes 0, in which case d() is zero, or k becomes zero, in which case we get the same "either 1 or 0" that we saw in the N() function above. diff --git a/docs/zh-CN/index.html b/docs/zh-CN/index.html index c70790ca..f675205a 100644 --- a/docs/zh-CN/index.html +++ b/docs/zh-CN/index.html @@ -41,7 +41,7 @@ - + @@ -510,17 +510,17 @@ - +

让我们来通过实际操作看一下:下面的图形都是可交互的,因此你可以通过上下键来增加或减少插值距离,来观察图形的变化。我们从三个点构成的两条线段开始。通过对各条线段进行线性插值得到两个点,对点之间的线段再进行线性插值,产生一个新的点。最终这些点——所有的点都可以通过选取不同的距离插值产生——构成了贝塞尔曲线 : @@ -645,15 +645,15 @@ @@ -681,19 +681,19 @@ 还有一个简单的办法可以弄清参数项怎么工作的:如果我们将(1-t)重命名为a,将t重命名为b,暂时把权重删掉,可以得到这个:

@@ -703,14 +703,14 @@ square= \colorbluea · \colorbluea + \colorbluea · \colorredb + \colorredb @@ -996,15 +996,15 @@ function Bezier(3,t): 如果我们要改变曲线,就需要改变每个点的权重,有效地改变插值。可以很直接地做到这个:只要用一个值乘以每个点,来改变它的强度。这个值照惯例称为“权重”,我们可以将它加入我们原始的贝塞尔函数:

- +

看起来很复杂,但实际上“权重”只是我们想让曲线所拥有的坐标值:对于一条nth阶曲线,w0是起始坐标,wn是终点坐标,中间的所有点都是控制点坐标。假设说一条曲线的起点为(110,150),终点为(210,30),并受点(25,190)和点(210,250)的控制,贝塞尔曲线方程就为:

@@ -1135,7 +1135,7 @@ function Bezier(3,t,w[]): --> @@ -1335,10 +1335,10 @@ function RationalBezier(3,t,w[],r[]): - +

很显然,起始值需要a=1, b=0,混合值就为100%的value 1和0%的value 2。终点值需要a=0, b=1,则混合值是0%的value 1和100%的value @@ -1347,10 +1347,10 @@ function RationalBezier(3,t,w[],r[]): - +

用这个式子我们可以保证相加的值永远不会超过100%。通过将a限制在区间[0,1],我们将会一直处于这两个值之间(包括这两个端点),并且相加为100%。

@@ -2031,16 +2031,16 @@ function drawCurve(points[], t): - +

However, this rule also has as direct consequence that you cannot generally safely lower a curve from nth order to (n-1)th order, because the control points cannot be "pulled apart" cleanly. We can @@ -2470,11 +2470,11 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse - +

Then, we apply one of those silly (actually, super useful) calculus tricks: since our t value is always between zero and one (inclusive), we know that (1-t) plus t always sums to 1. As such, we can express any value as a sum of @@ -2493,12 +2493,12 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse - +

So far so good. Now, to see why we did this, let's write out the (1-t) and t parts, and see what that gives us. I promise, it's about to make sense. We start with (1-t): @@ -2726,12 +2726,12 @@ Bézier(k,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \underse \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math __ n-1 - Bézier'(n,t) = n · ❯ (b -b ) · Bézier(n-1,t) - ‾‾ i=0 i+1 i i + Bézier'(n,t) = n · ❯ (b -b ) · Bézier(n-1,t) + ‾‾ i=0 i+1 i i -->

And that's just a summation of lower order curves:

@@ -3051,9 +3051,9 @@ Bézier'(n,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \unders -->

@@ -3061,27 +3061,27 @@ Bézier'(n,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \unders point, and then do whatever it is we want to do based on those directions:

@@ -3094,16 +3094,16 @@ Bézier'(n,t) = ❯ \undersetbinomial term\underbrace\binomki · \ \unders \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ^ \pi ^ \pi ^ - normal (t) = x(t) · cos ─── - y(t) · sin ─── = - y(t) + normal (t) = x(t) · cos ─── - y(t) · sin ─── = - y(t) x 2 2 - - ^ \pi ^ \pi ^ - normal (t) = \undersetquarter circle rotation \underbrace x(t) · sin ─── + y(t) · cos ─── = x(t) - y 2 2 + + ^ \pi ^ \pi ^ + normal (t) = \underset quarter circle rotation \underbrace x(t) · sin ─── + y(t) · cos ─── = x(t) + y 2 2 --> frames: @@ -3689,14 +3689,14 @@ generateRMFrames(steps) -> frames: - +

Okay, well, that looks plain ridiculous, but: notice that every coordinate value is being offset by the initial translation, and also notice that a lot of terms in that expression are repeated. Even though the maths looks crazy as a single expression, we can just @@ -5081,18 +5081,20 @@ function getCubicRoots(pa, pb, pc, pd) { - +

We can rewrite this to a plain polynomial form, by just fully writing out the expansion and then collecting the polynomial factors, as:

- +

Nothing special here: that's a standard cubic polynomial in "power" form (i.e. all the terms are ordered by their power of t). So, given that a, b, c, d, and x(t) are all @@ -5101,9 +5103,10 @@ function getCubicRoots(pa, pb, pc, pd) { - +

You might be wondering "where did all the other 'minus x' for all the other values a, b, c, and d go?" and the answer there is that they all cancel out, so the only one we actually need to subtract is the one at the end. Handy! So now we just solve this equation using @@ -5207,7 +5210,7 @@ y = curve.get(t).y - +

This formula says that the length of a parametric curve is in fact equal to the area underneath a function that looks a remarkable amount like Pythagoras' rule for computing the diagonal of a straight angled triangle. This sounds pretty simple, right? Sadly, @@ -5238,13 +5241,13 @@ y = curve.get(t).y - +

In plain text: an integral function can always be treated as the sum of an (infinite) number of (infinitely thin) rectangular strips sitting "under" the function's plotted graph. To illustrate this idea, the following graph shows the integral for a sinusoid function. The @@ -6083,10 +6086,10 @@ lli = function(line1, line2): - +

If we can figure out what the function u(t) looks like, we'll be done. Although we do need to remember that this u(t) will have a different form depending on whether we're working with quadratic or cubic curves. @@ -6098,24 +6101,24 @@ lli = function(line1, line2): - +

And

- +

So, if we know the start and end coordinates and the t value, we know C without having to calculate the A or even B coordinates. In fact, we can do the same for the ratio function. As another function of t, we technically @@ -6126,33 +6129,33 @@ lli = function(line1, line2): - +

Working out the maths for this, we see the following two formulae for quadratic and cubic curves:

- +

And

- +

Which now leaves us with some powerful tools: given three points (start, end, and "some point on the curve"), as well as a t value, we can construct curves. We can compute C using the start and end points and our @@ -6162,11 +6165,11 @@ lli = function(line1, line2): - +

With A found, finding e1 and e2 for quadratic curves is a matter of running the linear interpolation with t between start and A to yield e1, and between A and end to yield @@ -6191,16 +6194,16 @@ lli = function(line1, line2): - +

So: if we have a curve's start and end points, then for any t value we implicitly know all the ABC values, which (combined with an educated guess on appropriate e1 and e2 coordinates for cubic curves) gives us the necessary information @@ -6516,12 +6519,12 @@ for (coordinate, index) in LUT: @@ -6529,7 +6532,7 @@ for (coordinate, index) in LUT: - +

And then the associated A:

- +

And we're done, because that's our new quadratic control point!

@@ -6974,16 +6977,16 @@ findClosest(start, p, r, LUT): @@ -6997,13 +7000,13 @@ findClosest(start, p, r, LUT): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ┌ a 0 0 ┐ ┌ 1 0 0 ┐ ┌ a ┐ - B = T · M · C = ┌ 2 ┐ · │ -2a 2b 0 │ = ┌ 2 ┐ · │ -2 2 0 │ · │ b │ + B = T · M · C = ┌ 2 ┐ · │ -2a 2b 0 │ = ┌ 2 ┐ · │ -2 2 0 │ · │ b │ quadratic └ 1 t t ┘ └ a -2b c ┘ └ 1 t t ┘ └ 1 -2 1 ┘ └ c ┘ --> @@ -7011,14 +7014,14 @@ findClosest(start, p, r, LUT): @@ -7026,18 +7029,18 @@ findClosest(start, p, r, LUT): @@ -7046,14 +7049,14 @@ findClosest(start, p, r, LUT): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ┌ 1 0 0 0 ┐ ┌ a ┐ - B = T · M · C = ┌ 2 3 ┐ · │ -3 3 0 0 │ · │ b │ + B = T · M · C = ┌ 2 3 ┐ · │ -3 3 0 0 │ · │ b │ cubic └ 1 t t t ┘ │ 3 -6 3 0 │ │ c │ └ -1 3 -3 1 ┘ └ d ┘ --> @@ -7063,14 +7066,14 @@ findClosest(start, p, r, LUT): ┌ 1 0 0 0 0 ┐ ┌ a ┐ │ -4 4 0 0 0 │ │ b │ - B = T · M · C = ┌ 2 3 4 ┐ · │ 6 -12 6 0 0 │ · │ c │ + B = T · M · C = ┌ 2 3 4 ┐ · │ 6 -12 6 0 0 │ · │ c │ quartic └ 1 t t t t ┘ │ -4 12 -12 4 0 │ │ d │ └ 1 -4 6 -4 1 ┘ └ e ┘ --> @@ -7173,13 +7176,13 @@ findClosest(start, p, r, LUT): @@ -7586,18 +7589,18 @@ for p = 1 to points.length-3 (inclusive): @@ -8140,19 +8143,19 @@ for p = 1 to points.length-3 (inclusive): @@ -8160,19 +8163,19 @@ for p = 1 to points.length-3 (inclusive): @@ -8269,7 +8272,7 @@ for p = 1 to points.length-3 (inclusive): │ B + (B - A ) │ │ 2B - A │ └ y y y ┘ └ y y ┘ --> - +

So let's implement that and see what it gets us. The following two graphics show a quadratic and a cubic poly-Bézier curve again, but this time moving the control points around moves others, too. However, you might see something unexpected going on for quadratic curves... @@ -9089,13 +9092,13 @@ for p = 1 to points.length-3 (inclusive): \setmainfont[Ligatures=TeX]TeX Gyre Pagella \setmathfontTeX Gyre Pagella Math ╭ 1 ╮ 1 4 - ||A,C|| = d + d = d + d · ratio │ ─ │ = d + ─d = ─d - 2 1 2 2 3 ╰ 2 ╯ 2 3 2 3 2 + ||A,C|| = d + d = d + d · ratio │ ─ │ = d + ─d = ─d + 2 1 2 2 3 ╰ 2 ╯ 2 3 2 3 2 --> @@ -9243,14 +9246,14 @@ for p = 1 to points.length-3 (inclusive): @@ -9258,14 +9261,14 @@ for p = 1 to points.length-3 (inclusive): @@ -9544,13 +9547,13 @@ for p = 1 to points.length-3 (inclusive): - +

So this is where we see the interpolation: N(t) for an (i,k) pair (that is, for a step in the above summation, on a specific knot interval) is a mix between N(t) for (i,k-1) and N(t) for (i+1,k-1), so we see that this is a recursive @@ -9560,11 +9563,11 @@ for p = 1 to points.length-3 (inclusive): - +

And this function finally has a straight up evaluation: if a t value lies within a knot-specific interval once we reach a k=1 value, it "counts", otherwise it doesn't. We did cheat a little, though, because for all these values we need to scale @@ -9596,11 +9599,11 @@ for p = 1 to points.length-3 (inclusive): - +

That looks complicated, but it's not. Computing alpha is just a fraction involving known, plain numbers. And, once we have our alpha value, we also have (1-alpha) because it's a trivial subtraction. Computing the d() function is thus mostly a @@ -9611,11 +9614,11 @@ for p = 1 to points.length-3 (inclusive): - +

So, we actually see two stopping conditions: either i becomes 0, in which case d() is zero, or k becomes zero, in which case we get the same "either 1 or 0" that we saw in the N() function above.