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

軌跡の求め方

軌跡とは

「振り子が空気中を動くとき、振り子の先端が描く道すじ」——これが軌跡のイメージです。ある条件を満たしながら動く点が、どんな図形を描くかを調べるのが軌跡の問題です。

「点 P が条件 C を満たしながら動くとき、P が通る道すじ全体」を軌跡(locus)と言います。

条件 C は例えば:

  • 「2 定点から等距離」→ 垂直二等分線
  • 「1 定点から距離が一定」→ 円
  • 「線分の中点」→ 何らかの直線や円弧
  • 「2 定点からの距離の和が一定」→ 楕円

軌跡の問題は幾何の条件を代数の式に翻訳する訓練です——「日本語の条件を数式に書き換える」と考えると分かりやすいです。

軌跡を求める手順

ステップ 1: 求めたい点の座標を (x,y)(x, y) とおく——「答えの点に名前をつける」

ステップ 2: 問題の条件を x,yx, y の等式(または不等式)に翻訳する——「日本語を数式にする」

ステップ 3: 式を整理・変形して標準的な形(直線・円・放物線等)を特定する——「どんな図形かを見抜く」

ステップ 4: (重要!)x,yx, y の取りうる範囲を確認し、軌跡の一部かどうか確認する——「答えが正しい範囲か検証する」

典型パターン①:中点の軌跡

問題: 点 A(2,0)(2, 0) と、円 x2+y2=9x^2 + y^2 = 9 上の点 B の中点 M の軌跡を求めよ。

「B が円の上を動くとき、A と B の真ん中の点はどんな軌跡を描くか」——B が動くとMも動きます。

解法:

B の座標を (bx,by)(b_x, b_y) とおく(bx2+by2=9b_x^2 + b_y^2 = 9)。

M の座標は (2+bx2,0+by2)=(x,y)\left(\frac{2 + b_x}{2}, \frac{0 + b_y}{2}\right) = (x, y) とおくと——「Mの座標をxとyで表すと」:

bx=2x2,by=2yb_x = 2x - 2, \quad b_y = 2y

B は円上なので (2x2)2+(2y)2=9(2x-2)^2 + (2y)^2 = 9——「BがもとのCircle上にある」という条件を代入:

4(x1)2+4y2=94(x-1)^2 + 4y^2 = 9 (x1)2+y2=94(x-1)^2 + y^2 = \frac{9}{4}

中心 (1,0)(1, 0)、半径 3/23/2 の円が軌跡——「元の円を半径半分にして、AとBの中点の方向に移動した円」です。

インタラクティブ図解:軌跡の可視化

点 A を固定し、点 B が円上を動くとき、その中点 M が描く軌跡をリアルタイムで見てみましょう。

点 B が円上を動き、中点 M が軌跡を描く。軌跡が別の円になっていることを確認

var OX = 300, OY = 190, SC = 45;
var trail = [];
var t = 0;

function toS(x, y) { return [OX + x*SC, OY - y*SC]; }

function loop() {
ctx.clearRect(0, 0, W, H);
t += 0.025;

// グリッド
ctx.strokeStyle = '#161b22'; ctx.lineWidth = 1;
for (var gx = -6; gx <= 6; gx++) {
  ctx.beginPath(); ctx.moveTo(OX+gx*SC,0); ctx.lineTo(OX+gx*SC,H); ctx.stroke();
}
for (var gy = -4; gy <= 4; gy++) {
  ctx.beginPath(); ctx.moveTo(0,OY-gy*SC); ctx.lineTo(W,OY-gy*SC); 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);

// 元の円 x²+y²=9 (r=3)
ctx.beginPath(); ctx.arc(OX, OY, 3*SC, 0, Math.PI*2);
ctx.strokeStyle = '#30363d'; ctx.lineWidth = 1.5; ctx.stroke();

// 点 A (2, 0)
var Ax = 2, Ay = 0;
var As = toS(Ax, Ay);
ctx.beginPath(); ctx.arc(As[0], As[1], 7, 0, Math.PI*2);
ctx.fillStyle = '#f0883e'; ctx.fill();
ctx.fillStyle = '#f0883e'; ctx.font = 'bold 13px sans-serif';
ctx.fillText('A(2, 0)', As[0]+10, As[1]-8);

// 点 B: 円上を動く
var Bx = 3 * Math.cos(t), By = 3 * Math.sin(t);
var Bs = toS(Bx, By);
ctx.beginPath(); ctx.arc(Bs[0], Bs[1], 6, 0, Math.PI*2);
ctx.fillStyle = '#58a6ff'; ctx.fill();
ctx.fillStyle = '#58a6ff'; ctx.font = 'bold 13px sans-serif';
ctx.fillText('B', Bs[0]+8, Bs[1]-6);

// 中点 M
var Mx = (Ax + Bx) / 2, My = (Ay + By) / 2;
var Ms = toS(Mx, My);

// 軌跡のトレイル
trail.push([Ms[0], Ms[1]]);
if (trail.length > 200) trail.shift();

for (var i = 1; i < trail.length; i++) {
  var alpha = i / trail.length;
  ctx.beginPath();
  ctx.moveTo(trail[i-1][0], trail[i-1][1]);
  ctx.lineTo(trail[i][0], trail[i][1]);
  ctx.strokeStyle = 'rgba(86, 211, 100, ' + alpha + ')';
  ctx.lineWidth = 2;
  ctx.stroke();
}

// 理論的な軌跡円: 中心(1,0), r=1.5
ctx.beginPath(); ctx.arc(toS(1,0)[0], toS(1,0)[1], 1.5*SC, 0, Math.PI*2);
ctx.strokeStyle = '#56d36440'; ctx.lineWidth = 1.5; ctx.setLineDash([5,3]);
ctx.stroke(); ctx.setLineDash([]);

// AB 線分
ctx.beginPath(); ctx.moveTo(As[0], As[1]); ctx.lineTo(Bs[0], Bs[1]);
ctx.strokeStyle = '#8b949e'; ctx.lineWidth = 1; ctx.setLineDash([3,3]);
ctx.stroke(); ctx.setLineDash([]);

// M
ctx.beginPath(); ctx.arc(Ms[0], Ms[1], 7, 0, Math.PI*2);
ctx.fillStyle = '#56d364'; ctx.fill();
ctx.fillStyle = '#56d364'; ctx.font = 'bold 13px sans-serif';
ctx.fillText('M', Ms[0]+8, Ms[1]-6);

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

ctx.font = '12px monospace';
ctx.fillStyle = '#e6edf3';
ctx.fillText('B = (' + Bx.toFixed(2) + ', ' + By.toFixed(2) + ')', 16, 28);
ctx.fillStyle = '#56d364';
ctx.fillText('M = (' + Mx.toFixed(2) + ', ' + My.toFixed(2) + ')', 16, 48);
ctx.fillStyle = '#8b949e';
ctx.fillText('軌跡:(x-1)²+y²= 9/4', 16, 68);
ctx.fillStyle = '#79c0ff';
ctx.fillText('中心(1,0) 半径 3/2', 16, 88);

requestAnimationFrame(loop);
}
loop();

