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

直線と円の位置関係

3 つの位置関係

「コースターの上を列車が走る」——列車(直線)が円のコース(円)と、どのような位置関係になるかを考えましょう。

直線と円は以下の 3 パターンのどれかになります:

  1. 2 点で交わる(交叉):直線が円を横切る——「列車がトンネルに入って出る」
  2. 接する(接線):直線が円にちょうど 1 点で触れる——「列車がコースに接触する瞬間」
  3. 離れている(不相交):直線と円が全く交わらない——「列車とコースが別の場所」

この判定に使うのが「中心から直線への距離 dd半径 rr の比較」です。

判定条件

円の中心 OO(または (a,b)(a, b))から直線 ll までの距離を dd、円の半径を rr とすると——「中心から直線がどのくらい遠いか」と「円の大きさ」を比べます:

d<r    2点で交わる(2交点)d < r \iff \text{2点で交わる(2交点)} d=r    接する(接点が1つ)d = r \iff \text{接する(接点が1つ)} d>r    離れている(交点なし)d > r \iff \text{離れている(交点なし)}

これは非常に美しい判定条件です。距離と半径を比べるだけで位置関係が決まります——「直線が円の中心に届くかどうか」を半径を基準に判定しているイメージです。

接線の方程式

円上の点 (x1,y1)(x_1, y_1) における接線

「円の上の点から接線を引く」——その点での接線は、半径に対して垂直です。円 x2+y2=r2x^2 + y^2 = r^2 上の点 (x1,y1)(x_1, y_1) における接線:

x1x+y1y=r2x_1 x + y_1 y = r^2

x2x^2x1xx_1 x になり、y2y^2y1yy_1 y になる」——シンプルで覚えやすい形です。

外部の点 (p,q)(p, q) から引いた接線

「円の外にある点から、円に接線を引いたとき、接点まで何の長さ?」——ピタゴラスの定理で求められます:

(xa)2+(yb)2=r2(x-a)^2 + (y-b)^2 = r^2 に外部点 (p,q)(p, q) から引いた 2 本の接線の長さ(接点までの距離):

l=(pa)2+(qb)2r2l = \sqrt{(p-a)^2 + (q-b)^2 - r^2}

インタラクティブ図解:位置関係の変化

マウスを左右に動かすと直線が平行移動します。距離と判定結果がリアルタイムに変わり、状態に応じて色も変化します。

マウスを左右に動かして直線の位置を変える。色が位置関係を示す

var OX = 300, OY = 190, SCALE = 40;

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

// 円:中心 (0,0)、半径 3
var r = 3;
var rPx = r * SCALE;

// 直線 x = c(垂直直線で単純化)
// mx で c を制御: -5 to 5
var c = ((mx / W) * 10) - 5;

// 中心から直線 x = c までの距離
var dist = Math.abs(c);

// グリッド
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 = -4; 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();

// 位置関係に応じた色
var lineColor, status, statusColor;
if (dist < r - 0.05) {
  lineColor = '#56d364'; status = '2点で交わる'; statusColor = '#56d364';
} else if (dist <= r + 0.05) {
  lineColor = '#ffa657'; status = '接する'; statusColor = '#ffa657';
} else {
  lineColor = '#f85149'; status = '離れている'; statusColor = '#f85149';
}

// 円
ctx.beginPath();
ctx.arc(OX, OY, rPx, 0, Math.PI*2);
ctx.strokeStyle = '#58a6ff';
ctx.lineWidth = 2.5;
ctx.stroke();
ctx.fillStyle = '#58a6ff0a';
ctx.fill();

// 中心
ctx.beginPath(); ctx.arc(OX, OY, 4, 0, Math.PI*2);
ctx.fillStyle = '#58a6ff'; ctx.fill();

// 直線 x = c
var lx = OX + c * SCALE;
ctx.beginPath();
ctx.moveTo(lx, 0); ctx.lineTo(lx, H);
ctx.strokeStyle = lineColor;
ctx.lineWidth = 2.5;
ctx.stroke();

// 中心から直線への距離の矢印
ctx.beginPath();
ctx.moveTo(OX, OY);
ctx.lineTo(lx, OY);
ctx.strokeStyle = '#ffa657';
ctx.lineWidth = 2;
ctx.setLineDash([5,4]); ctx.stroke(); ctx.setLineDash([]);

ctx.fillStyle = '#ffa657'; ctx.font = '12px sans-serif';
ctx.fillText('d = ' + dist.toFixed(2), (OX+lx)/2 - 18, OY - 10);

// 半径ラベル
ctx.fillStyle = '#79c0ff'; ctx.font = '12px sans-serif';
ctx.fillText('r = ' + r, OX + 6, OY - rPx + 16);

// 交点(2点の場合)
if (dist < r) {
  var dy = Math.sqrt(r*r - c*c);
  var p1y = OY - dy * SCALE;
  var p2y = OY + dy * SCALE;
  ctx.beginPath(); ctx.arc(lx, p1y, 6, 0, Math.PI*2);
  ctx.fillStyle = '#56d364'; ctx.fill();
  ctx.beginPath(); ctx.arc(lx, p2y, 6, 0, Math.PI*2);
  ctx.fillStyle = '#56d364'; ctx.fill();

  // 交点座標
  ctx.fillStyle = '#56d364'; ctx.font = '11px monospace';
  ctx.fillText('(' + c.toFixed(1) + ', ' + dy.toFixed(2) + ')', lx+8, p1y-8);
  ctx.fillText('(' + c.toFixed(1) + ', -' + dy.toFixed(2) + ')', lx+8, p2y+14);
} else if (dist <= r + 0.05) {
  ctx.beginPath(); ctx.arc(lx, OY, 7, 0, Math.PI*2);
  ctx.fillStyle = '#ffa657'; ctx.fill();
  ctx.fillStyle = '#ffa657'; ctx.font = '11px monospace';
  ctx.fillText('接点 (' + c.toFixed(1) + ', 0)', lx+10, OY+18);
}

