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

直線の方程式

直線を式で表す

「地図上の道路を数式で表せたら?」——2点を指定するだけで、その2点を通る唯一の直線が決まります。中学では「y=2x+3y = 2x + 3」のような式が直線を表すことを学びました。高校ではより一般的な形を使い、直線どうしの関係や点と直線の距離なども計算します。

直線の方程式の 3 つの形

1. 傾き切片形(slope-intercept form)

「1歩右に進むと何歩上がるか」——それが傾きです。

y=mx+by = mx + b
  • mm:傾き(1 だけ右に進むと mm だけ上がる)
  • bbyy 切片(x=0x=0 のときの yy 値)——「yy 軸のどこで交わるか」

最も読みやすい形ですが、垂直な直線(x=kx = k)を表せない欠点があります——「真上に進む坂道」は傾きが無限大になってしまうからです。

2. 一般形(general form)

ax+by+c=0ax + by + c = 0
  • 垂直な直線も含め、すべての直線を表せる——「どんな直線も統一的に扱える」
  • b0b \neq 0 なら y=abxcby = -\frac{a}{b}x - \frac{c}{b} に変換できる
  • 係数が整数になりやすく、計算に便利

3. 点傾き形(point-slope form)

「この点を通って、この傾きの直線」——という情報から式を作ります:

(x1,y1)(x_1, y_1) を通り傾き mm の直線:

yy1=m(xx1)y - y_1 = m(x - x_1)

直線を「通る点」と「傾き」で定義するときに使います。

4. 二点形(two-point form)

「2点を結ぶ直線」——2点間の傾きをそのまま使います:

異なる 2 点 (x1,y1)(x_1, y_1)(x2,y2)(x_2, y_2) を通る直線:

yy1xx1=y2y1x2x1\frac{y - y_1}{x - x_1} = \frac{y_2 - y_1}{x_2 - x_1}

二直線の関係

二直線の傾きを m1m_1m2m_2 とすると——「2本の道路が平行か垂直かを傾きで判定できる」:

平行:m1=m2(一致しない)\text{平行:} m_1 = m_2 \quad (\text{一致しない}) 垂直:m1m2=1\text{垂直:} m_1 \cdot m_2 = -1

垂直条件は「傾きが負の逆数」として覚えましょう。傾き 3 の直線と垂直な直線の傾きは 1/3-1/3 です——「3倍急な坂道に垂直な道は、逆向きに1/3の勾配」というイメージです。

インタラクティブ図解:直線と距離

マウスを動かすと直線の傾きと切片が変わります。原点から直線への距離もリアルタイムに表示されます。

マウスを動かして直線のパラメータを変える。原点から直線への距離に注目

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

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

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

// グリッド
ctx.strokeStyle = '#161b22';
ctx.lineWidth = 1;
for (var gx = -7; gx <= 7; gx++) {
  var sx = OX + gx * SCALE;
  ctx.beginPath(); ctx.moveTo(sx, 0); ctx.lineTo(sx, H); ctx.stroke();
}
for (var gy = -4; gy <= 4; gy++) {
  var sy = OY - gy * SCALE;
  ctx.beginPath(); ctx.moveTo(0, sy); ctx.lineTo(W, sy); 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 - 15, OY - 8);
ctx.fillText('y', OX + 6, 14);
for (var i = -6; i <= 6; i++) {
  if (i !== 0) {
    ctx.fillText(i, OX + i * SCALE - 5, OY + 16);
  }
}

// mx で傾きを、my で切片を制御
var slope = ((mx / W) * 6 - 3);
var intercept = ((my / H) * 6 - 3);

// 直線 y = slope * x + intercept -> slope*x - y + intercept = 0
// a = slope, b = -1, c = intercept
var a = slope, b = -1, c_val = intercept;

// 直線を描画
var x1 = -8, y1 = slope * x1 + intercept;
var x2 = 8, y2 = slope * x2 + intercept;
var p1 = toScreen(x1, y1), p2 = toScreen(x2, y2);

ctx.beginPath();
ctx.moveTo(p1[0], p1[1]);
ctx.lineTo(p2[0], p2[1]);
ctx.strokeStyle = '#58a6ff';
ctx.lineWidth = 2.5;
ctx.stroke();

// 原点から直線への垂線
// 垂線の足: (x0, y0) = (-ac/(a²+b²), -bc/(a²+b²)) (一般形ax+by+c=0)
var denom = a * a + b * b;
var fx = -a * c_val / denom;
var fy = -b * c_val / denom;
var dist = Math.abs(c_val) / Math.sqrt(denom);
var pfx = toScreen(fx, fy);

ctx.beginPath();
ctx.moveTo(OX, OY);
ctx.lineTo(pfx[0], pfx[1]);
ctx.strokeStyle = '#f0883e';
ctx.lineWidth = 2;
ctx.setLineDash([5, 4]);
ctx.stroke();
ctx.setLineDash([]);

// 垂線の足に点
ctx.beginPath();
ctx.arc(pfx[0], pfx[1], 5, 0, Math.PI * 2);
ctx.fillStyle = '#f0883e';
ctx.fill();

// 距離ラベル
ctx.fillStyle = '#f0883e';
ctx.font = '13px sans-serif';
ctx.fillText('d = ' + dist.toFixed(3), (OX + pfx[0]) / 2 + 10, (OY + pfx[1]) / 2 - 8);

