C 言語で 2 点から直線の方程式を求める

CBeginner
オンラインで実践に進む

はじめに

この実験では、C プログラミングで 2 つの点から直線の式を求める方法を学びます。この実験は、3 つの主要なステップで構成されています。2 つの点から傾きを計算し、傾きと既知の点を使用して y 切片を計算し、最後に y = mx + b の形で完全な直線の方程式を出力します。この実験の終わりまでに、C 言語を用いて解析幾何学における直線操作をしっかりと理解しているはずです。

この実験は、2 点間の傾きを (y2 - y1) / (x2 - x1) の公式を使用して計算する方法を示すことから始まります。次に、y = mx + b の式を整理して定数 b を解くことで、y 切片を決定する方法を示します。最後に、標準形式で直線を表すことができるように、完全な直線の方程式を出力します。

2 点間の傾きを計算する

このステップでは、C プログラムで 2 点間の傾きを計算する方法を学びます。傾きは直線の急峻さを表し、次の式で計算されます。傾き = (y2 - y1) / (x2 - x1)。

まず、傾き計算を実装するための新しい C ファイルを作成します。

cd ~/project
nano slope_calculation.c

次に、傾きを計算する以下の C コードを記述します。

#include <stdio.h>

float calculate_slope(float x1, float y1, float x2, float y2) {
    // 点が同じ垂直線上にあるかどうかをチェックする
    if (x2 - x1 == 0) {
        printf("傾きが定義されていません (垂直線)\n");
        return 0;
    }

    // 公式 (y2 - y1) / (x2 - x1) を使って傾きを計算する
    float slope = (y2 - y1) / (x2 - x1);
    return slope;
}

int main() {
    float x1 = 2.0, y1 = 3.0;  // 第 1 点
    float x2 = 5.0, y2 = 7.0;  // 第 2 点

    float slope = calculate_slope(x1, y1, x2, y2);

    printf("点 1: (%.1f, %.1f)\n", x1, y1);
    printf("点 2: (%.1f, %.1f)\n", x2, y2);
    printf("傾き:%.2f\n", slope);

    return 0;
}

プログラムをコンパイルして実行します。

gcc slope_calculation.c -o slope_calculation
./slope_calculation

出力例:

点1: (2.0, 3.0)
点2: (5.0, 7.0)
傾き: 1.33

コードを詳しく見てみましょう。

  1. calculate_slope() 関数は、4 つのパラメータ (x1, y1, x2, y2) を受け取ります。
  2. まず、点が垂直線上にあるかどうか (x2 - x1 = 0) をチェックします。
  3. 垂直線でない場合、標準的な公式を使用して傾きを計算します。
  4. main() 関数は、傾き計算をどのように使用するかの例を示しています。

傾きは、2 点間の x 座標の変化量に対する y 座標の変化量を表します。この例では、傾きは約 1.33 です。これは、x が 1 単位変化するごとに、y が 1.33 単位変化することを意味します。

y - mx を使って切片を計算する

このステップでは、傾きと既知の点を使用して直線の y 切片を計算する方法を学びます。y 切片は、直線が y 軸と交わる点であり、次の式を使用して計算できます。b = y - mx。

同じプロジェクトディレクトリで作業を続け、前の C ファイルを変更します。

cd ~/project
nano line_equation.c

y 切片を計算する以下の C コードを記述します。

#include <stdio.h>

float calculate_slope(float x1, float y1, float x2, float y2) {
    if (x2 - x1 == 0) {
        printf("傾きが定義されていません (垂直線)\n");
        return 0;
    }
    return (y2 - y1) / (x2 - x1);
}

float calculate_intercept(float x, float y, float slope) {
    // 公式 b = y - mx を使って y 切片を計算する
    float intercept = y - (slope * x);
    return intercept;
}

