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

C++で各辺の中点から三角形の頂点座標を求める方法


三角形の各辺の中点の座標が3つ与えられ、そこから元の三角形の頂点座標を逆算することを考えます。例えば、入力が (5, 3)、(4, 4)、(5, 5) の場合、出力は (4, 2)、(4, 6)、(6, 4) となります。

この問題を解くには、X座標とY座標をそれぞれ独立に扱います。頂点のX座標を x1、x2、x3 とすると、各辺の中点のX座標は (x1 + x2)/2、(x2 + x3)/2、(x3 + x1)/2 で表されます。ここで重要なのは、これら3つの式を足し合わせると頂点のX座標の合計と一致するという点です。つまり、「3つの変数の合計」と「ペアごとの合計を表す3つの式」が分かっている状態になるため、連立方程式を解く要領で各頂点の座標値を導き出せます。Y座標についても全く同じ手順で計算できます。

数式による導出

中点の座標を m1、m2、m3、その合計を S とすると、S = x1 + x2 + x3 が成り立ちます。したがって、各頂点の座標は次の式で求められます。

x1 = S − 2 × m2
x2 = S − 2 × m3
x3 = S − 2 × m1

サンプルコード

#include<iostream>
#include<vector>
#define N 3
using namespace std;
vector<int> getResult(int v[]) {
    vector<int> res;
    int sum = v[0] + v[1] + v[2];
    res.push_back(sum - v[1]*2);
    res.push_back(sum - v[2]*2);
    res.push_back(sum - v[0]*2);
    return res;
}
void searchPoints(int mid_x_coord[], int mid_y_coord[]) {
    vector<int> x_vals = getResult(mid_x_coord);
    vector<int> y_vals = getResult(mid_y_coord);
    for (int i = 0; i < 3; i++)
    cout << x_vals[i] << " " << y_vals[i] << endl;
}
int main() {
    int mid_x_coord[N] = { 5, 4, 5 };
    int mid_y_coord[N] = { 3, 4, 5 };
    searchPoints(mid_x_coord, mid_y_coord);
}

実行結果

6 4
4 2
4 6

コードの解説

getResult 関数では、まず中点座標3つの合計 sum を計算します。この合計は頂点座標の合計と等しいため、「合計から特定の中点座標の2倍を引く」ことで対応する頂点の座標が一意に求まります。searchPoints 関数は、X座標とY座標のそれぞれに対して getResult を呼び出し、両者の結果を組み合わせて頂点座標を画面に出力します。ループや再帰を一切使わないため、計算量は O(1) と非常に効率的です。


  1. C++で与えられた2辺から直角三角形の斜辺を求める方法

    この記事では、直角三角形の「高さ H」と「底辺 B」にあたる2つの整数値が与えられたとき、その斜辺を求める方法をC++で解説します。 直角三角形とは、1つの内角が直角(90度)となっている特別な三角形のことです。 まず、具体的な例で問題を確認してみましょう。 入力:B = 5, H = 12 出力:13.00 解法のアプローチ この問題は、ピタゴラスの定理(三平方の定理)を使うことでシンプルに解くことができます。 ピタゴラスの定理とは、「直角三角形の斜辺の2乗は、残りの2辺の2乗の和に等しい」という定理です。 数式で表すと次のようになります。 $H^2\:=\:h^2\:+\:b^2$ つま

  2. C++で三角形の重心を求めるプログラムの作成方法

    この記事では、三角形の3つの頂点の座標を格納した2次元配列が与えられたときに、その三角形の重心を求めるC++プログラムの作成方法を解説します。 三角形の重心とは、三角形の3本の中線がすべて交わる点のことです。 また、三角形の中線とは、ある頂点と、その対辺(向かい合う辺)の中点を結ぶ線分のことを指します。 それでは、具体的な例を使って問題を確認してみましょう。 入力 (-3, 1), (1.5, 0), (-3, -4) 出力 (-1.5, -1) 説明 重心 (x, y) = ((-3 + 1.5 - 3) / 3, (1 + 0 - 4) / 3) = (-1.5, -1) 解法のアプロ