// 直角マーク
var nx = -(fy - 0), ny = fx - 0; // 直線の法線方向
var nl = Math.sqrt(nx*nx + ny*ny);
if (nl > 0.01 && dist > 0.1) {
  nx /= nl; ny /= nl;
  var tx = -(b), ty = -(a); // 接線方向(直線に沿う)
  var tl = Math.sqrt(tx*tx + ty*ty);
  tx /= tl; ty /= tl;
  var s = toScreen(fx, fy);
  var sq = 8 / SCALE;
  // 直角マーク(画面座標で)
  ctx.strokeStyle = '#f0883e80';
  ctx.lineWidth = 1;
}

// 切片点
var yIntPt = toScreen(0, intercept);
ctx.beginPath();
ctx.arc(yIntPt[0], yIntPt[1], 5, 0, Math.PI*2);
ctx.fillStyle = '#56d364';
ctx.fill();

// 傾きの視覚化 (Δx=1 の矢印)
if (Math.abs(intercept) < 3) {
  var px0 = toScreen(0, intercept), px1 = toScreen(1, intercept + slope);
  ctx.beginPath(); ctx.moveTo(px0[0], px0[1]); ctx.lineTo(px1[0], px0[1]);
  ctx.strokeStyle = '#ffa657'; ctx.lineWidth = 1.5; ctx.stroke();
  ctx.beginPath(); ctx.moveTo(px1[0], px0[1]); ctx.lineTo(px1[0], px1[1]);
  ctx.strokeStyle = '#ffa657'; ctx.lineWidth = 1.5; ctx.stroke();
  ctx.fillStyle = '#ffa657'; ctx.font = '11px sans-serif';
  ctx.fillText('Δy=' + slope.toFixed(1), px1[0] + 4, (px0[1] + px1[1]) / 2);
}

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

ctx.font = 'bold 13px monospace';
ctx.fillStyle = '#58a6ff';
ctx.fillText('y = ' + slope.toFixed(2) + 'x + ' + intercept.toFixed(2), 18, 32);
ctx.fillStyle = '#8b949e';
ctx.font = '12px monospace';
ctx.fillText('傾き m = ' + slope.toFixed(2), 18, 52);
ctx.fillStyle = '#56d364';
ctx.fillText('y切片 b = ' + intercept.toFixed(2), 18, 70);
ctx.fillStyle = '#f0883e';
ctx.fillText('原点からの距離 d:', 18, 90);
ctx.font = 'bold 13px monospace';
ctx.fillText('  = ' + dist.toFixed(3), 18, 108);

requestAnimationFrame(loop);
}
loop();

点と直線の距離

「駅から道路までの最短距離は?」——数学では「点から直線に引いた垂線の長さ」がそれです。最も重要な公式のひとつです。点 (x0,y0)(x_0, y_0) から直線 ax+by+c=0ax + by + c = 0 までの距離は:

d=ax0+by0+ca2+b2\boxed{d = \frac{|ax_0 + by_0 + c|}{\sqrt{a^2 + b^2}}}

なぜこの式になるのか

直線 ax+by+c=0ax + by + c = 0 の法線(垂直な方向)のベクトルは (a,b)(a, b) です。 点 (x0,y0)(x_0, y_0) から直線上の点 (x1,y1)(x_1, y_1) へのベクトル (x0x1,y0y1)(x_0 - x_1, y_0 - y_1) を法線方向に射影した長さが距離です——「ベクトルの影の長さ」として求めます。

計算をていねいに追うと、上の公式が得られます。

具体例

(3,2)(3, 2) から直線 3x4y+5=03x - 4y + 5 = 0 までの距離:

d=3342+532+(4)2=98+59+16=65=1.2d = \frac{|3 \cdot 3 - 4 \cdot 2 + 5|}{\sqrt{3^2 + (-4)^2}} = \frac{|9 - 8 + 5|}{\sqrt{9 + 16}} = \frac{6}{5} = 1.2

「3-4-5の直角三角形」が分母に現れるのは覚えやすいですね。

直線の方程式の応用

二直線の交点

{a1x+b1y+c1=0a2x+b2y+c2=0\begin{cases} a_1x + b_1y + c_1 = 0 \\ a_2x + b_2y + c_2 = 0 \end{cases} を連立方程式として解く——「2本の道が交わる場所」を求める計算です。

角の二等分線

二直線 l1:a1x+b1y+c1=0l_1: a_1x + b_1y + c_1 = 0l2:a2x+b2y+c2=0l_2: a_2x + b_2y + c_2 = 0 の角の二等分線は、「両直線からの距離が等しい点の集まり」——それを式で表すと:

a1x+b1y+c1a12+b12=±a2x+b2y+c2a22+b22\frac{a_1x + b_1y + c_1}{\sqrt{a_1^2 + b_1^2}} = \pm \frac{a_2x + b_2y + c_2}{\sqrt{a_2^2 + b_2^2}}

まとめ

  • 傾き切片形 y=mx+by = mx + b:読みやすいが垂直線を表せない——「普段使いの形」
  • 一般形 ax+by+c=0ax + by + c = 0:すべての直線を統一的に扱える——「計算に便利な形」
  • 垂直条件:m1m2=1m_1 m_2 = -1——「傾きが負の逆数になる」
  • 点と直線の距離:d=ax0+by0+c/a2+b2d = |ax_0 + by_0 + c| / \sqrt{a^2 + b^2}——「絶対値を分子に、長さを分母に」

次回は平面上の「円の方程式」を学びます。