典型パターン②:等距離条件

問題: 定点 A(3,0)(3, 0) と定直線 x=3x = -3 から等距離にある点 P の軌跡を求めよ。

「ある点と直線から等距離の点の集まり」——これは前回学んだ放物線の定義そのものです!

解法:

P(x,y)(x, y) とおく。A からの距離 = 直線 x=3x = -3 からの距離より:

(x3)2+y2=x+3\sqrt{(x-3)^2 + y^2} = |x + 3|

両辺を 2 乗——「両辺を2乗してルートを外す」定番の手順:

(x3)2+y2=(x+3)2(x-3)^2 + y^2 = (x+3)^2 x26x+9+y2=x2+6x+9x^2 - 6x + 9 + y^2 = x^2 + 6x + 9 y2=12xy^2 = 12x

放物線 y2=12xy^2 = 12x(焦点 (3,0)(3, 0)、準線 x=3x = -3)——これは放物線の定義そのものです!

典型パターン③:比分点の軌跡

問題: 2 定点 A(2,0)(-2, 0)、B(4,0)(4, 0) に対して PA:PB=2:1PA : PB = 2 : 1 となる点 P の軌跡を求めよ。

「2点からの距離の比が一定」という条件——結果は「アポロニウスの円」と呼ばれます。

解法(アポロニウスの円):

P(x,y)(x, y) とおく。PA:PB=2:1PA : PB = 2 : 1 なので PA=2PBPA = 2PB——「距離の比を等式にする」:

(x+2)2+y2=4[(x4)2+y2](x+2)^2 + y^2 = 4[(x-4)^2 + y^2] x2+4x+4+y2=4x232x+64+4y2x^2 + 4x + 4 + y^2 = 4x^2 - 32x + 64 + 4y^2 3x236x+3y2=603x^2 - 36x + 3y^2 = -60 x212x+y2=20x^2 - 12x + y^2 = -20 (x6)2+y2=16(x-6)^2 + y^2 = 16

中心 (6,0)(6, 0)、半径 44 の円(アポロニウスの円)。

よくある軌跡の結果まとめ

条件軌跡
1 定点から一定距離
2 定点から等距離垂直二等分線
2 定点からの距離の比が一定円(アポロニウス)
2 定点からの距離の和が一定楕円
2 定点からの距離の差の絶対値が一定双曲線
1 定点と 1 定直線から等距離放物線

注意点:範囲の確認

軌跡を求めたら必ず「点が取りうる範囲」を確認します——「式は正しくても、点が実際には到達しない場所がある」ことがあります。

例:直径 AB の両端 A(0,0)(0,0)、B(4,0)(4,0) を使い、AB を直径とする円の円周上の点 P を求める問題では、APB=90°\angle APB = 90°(タレスの定理)という条件から x24x+y2=0x^2 - 4x + y^2 = 0(中心 (2,0)(2,0) 半径 22 の円)が得られますが、A と B 自身は含まれません——「A や B では APB\angle APB が定義できないから」。

まとめ

  • 軌跡 = 条件を満たす点 (x,y)(x, y) の集合を式で表したもの——「条件を満たす点の居場所」
  • 手順:条件を x,yx, y の式に翻訳 → 整理 → 標準形に変形——「日本語→数式→図形名」
  • 典型パターン(等距離・比・中点)をマスターすると多くの問題が解ける
  • 範囲の確認を忘れずに(端点・除外点のチェック)——「正しい式でも範囲を間違えると答えが変わる」

次回は「不等式の表す領域」——方程式から不等式へと視点を広げます。