C++で平行四辺形を完成させる4点目の座標をすべて求める方法
本記事では、与えられた3つの座標から、面積がゼロではない平行四辺形を完成させるために必要な「4点目」の座標候補をすべて求める方法を解説します。A、B、Cという3点が与えられている場合、平行四辺形の構成として考えられるのは、次の3パターンだけです。
- AB と AC を辺とし、BC を対角線とするケース
- AB と BC を辺とし、AC を対角線とするケース
- BC と AC を辺とし、AB を対角線とするケース
つまり、3つの座標が決まれば、平行四辺形を形成できる4点目の座標は最大でも3通りしか存在しません。平行四辺形には「向かい合う辺は平行で長さが等しい」という重要な性質があるため、AD = BC および AB = CD が成り立ちます。この性質を座標の差分で表現すると、欠けている点 D の座標は次のように計算できます。
(Dx − Ax, Dy − Ay) = (Cx − Bx, Cy − By) Dx = Ax + Cx − Bx Dy = Ay + Cy − By
同様の考え方を対角線の組み合わせごとに適用すると、3つの候補点はそれぞれ次の式で求まります。
- D₁ = A + B − C(AC を対角線とする場合)
- D₂ = A + C − B(AB を対角線とする場合)
- D₃ = B + C − A(BC を対角線とする場合)
C++での実装例
#include <iostream>
using namespace std;
// 3点から平行四辺形を完成させる4点目の候補をすべて表示する
void printPoints(int ax, int ay, int bx, int by, int cx, int cy) {
cout << ax + bx - cx << ", " << ay + by - cy << endl;
cout << ax + cx - bx << ", " << ay + cy - by << endl;
cout << bx + cx - ax << ", " << by + cy - ay << endl;
}
int main() {
int ax = 5, ay = 0; // 点Aの座標
int bx = 1, by = 1; // 点Bの座標
int cx = 2, cy = 5; // 点Cの座標
printPoints(ax, ay, bx, by, cx, cy);
return 0;
}
実行結果
4, -4 6, 4 -2, 6
1行目は AC が対角線になる場合、2行目は AB が対角線になる場合、3行目は BC が対角線になる場合の、それぞれ4点目の座標に対応しています。
計算量と注意点
このアルゴリズムは単純な加減算のみで構成されているため、時間計算量は O(1) であり、追加のメモリもほとんど不要です。ただし、与えられた3点が同一直線上にある場合は、どの組み合わせを選んでも面積がゼロの「つぶれた平行四辺形」になってしまうため、問題の要件によっては事前に共線(コリニア)判定を入れておくと安全です。
-
C++で括弧なしの数式から考えられるすべての結果を求める方法
括弧を含まない算術式が与えられたとき、その式から得られるすべての可能な結果を求めることを考えます。例として「1+2*3-4」という式を挙げます。この式は、演算を適用する順序によって次のように複数の解釈が可能です。 1+(2*(3-4)) = 1 + (2 × -1) = -1 (1+2)*(3-4) = 3 × -1 = -3 1+((2*3)-4) = 1 + (6 - 4) = 3 ((1+2)*3)-4 = (3 × 3) - 4 = 5 1+(2*3)-4 = 1 + 6 - 4 = 3 このように、同じ式でも演算の順序によって結果が異なります。本記事では、これらすべての結果を列挙
-
C++で配列内のab=cdとなるすべてのペア(a, b)と(c, d)を見つける方法
配列Aが与えられたとき、その中から積が等しくなる2つのペア(a, b)と(c, d)、つまりab = cdを満たす組み合わせを見つける問題を考えます。例えば、配列A = [3, 4, 7, 1, 2, 9, 8]の場合、(4, 2)と(1, 8)というペアが条件を満たします。実際に4×2 = 8、1×8 = 8となり、積が一致していますね。この問題を効率的に解くには、ハッシュテーブル(C++ではunordered_map)を活用します。すべてのペアの積を順に計算し、同じ積がすでにハッシュテーブルに登録されているかどうかを確認することで、条件を満たすペアを検出できます。アルゴリズムの手順iを0か