int main() {
    float x1 = 2.0, y1 = 3.0;  // 第 1 点
    float x2 = 5.0, y2 = 7.0;  // 第 2 点

    float slope = calculate_slope(x1, y1, x2, y2);
    float intercept = calculate_intercept(x1, y1, slope);

    printf("点 1: (%.1f, %.1f)\n", x1, y1);
    printf("点 2: (%.1f, %.1f)\n", x2, y2);
    printf("傾き:%.2f\n", slope);
    printf("Y 切片:%.2f\n", intercept);

    return 0;
}

プログラムをコンパイルして実行します。

gcc line_equation.c -o line_equation
./line_equation

出力例:

点1: (2.0, 3.0)
点2: (5.0, 7.0)
傾き: 1.33
Y切片: 0.33

新しいコードを詳しく見てみましょう。

  1. calculate_intercept() 関数は、3 つのパラメータ (x, y, 傾き) を受け取ります。
  2. 公式 b = y - mx を使用して y 切片を計算します。
  3. main() 関数では、以前に計算された傾きと点を用いて y 切片を求めます。
  4. y 切片は、x = 0 のときの直線が y 軸と交わる点を表します。

計算結果から、与えられた点に対して、直線の傾きは 1.33、y 切片は 0.33 であることがわかります。

y = mx + b の直線式を出力する

このステップでは、前のステップで計算した傾きと y 切片を使用して、完全な直線の方程式を出力する方法を学びます。既存の C プログラムを修正して、標準的な形 y = mx + b で直線の方程式を表示します。

同じプロジェクトディレクトリで作業を続けます。

cd ~/project
nano line_equation_final.c

直線の方程式を出力する以下の C コードを記述します。

#include <stdio.h>

float calculate_slope(float x1, float y1, float x2, float y2) {
    if (x2 - x1 == 0) {
        printf("傾きが定義されていません (垂直線)\n");
        return 0;
    }
    return (y2 - y1) / (x2 - x1);
}

float calculate_intercept(float x, float y, float slope) {
    return y - (slope * x);
}

void print_line_equation(float slope, float intercept) {
    printf("直線の方程式:y = ");

    // 傾きの係数を出力
    if (slope == 1) {
        printf("x");
    } else if (slope == -1) {
        printf("-x");
    } else if (slope != 0) {
        printf("%.2fx", slope);
    }

    // 切片を出力
    if (intercept > 0) {
        printf(" + %.2f", intercept);
    } else if (intercept < 0) {
        printf(" - %.2f", -intercept);
    }

    printf("\n");
}

int main() {
    float x1 = 2.0, y1 = 3.0;  // 第 1 点
    float x2 = 5.0, y2 = 7.0;  // 第 2 点

    float slope = calculate_slope(x1, y1, x2, y2);
    float intercept = calculate_intercept(x1, y1, slope);

    printf("点 1: (%.1f, %.1f)\n", x1, y1);
    printf("点 2: (%.1f, %.1f)\n", x2, y2);
    printf("傾き:%.2f\n", slope);
    printf("Y 切片:%.2f\n", intercept);

    print_line_equation(slope, intercept);

    return 0;
}

プログラムをコンパイルして実行します。

gcc line_equation_final.c -o line_equation_final
./line_equation_final

出力例:

点1: (2.0, 3.0)
点2: (5.0, 7.0)
傾き: 1.33
Y切片: 0.33
直線の方程式: y = 1.33x + 0.33

新しいコードを詳しく見てみましょう。

  1. print_line_equation() 関数は、傾きと切片のさまざまなケースを処理します。
  2. 傾きが 1、-1、または 0 の場合などの特別なケースを処理します。
  3. 切片の符号を正しく含めて方程式をフォーマットします。
  4. この関数は、直線の方程式をクリーンで読みやすい形で表示します。

このコードは、点と傾きの情報を標準的な一次方程式形式に変換する方法を示しています。

まとめ

この実験では、最初に、2 点間の傾きを (y2 - y1) / (x2 - x1) の公式を使って計算する方法を学びました。これは、直線の傾きを表します。次に、傾きと既知の点を使って、直線の y 切片を計算する方法を学びました。これは、方程式 y = mx + b を変形して b を解くことで行います。最後に、傾きと y 切片を組み合わせ、y = mx + b の形で直線の完全な方程式を出力しました。