しばしば話題に上がるベジェ曲線で描く円と正円の差の話題、 円弧の差分に注目してきたけれど正円よりも大きい部分があるのは 「ベジェ曲線で描く円と真円の差について」で既述のとおりである。

すると、 円を円として扱わずベジェ曲線として使うツールを使って円を描いたあとに、 円を印刷すると真円よりもインク代がかかったり 3Dプリントすると真円よりもフィラメントを消費するということが 考えられるのだが、それはどのくらいになるのであろうか? そこで、面積を計算してみた。

ベジェ曲線で描く円の面積求め方

中心角θの円弧は次の制御点A, A', B, B'で書き表せる。

A:(cosθ,sinθ)B:(1,0)A':(cosθ+κsinθ,sinθ-κcosθ)B':(1,κ)\begin{aligned} \text{A:}&(\cos\theta,\sin\theta)\\ \text{B:}&(1,0)\\ \text{A':}&(\cos\theta+\kappa\sin\theta,\sin\theta-\kappa\cos\theta)\\ \text{B':}&(1,\kappa)\\ \end{aligned} (5.1)

where,

κ=43·tanθ4\kappa=\frac{4}{3}\cdot\tan\frac\theta4 (5.2)
135degree arc using Bézier

ベジェ曲線の定義より、この曲線の任意の点はパラメータ u(0u1) u(0\leq u \leq 1) を使って、下記の通り表現できる。

P(u)=A(1-u)3+A3u(1-u)2+B3u2(1-u)+Bu3 \bm{P}(u)=\bm{A}(1-u)^3+\bm{A}'3u(1-u)^2+\bm{B}'3u^2(1-u)+\bm{B}u^3 (5.3)

P ( u ) = ( P x ( u ) , P y ( u ) ) \bm{P}(u)=\left(P_x(u),P_y(u)\right) とすると、よく下記の式で面積が求められる:

S = u = 0 u = 1 P y ( u ) d x = 0 1 P y ( u ) d P x ( u ) d u d u S = \int_{u=0}^{u=1} P_y(u)\,dx = \int_0^1 P_y(u)\cdot\frac{d P_x(u)}{du}\,du (5.4)

(5.1),(5.2),(5.3)式を(5.4)式に適用することで面積を求めることができる。

ベジェ曲線で描く円の面積

(5.4)式を計算すればいいのだが、手計算を早速諦めて maxima使って解いてみる。

(%i1) P(u):=A*(1-u)^3+Ac*3*u*(1-u)^2+Bc*3*u^2*(1-u)+B*u^3;
                          3                 2         2              3
(%o1)    P(u) := A (1 - u)  + Ac 3 u (1 - u)  + Bc 3 u  (1 - u) + B u
(%i2) Px(u):=sublis([A = cos(theta),B = 1,Ac = cos(theta)+k*sin(theta),Bc = 1],P(u));
(%o2) Px(u) := sublis([A = cos(theta), B = 1, Ac = cos(theta) + k sin(theta), 
                                                                 Bc = 1], P(u))
(%i3) Py(u):=sublis([A = sin(theta),B = 0,Ac = sin(theta)-k*cos(theta),Bc = k],P(u));
(%o3) Py(u) := sublis([A = sin(theta), B = 0, Ac = sin(theta) - k cos(theta), 
                                                                 Bc = k], P(u))
(%i4) integrate(Py(u)*diff(Px(u), u), u, 0, 1);
              2                                  2
(%o4) (6 k sin (theta) + ((- 10 cos(theta)) - 3 k  + 10) sin(theta)
                                           2
                                  + 6 k cos (theta) - 12 k cos(theta) + 6 k)/20

中心角が一般なときであっても一応は解析的に解けるようであり、面積は

S=6κsin2θ+-10cosθ-3κ2+10sinθ+6κcos2θ-12κcosθ+6κ20 S=6\kappa\sin ^2\theta+\left(-10\cos \theta-3\kappa^2+10\right)\sin \theta+6\kappa\cos ^2\theta-12\kappa\cos \theta+6\kappa (5.5)

ところで典型的なベクトル画像ソフトは下図のように中心角90度で分割している。

A circle using Bézier generated by typical vector graphic editor

(5.5)式に θ=π/2 \theta=\pi/2 を代入して4倍にすればベジェ曲線で描く円の面積がわかって

(%i5) sublis([k = 4/3*(sqrt(2)-1), theta=%pi/2], %o4) * 4;
                                                      2
                                      16 (sqrt(2) - 1)
                   16 (sqrt(2) - 1) - ----------------- + 10
                                              3
(%o5)              -----------------------------------------
                                       5
(%i6) float(%o5);
(%o6)                          3.142472332656507

半径1の円の面積は当然円周率であって、3.141592653589793...であるから、 0.00028%ぐらい真円よりも面積が大きいということになる。

結論

ベジェ曲線で描かれた円は、真円よりも0.00028%ぐらい余計に大きい。 円を円として扱わずベジェ曲線として使うツールを使って円を描いたあとに、 プリントしたらそれだけ余計にインク代も消費するし、 3Dプリントすると真円よりもそれだけフィラメントを消費するらしい。