#05 ふれてみよう高校数学 幾何と図形

円の方程式

円とは何か(定義から始める)

「コンパスで円を描く」——中心に針を刺して、一定の長さのまま回転させます。「中心から同じ距離にある点の集まり」、それが円です。

この「中心から等距離」という条件をピタゴラスの定理で式にします。中心 (a,b)(a, b)、半径 rr の円上の点 (x,y)(x, y) は、ピタゴラスの定理より:

(xa)2+(yb)2=r2(x - a)^2 + (y - b)^2 = r^2

これを円の標準形といいます。「中心からの距離が r」という条件そのものが式になっています。

標準形から一般形へ

標準形を展開すると——カッコを全部外すと:

x22ax+a2+y22by+b2=r2x^2 - 2ax + a^2 + y^2 - 2by + b^2 = r^2 x2+y22ax2by+(a2+b2r2)=0x^2 + y^2 - 2ax - 2by + (a^2 + b^2 - r^2) = 0

D=2aD = -2aE=2bE = -2bF=a2+b2r2F = a^2 + b^2 - r^2 と置くと:

x2+y2+Dx+Ey+F=0\boxed{x^2 + y^2 + Dx + Ey + F = 0}

これを円の一般形といいます。「x²+y²の係数が同じで1」という特徴で、円であることが分かります。

一般形から標準形への変換(平方完成)

一般形が与えられたとき、平方完成で標準形に戻します——「バラバラになった式を元の形に戻す」操作です。

x2+Dx+y2+Ey+F=0x^2 + Dx + y^2 + Ey + F = 0 (x+D2)2D24+(y+E2)2E24+F=0\left(x + \frac{D}{2}\right)^2 - \frac{D^2}{4} + \left(y + \frac{E}{2}\right)^2 - \frac{E^2}{4} + F = 0 (x+D2)2+(y+E2)2=D2+E24F\left(x + \frac{D}{2}\right)^2 + \left(y + \frac{E}{2}\right)^2 = \frac{D^2 + E^2}{4} - F

よって中心 (D2,E2)\left(-\frac{D}{2}, -\frac{E}{2}\right)、半径 r=D2+E24Fr = \sqrt{\frac{D^2+E^2}{4} - F}

r2>0r^2 > 0 のときのみ円として存在します。r2=0r^2 = 0 は一点、r2<0r^2 < 0 は実数解なし(虚円)——「半径がマイナスになる円は現実には存在しない」。

インタラクティブ図解:円の方程式リアルタイム表示

クリックで中心を移動、マウスを動かすと半径が変わります。標準形と一般形の係数がリアルタイムに更新されます。

クリックで中心を設定、マウスを動かして半径を変える

var OX = 300, OY = 200, SCALE = 40;
var centerX = 1, centerY = 1; // 数学座標
var clickX = OX + SCALE, clickY = OY - SCALE;

function toScreen(x, y) { return [OX + x * SCALE, OY - y * SCALE]; }
function toMath(sx, sy) { return [(sx - OX) / SCALE, (OY - sy) / SCALE]; }

function loop() {
ctx.clearRect(0, 0, W, H);

// クリックで中心更新
var cm = toMath(clickX, clickY);
// clickX/clickY はマウスクリックで更新されるが、ここではmx/myを使って疑似的に
// 実際には常にmxから距離計算
var mathC = toMath(mx, my);

// 半径 = マウスと中心の距離(画面座標)
var cx_s = OX + centerX * SCALE;
var cy_s = OY - centerY * SCALE;
var dr = Math.sqrt(Math.pow(mx - cx_s, 2) + Math.pow(my - cy_s, 2));
var r = dr / SCALE;
if (r < 0.3) r = 0.3;
if (r > 5) r = 5;

// グリッド
ctx.strokeStyle = '#161b22';
ctx.lineWidth = 1;
for (var gx = -7; gx <= 7; gx++) {
  ctx.beginPath(); ctx.moveTo(OX + gx*SCALE, 0); ctx.lineTo(OX + gx*SCALE, H); ctx.stroke();
}
for (var gy = -5; gy <= 5; gy++) {
  ctx.beginPath(); ctx.moveTo(0, OY - gy*SCALE); ctx.lineTo(W, OY - gy*SCALE); ctx.stroke();
}

// 軸
ctx.strokeStyle = '#30363d'; ctx.lineWidth = 1.5;
ctx.beginPath(); ctx.moveTo(0, OY); ctx.lineTo(W, OY); ctx.stroke();
ctx.beginPath(); ctx.moveTo(OX, 0); ctx.lineTo(OX, H); ctx.stroke();
ctx.fillStyle = '#8b949e'; ctx.font = '12px sans-serif';
ctx.fillText('x', W-14, OY-8); ctx.fillText('y', OX+6, 14);

// 円
var cxs = toScreen(centerX, centerY);
ctx.beginPath();
ctx.arc(cxs[0], cxs[1], r * SCALE, 0, Math.PI * 2);
ctx.strokeStyle = '#58a6ff';
ctx.lineWidth = 2.5;
ctx.stroke();
ctx.fillStyle = '#58a6ff08';
ctx.fill();

// 中心
ctx.beginPath();
ctx.arc(cxs[0], cxs[1], 5, 0, Math.PI * 2);
ctx.fillStyle = '#f0883e'; ctx.fill();
ctx.fillStyle = '#f0883e'; ctx.font = '12px sans-serif';
ctx.fillText('(' + centerX.toFixed(1) + ', ' + centerY.toFixed(1) + ')', cxs[0]+8, cxs[1]-8);

// 半径線
ctx.beginPath();
ctx.moveTo(cxs[0], cxs[1]);
ctx.lineTo(mx, my);
ctx.strokeStyle = '#f0883e80';
ctx.lineWidth = 1.5;
ctx.setLineDash([4,3]); ctx.stroke(); ctx.setLineDash([]);

// マウス上の点(円上に投影)
var angle = Math.atan2(my - cxs[1], mx - cxs[0]);
var px = cxs[0] + r * SCALE * Math.cos(angle);
var py = cxs[1] + r * SCALE * Math.sin(angle);
ctx.beginPath(); ctx.arc(px, py, 4, 0, Math.PI*2);
ctx.fillStyle = '#79c0ff'; ctx.fill();

// 半径ラベル
ctx.fillStyle = '#f0883e'; ctx.font = '12px sans-serif';
ctx.fillText('r = ' + r.toFixed(2), (cxs[0]+mx)/2+6, (cxs[1]+my)/2-6);

// 方程式計算
var a = centerX, b = centerY;
var D = -2 * a, E = -2 * b, F = a*a + b*b - r*r;

// パネル
ctx.fillStyle = '#0d1117e0';
ctx.fillRect(8, 8, 280, 120);
ctx.strokeStyle = '#30363d'; ctx.lineWidth = 1;
ctx.strokeRect(8, 8, 280, 120);

ctx.font = 'bold 13px monospace';
ctx.fillStyle = '#e6edf3';
ctx.fillText('標準形:', 16, 30);
ctx.fillStyle = '#58a6ff';
ctx.fillText('(x-' + a.toFixed(1) + ')²+(y-' + b.toFixed(1) + ')²', 16, 50);
ctx.fillText('  = ' + (r*r).toFixed(2), 16, 68);
ctx.fillStyle = '#8b949e'; ctx.font = '11px monospace';
ctx.fillText('一般形:', 16, 88);
ctx.fillStyle = '#79c0ff'; ctx.font = '11px monospace';
ctx.fillText('x²+y²' + (D>=0?'+':'')+D.toFixed(2)+'x' + (E>=0?'+':'')+E.toFixed(2)+'y' + (F>=0?'+':'')+F.toFixed(2)+'=0', 16, 106);
ctx.fillStyle = '#56d364'; ctx.font = '11px monospace';
ctx.fillText('中心(' + a.toFixed(2)+','+b.toFixed(2)+')  r='+r.toFixed(2), 16, 122);

requestAnimationFrame(loop);
}
loop();

