Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語で点がX軸またはY軸に平行かどうかを判定するプログラム


グラフ上に与えられた n 個の点について、その点群がX軸に平行なのか、Y軸に平行なのか、それともどちらの軸にも平行でないのかを判定する方法を解説します。グラフとは、直角に交わる2つの軸に沿って測定した2つの変数の関係を表す図のことです。「平行」とは、線と線の間隔がどこでも等しい状態を指し、鉄道の線路のように、2本の線がすべての地点で同じ距離を保っている関係をいいます。

つまりここで求めたいのは、「各点の座標と軸との位置関係がすべての点で揃っているかどうか」、すなわち点群がX軸またはY軸に対して平行に並んでいるかどうかという判定です。

軸とは何か

グラフはX軸とY軸という2つの軸によって構成されます。どちらの軸も原点(値0)から始まり、それぞれの変数の値に応じて延びていきます。2つの軸は原点で直角に交わり、平面上のあらゆる点の位置を (x, y) の座標で表すことができます。

次のようなシンプルな図を見ると、イメージしやすいでしょう。

C言語で点がX軸またはY軸に平行かどうかを判定するプログラム

判定の考え方

  • まず、グラフ上の点の座標を (x, y) の形式で受け取ります。
  • すべての点のY座標が同じ値であれば、点群はX軸に平行です(水平な並び)。
  • そうでなく、すべての点のX座標が同じ値であれば、点群はY軸に平行です(垂直な並び)。
  • どちらの条件も満たさない場合は、いずれの軸にも平行ではありません。

アルゴリズム

開始
関数 void parallel(int n, int a[][2])
  ステップ1 → 変数 i を宣言する
  ステップ2 → bool型の x = true、y = true を宣言する
  ステップ3 → i = 0 から i < n - 1 まで繰り返す
    もし a[i][1] != a[i + 1][1] ならば
      y に false を代入する(Y座標が不一致 → X軸には平行でない)
    もし a[i][0] != a[i + 1][0] ならば
      x に false を代入する(X座標が不一致 → Y軸には平行でない)
  繰り返し終了
  ステップ4 → もし y が true ならば
    「X軸に平行です」と表示する
  ステップ5 → そうでなく x が true ならば
    「Y軸に平行です」と表示する
  ステップ6 → どちらでもなければ
    「どちらの軸にも平行していません」と表示する
関数 int main()
  ステップ1 → 配列 a[][2] を宣言する
  ステップ2 → n を sizeof(a) / sizeof(a[0]) として宣言・初期化する
  ステップ3 → 関数 parallel(n, a) を呼び出す
終了

C言語による実装例

#include <stdio.h>
#include <stdbool.h>

// 線が軸に平行かどうかを判定する関数
void parallel(int n, int a[][2]) {
    int i;
    bool x = true, y = true;
    // X軸・Y軸への平行条件をチェック
    for (i = 0; i < n - 1; i++) {
        if (a[i][1] != a[i + 1][1])
            y = false;  // Y座標が不一致 → X軸には平行でない
        if (a[i][0] != a[i + 1][0])
            x = false;  // X座標が不一致 → Y軸には平行でない
    }
    // 結果を表示
    if (y)
        printf("X軸に平行です\n");
    else if (x)
        printf("Y軸に平行です\n");
    else
        printf("どちらの軸にも平行していません\n");
}
int main() {
    int a[][2] = { { 2, 1 },
        { 3, 1 },
        { 4, 1 },
        { 0, 1 } };
    int n = sizeof(a) / sizeof(a[0]);
    parallel(n, a);
    return 0;
}

実行結果

上記のコードを実行すると、次の出力が得られます。

X軸に平行です

サンプルデータの点 (2, 1)、(3, 1)、(4, 1)、(0, 1) は、すべてY座標が「1」で共通しています。そのため、これらの点を結ぶと y = 1 の水平線となり、X軸に平行であると判定されます。このように、隣り合う点の座標を順番に比較していくだけで、特別な計算なしに平行性を簡単に判定できるのがポイントです。


  1. Pythonで凹多角形かどうかを判定するプログラムの作り方

    Pythonで凹多角形を判定する方法 多角形の外周上の頂点が時計回りの順序で与えられているとします。このとき、これらの頂点が凸多角形を形成しているかどうかを判定する必要があります。多角形の内角のうち一つでも180°より大きい角度が存在する場合、その多角形は凹多角形であると言えます。 次の図を見ると分かるように、連続する3つの頂点に着目して内角を確認すると、CDEの部分だけが180°を超えています。 そのため、入力が points = [(3,4), (4,7),(7,8),(8,4),(12,3),(10,1),(5,2)] のような場合、出力は True となります。 解決のための手順

  2. Pythonで点が凸包を形成しているかどうかを判定する方法

    多角形の外周にある頂点が時計回りの順序で与えられているとします。このとき、これらの点が凸包(コンベックスハル)を形成しているかどうかを判定する必要があります。 上の図からも分かるように、凸多角形では連続する3つの頂点からなる内角がすべて180°以下になります。つまり、すべての角度が180°以下であれば、その多角形は凸包であると判断できます。 例えば、入力が points = [(3,4), (4,7), (7,8), (11,6), (12,3), (10,1), (5,2)] のような場合、出力は True になります。 解法のアプローチ この問題を解くには、以下の手順に従います。 n