直線と円の位置関係
3 つの位置関係
「コースターの上を列車が走る」——列車(直線)が円のコース(円)と、どのような位置関係になるかを考えましょう。
直線と円は以下の 3 パターンのどれかになります:
- 2 点で交わる(交叉):直線が円を横切る——「列車がトンネルに入って出る」
- 接する(接線):直線が円にちょうど 1 点で触れる——「列車がコースに接触する瞬間」
- 離れている(不相交):直線と円が全く交わらない——「列車とコースが別の場所」
この判定に使うのが「中心から直線への距離 と 半径 の比較」です。
判定条件
円の中心 (または )から直線 までの距離を 、円の半径を とすると——「中心から直線がどのくらい遠いか」と「円の大きさ」を比べます:
これは非常に美しい判定条件です。距離と半径を比べるだけで位置関係が決まります——「直線が円の中心に届くかどうか」を半径を基準に判定しているイメージです。
接線の方程式
円上の点 における接線
「円の上の点から接線を引く」——その点での接線は、半径に対して垂直です。円 上の点 における接線:
「 が になり、 が になる」——シンプルで覚えやすい形です。
外部の点 から引いた接線
「円の外にある点から、円に接線を引いたとき、接点まで何の長さ?」——ピタゴラスの定理で求められます:
円 に外部点 から引いた 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();
判別式との関係
「連立方程式を解いて交点を求める」アプローチでも同じ答えが出ます。直線 と円 の交点を求めるとき、 を代入して の二次方程式を得ます:
この判別式 は:
この判別式の条件と、距離による条件は同値です——「同じことを異なる形で表している」ので、どちらから考えても同じ答えが出ます。
接線の具体例
例題 1
円 上の点 における接線を求めよ。
「公式に代入するだけ」——、、 を入れます:
解:
公式 を使って:
検証: 中心 からこの直線 への距離は:
「3-4-5の直角三角形」が確認にも登場します。
例題 2
外部点 から円 に接線を引く。接線の長さを求めよ。
「中心までの距離の二乗から半径の二乗を引いて平方根」——ピタゴラスの定理を逆に使う形です:
解:
2 円の位置関係
「2つの円がどんな位置にあるか」も、中心間距離と半径の組み合わせで判定できます:
円 (中心 、半径 )と円 (中心 、半径 )、中心間距離 として:
| 条件 | 関係 |
|---|---|
| 外側で離れている | |
| 外接(1 点で接する) | |
| 2 点で交わる | |
| 内接(1 点で接する) | |
| 一方が他方の内部 |
まとめ
- 直線と円の位置関係は「中心から直線への距離 」と「半径 」の大小で決まる——「距離と半径を比べるだけ」
- :2 交点、:接する、:離れている
- 接線公式(円上の点):(原点中心の場合)——「x² が x₁x に、y² が y₁y になる」
- 判別式とも同値な関係になっている——「代数的な方法と幾何的な方法は同じ答えを出す」
次回は二次曲線(放物線・楕円・双曲線)という、円を一般化した美しい曲線群を学びます。