具体的な例題

例題 1:標準形を書く

中心 (3,2)(3, -2)、半径 44 の円の方程式を求めよ。

「(x - 中心のx)² + (y - 中心のy)² = 半径²」に当てはめるだけ:

解:

(x3)2+(y+2)2=16(x - 3)^2 + (y + 2)^2 = 16

例題 2:一般形を標準形に変換

x2+y26x+4y3=0x^2 + y^2 - 6x + 4y - 3 = 0 の中心と半径を求めよ。

「xの項とyの項を別々にまとめて、それぞれ平方完成する」のが手順です:

解(平方完成):

(x26x)+(y2+4y)=3(x^2 - 6x) + (y^2 + 4y) = 3 (x3)29+(y+2)24=3(x - 3)^2 - 9 + (y + 2)^2 - 4 = 3 (x3)2+(y+2)2=16(x - 3)^2 + (y + 2)^2 = 16

中心 (3,2)(3, -2)、半径 44

例題 3:3 点を通る円

3 点 A(1,0)(1, 0)、B(0,1)(0, 1)、C(2,2)(2, 2) を通る円の方程式を求めよ。

「3点を通る円は一意に決まる」——3点の座標を使って3つの方程式を作り、連立して解きます:

解: 一般形 x2+y2+Dx+Ey+F=0x^2 + y^2 + Dx + Ey + F = 0 に 3 点を代入:

  • A(1,0)(1,0): 1+D+F=01 + D + F = 0
  • B(0,1)(0,1): 1+E+F=01 + E + F = 0
  • C(2,2)(2,2): 8+2D+2E+F=08 + 2D + 2E + F = 0

A と B より D=ED = E。A より F=1DF = -1 - D。C に代入:

8+2D+2D+(1D)=07+3D=0D=738 + 2D + 2D + (-1 - D) = 0 \Rightarrow 7 + 3D = 0 \Rightarrow D = -\frac{7}{3} E=73,F=1+73=43E = -\frac{7}{3}, \quad F = -1 + \frac{7}{3} = \frac{4}{3} x2+y273x73y+43=0x^2 + y^2 - \frac{7}{3}x - \frac{7}{3}y + \frac{4}{3} = 0

両辺 3 倍:3x2+3y27x7y+4=03x^2 + 3y^2 - 7x - 7y + 4 = 0

原点中心の円:最もシンプルな形

中心が原点 (0,0)(0, 0) のとき——「引く数がゼロだから何も変わらない」:

x2+y2=r2x^2 + y^2 = r^2

単位円は x2+y2=1x^2 + y^2 = 1(前回学んだ三角比の舞台!)——「半径1の円上の点の座標が (cosθ,sinθ)(cos\theta, sin\theta)」でしたね。

まとめ

  • 標準形 (xa)2+(yb)2=r2(x-a)^2 + (y-b)^2 = r^2:中心・半径が一目瞭然——「コンパスの設定を式にした形」
  • 一般形 x2+y2+Dx+Ey+F=0x^2 + y^2 + Dx + Ey + F = 0:展開した形——「x²+y²が見えたら円を疑う」
  • 一般形 → 標準形:平方完成が鍵——「xの項、yの項をそれぞれまとめる」
  • 3 点から円:一般形に代入して連立方程式——「3点あれば円は一意に決まる」

次回は「直線と円の位置関係」——交わる・接する・離れる——を判定する方法を学びます。