C++で線分のもう一方の端点を求める方法|一方の端点と中点から計算する
問題概要
この問題では、線分の一方の端点A(xA, yA)と中点M(xM, yM)の座標が与えられ、もう一方の端点Bの座標を求めることが課題となります。
具体的な例で問題を確認しましょう。
入力:
A = [1, 2], M = [3, 0]
出力:
[5, -2]
解説
この線分は下図のように表されます。

解法のアプローチ
この問題は、数学で学んだ幾何学の知識を使えばシンプルに解くことができます。まず、線分の中点を求める基本公式を思い出しましょう。
mid(x) = (x1 + x2) / 2 mid(y) = (y1 + y2) / 2
しかし今回の問題では、中点の座標がすでに与えられており、むしろもう一方の端点であるx2とy2の値を求める必要があります。そこで、上記の公式をx2・y2について解く形に変形します。
x2 = 2*mid(x) - x1 y2 = 2*mid(y) - y1
この変形式を使えば、中点と片方の端点の座標だけで、もう一方の端点の座標を簡単に計算できるのです。
C++での実装例
以下は、この解法の動作を示すサンプルプログラムです。
#include <iostream>
using namespace std;
void findMissingPointLine(float x1, float y1, float xm, float ym){
float x2 = (2 * xm) - x1;
float y2 = (2 * ym) - y1;
cout<<"B(x, y) = "<<"( "<<x2<<", "<<y2<<" )";
}
int main()
{
float x1 = -4, y1 = -1, xm = 3, ym = 5;
cout<<"The other end point of the line is \n";
findMissingPointLine(x1, y1, xm, ym);
return 0;
}実行結果
The other end point of the line is B(x, y) = ( 10, 11 )
まとめ
中点公式を変形するだけで、一方の端点と中点の情報からもう一方の端点をO(1)の計算量で求められます。幾何学の基本公式をプログラミングに応用する好例といえるでしょう。ぜひ自分のコードにも活用してみてください。
-
C++とオイラー特性でサッカーボールの五角形・六角形の数を求める方法
サッカーボールをよく見ると、黒い五角形と白い六角形がパズルのように組み合わさり、完璧な球体を形作っていることがわかります。本記事では、オイラー特性(Euler characteristic)という数学的手法を用いて、サッカーボール上に存在する五角形と六角形の数を求める方法を解説し、最後にC++での実装例も紹介します。 オイラー特性とは オイラー特性とは、位相空間における図形や構造の特徴を表す数値です。球面の場合、オイラー特性は常に2になることが知られており、この性質を利用することで、サッカーボール上の五角形と六角形の数を計算できます。 オイラー特性では、以下の要素を使用します。 χ(S) —
-
C++で直線に対する点の位置を判定!Above-Below-onテストの実装方法
この記事では、Above-Below-on テストを適用して、ある点が直線に対してどの位置(下側・上側・直線上)にあるのかを判定する C++ プログラムを紹介します。 平面上の任意の点 t(xt, yt) について、2点 m と n を結ぶ直線 L に対する位置関係は、次のスカラー値 s を計算することで求められます。 Y = A·xt + B·yt + C 計算結果の符号により、次のように判定できます。 s < 0 の場合:点 t は直線 L の時計回り側の半平面(下側・左側)にあります。 s > 0 の場合:点 t は直線 L の反時計回り側の半平面(上側・右側)にあります。