// ステータスパネル
ctx.fillStyle = '#0d1117e0';
ctx.fillRect(10, 10, 230, 110);
ctx.strokeStyle = '#30363d'; ctx.lineWidth = 1;
ctx.strokeRect(10, 10, 230, 110);

ctx.font = 'bold 15px monospace';
ctx.fillStyle = statusColor;
ctx.fillText(status, 20, 34);

ctx.font = '12px monospace';
ctx.fillStyle = '#e6edf3';
ctx.fillText('円: x² + y² = ' + r*r, 20, 56);
ctx.fillText('直線: x = ' + c.toFixed(2), 20, 74);
ctx.fillStyle = '#ffa657';
ctx.fillText('d = ' + dist.toFixed(3) + '  r = ' + r, 20, 92);
ctx.fillStyle = statusColor;
ctx.fillText('d ' + (dist < r-0.05 ? '<' : dist > r+0.05 ? '>' : '=') + ' r → ' + status, 20, 110);

requestAnimationFrame(loop);
}
loop();

判別式との関係

「連立方程式を解いて交点を求める」アプローチでも同じ答えが出ます。直線 y=mx+ny = mx + n と円 x2+y2=r2x^2 + y^2 = r^2 の交点を求めるとき、yy を代入して xx の二次方程式を得ます:

(1+m2)x2+2mnx+(n2r2)=0(1 + m^2)x^2 + 2mnx + (n^2 - r^2) = 0

この判別式 Δ\Delta は:

Δ=4m2n24(1+m2)(n2r2)=4r2(1+m2)4n2\Delta = 4m^2n^2 - 4(1+m^2)(n^2-r^2) = 4r^2(1+m^2) - 4n^2 Δ>0    2 交点(交叉)\Delta > 0 \iff 2 \text{ 交点(交叉)} Δ=0    1 交点(接線)\Delta = 0 \iff 1 \text{ 交点(接線)} Δ<0    交点なし(離れている)\Delta < 0 \iff \text{交点なし(離れている)}

この判別式の条件と、距離による条件は同値です——「同じことを異なる形で表している」ので、どちらから考えても同じ答えが出ます。

接線の具体例

例題 1

x2+y2=25x^2 + y^2 = 25 上の点 (3,4)(3, 4) における接線を求めよ。

「公式に代入するだけ」——x1=3x_1=3y1=4y_1=4r2=25r^2=25 を入れます:

解:

公式 x1x+y1y=r2x_1 x + y_1 y = r^2 を使って:

3x+4y=253x + 4y = 25

検証: 中心 (0,0)(0,0) からこの直線 3x+4y25=03x + 4y - 25 = 0 への距離は:

d=30+40259+16=255=5=rd = \frac{|3 \cdot 0 + 4 \cdot 0 - 25|}{\sqrt{9 + 16}} = \frac{25}{5} = 5 = r \quad \checkmark

「3-4-5の直角三角形」が確認にも登場します。

例題 2

外部点 (7,1)(7, 1) から円 x2+y2=25x^2 + y^2 = 25 に接線を引く。接線の長さを求めよ。

「中心までの距離の二乗から半径の二乗を引いて平方根」——ピタゴラスの定理を逆に使う形です:

解:

l=72+1225=49+125=25=5l = \sqrt{7^2 + 1^2 - 25} = \sqrt{49 + 1 - 25} = \sqrt{25} = 5

2 円の位置関係

「2つの円がどんな位置にあるか」も、中心間距離と半径の組み合わせで判定できます:

C1C_1(中心 O1O_1、半径 r1r_1)と円 C2C_2(中心 O2O_2、半径 r2r_2)、中心間距離 d=O1O2d = O_1O_2 として:

条件関係
d>r1+r2d > r_1 + r_2外側で離れている
d=r1+r2d = r_1 + r_2外接(1 点で接する)
r1r2<d<r1+r2\lvert r_1 - r_2 \rvert < d < r_1 + r_22 点で交わる
d=r1r2d = \lvert r_1 - r_2 \rvert内接(1 点で接する)
d<r1r2d < \lvert r_1 - r_2 \rvert一方が他方の内部

まとめ

  • 直線と円の位置関係は「中心から直線への距離 dd」と「半径 rr」の大小で決まる——「距離と半径を比べるだけ」
  • d<rd < r:2 交点、d=rd = r:接する、d>rd > r:離れている
  • 接線公式(円上の点):x1x+y1y=r2x_1x + y_1y = r^2(原点中心の場合)——「x² が x₁x に、y² が y₁y になる」
  • 判別式とも同値な関係になっている——「代数的な方法と幾何的な方法は同じ答えを出す」

次回は二次曲線(放物線・楕円・双曲線)という、円を一般化した美しい曲線群を学びます。