直線の方程式
直線を式で表す
「地図上の道路を数式で表せたら?」——2点を指定するだけで、その2点を通る唯一の直線が決まります。中学では「」のような式が直線を表すことを学びました。高校ではより一般的な形を使い、直線どうしの関係や点と直線の距離なども計算します。
直線の方程式の 3 つの形
1. 傾き切片形(slope-intercept form)
「1歩右に進むと何歩上がるか」——それが傾きです。
- :傾き(1 だけ右に進むと だけ上がる)
- : 切片( のときの 値)——「 軸のどこで交わるか」
最も読みやすい形ですが、垂直な直線()を表せない欠点があります——「真上に進む坂道」は傾きが無限大になってしまうからです。
2. 一般形(general form)
- 垂直な直線も含め、すべての直線を表せる——「どんな直線も統一的に扱える」
- なら に変換できる
- 係数が整数になりやすく、計算に便利
3. 点傾き形(point-slope form)
「この点を通って、この傾きの直線」——という情報から式を作ります:
点 を通り傾き の直線:
直線を「通る点」と「傾き」で定義するときに使います。
4. 二点形(two-point form)
「2点を結ぶ直線」——2点間の傾きをそのまま使います:
異なる 2 点 、 を通る直線:
二直線の関係
二直線の傾きを 、 とすると——「2本の道路が平行か垂直かを傾きで判定できる」:
垂直条件は「傾きが負の逆数」として覚えましょう。傾き 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();
点と直線の距離
「駅から道路までの最短距離は?」——数学では「点から直線に引いた垂線の長さ」がそれです。最も重要な公式のひとつです。点 から直線 までの距離は:
なぜこの式になるのか
直線 の法線(垂直な方向)のベクトルは です。 点 から直線上の点 へのベクトル を法線方向に射影した長さが距離です——「ベクトルの影の長さ」として求めます。
計算をていねいに追うと、上の公式が得られます。
具体例
点 から直線 までの距離:
「3-4-5の直角三角形」が分母に現れるのは覚えやすいですね。
直線の方程式の応用
二直線の交点
を連立方程式として解く——「2本の道が交わる場所」を求める計算です。
角の二等分線
二直線 、 の角の二等分線は、「両直線からの距離が等しい点の集まり」——それを式で表すと:
まとめ
- 傾き切片形 :読みやすいが垂直線を表せない——「普段使いの形」
- 一般形 :すべての直線を統一的に扱える——「計算に便利な形」
- 垂直条件:——「傾きが負の逆数になる」
- 点と直線の距離:——「絶対値を分子に、長さを分母に」
次回は平面上の「円の方程式」を学びます。