C++で円の直径のもう一方の端点の座標を求める方法
円の中心座標と円周上の1点の座標が分かっているとき、直径のもう一方の端点の座標を求める方法を解説します。中心の座標を (p, q)、与えられた円周上の点を (a, b) とすると、求めたい点を (x, y) と表せます。
円の中心は直径の中点にあたるため、中点の公式を利用できます。数式で表すと次のようになります。
(p, q) = ((a + x) / 2, (b + y) / 2)
この式を変形すると、求めたい座標 (x, y) は次のように計算できます。
x = 2p − a、y = 2q − b
計算例
例えば、中心が (3, 4)、円周上の点が (1, 2) の場合を考えてみましょう。
x = 2 × 3 − 1 = 5
y = 2 × 4 − 2 = 6
したがって、直径のもう一方の端点は (5, 6) となります。
C++による実装例
#include <iostream>
using namespace std;
void findOtherEnd(int p, int q, int a, int b) {
int x = 2 * p - a;
int y = 2 * q - b;
cout << "(" << x << ", " << y << ")" << endl;
}
int main() {
int p = 3, q = 4; // 中心の座標
int a = 1, b = 2; // 与えられた円周上の点
cout << "中心: (" << p << ", " << q << ")" << endl;
cout << "既知の点: (" << a << ", " << b << ")" << endl;
cout << "もう一方の端点: ";
findOtherEnd(p, q, a, b);
return 0;
}出力結果
中心: (3, 4) 既知の点: (1, 2) もう一方の端点: (5, 6)
まとめ
この問題は、円の中心が直径の中点であるという性質を利用することで、簡単な四則演算だけで解くことができます。座標が整数ではなく浮動小数点数で与えられる場合でも、変数を double 型に変更して同様の計算式を使えば対応可能です。
-
【C++】マンハッタン距離の合計が最小になる点を求める方法
K次元空間上にn個の異なる点が与えられているとします。ここで、nは(2, 105)の範囲、kは1〜5の範囲に収まるとします。このとき、与えられたn個の点それぞれへのマンハッタン距離の合計が最小となる点を求めるのが本記事の目的です。まず、2つの点P1(x1, y1)とP2(x2, y2)間のマンハッタン距離は、次のように定義されます。|x1 − x2| + |y1 − y2|例えば、次元が3で、(1, 1, 1)、(2, 2, 2)、(3, 3, 3)という3つの点が与えられた場合、答えは(2, 2, 2)となります。解法の考え方マンハッタン距離は各次元ごとに独立した絶対値の和として表せるため、
-
C++でジャービスマーチ(Jarvis March)を実装して凸包を求める方法
ジャービスマーチ(Jarvis March)アルゴリズムは、与えられた点の集合から凸包(Convex Hull)の頂点、すなわち境界となる角の点を検出するための手法です。まずデータセットの中で最も左側にある点を起点とし、そこから反時計回りに回転しながら凸包に含まれる点を順番に選んでいきます。現在の点から次の点を選ぶ際には、各候補点の方向(向き)を外積によって判定し、角度が最大になる点を採用します。すべての点を巡り、次の点が再び始点に戻った時点でアルゴリズムを終了します。入力:点の集合 {(-7,8), (-4,6), (2,6), (6,4), (8,6), (7,-2), (4,-6), (