C++で中点の座標を使って長方形の4つの頂点を求める方法
問題の概要
長方形 ABCD があり、その中点 P と Q の座標、および長方形の辺の長さ L のみが分かっているとします。

この課題の目的は、P と Q の座標および辺の長さ L を使って、頂点 A、B、C、D の座標を求めることです。例えば、P が (1, 0)、Q が (1, 2)、L が 2 の場合、A、B、C、D はそれぞれ (0, 0)、(0, 2)、(2, 2)、(2, 0) となります。
考えられる3つの場合
P と Q の位置関係によって、次の3つの場合が考えられます。
- 長方形が水平な場合:AD と BC が X 軸に平行
- 長方形が垂直な場合:AD と BC が Y 軸に平行
- 長方形が軸に対してある角度で傾いている場合
傾いた長方形の場合の解法
3番目の場合は、P と Q の座標から傾きを求める必要があります。辺 AD の傾きが求まれば、AD を通る直線の方程式が導け、さらに距離の公式を用いて各頂点の座標を計算できます。
$$Slope of AD,m=\frac{px-qx}{py-qy}$$ $$Displacement\:along\:x\:axis, dx=\frac{L}{2\sqrt{1+m^{2}}}$$ $$Displacement\:along\:y\:axis, dy=\frac{mL}{2\sqrt{1+m^{2}}}$$
つまり、まず P と Q の座標差から傾き m を算出し、その傾きを使って x 軸方向の変位 dx と y 軸方向の変位 dy を求めます。あとは中点 P、Q からそれぞれ dx と dy を足し引きすることで、4つの頂点の座標が得られます。
C++での実装例
以下のコードでは、P と Q の x 座標が一致する場合(垂直)、y 座標が一致する場合(水平)、それ以外の場合(傾いた長方形)の3パターンに分けて処理を行っています。
#include <iostream>
#include <cmath>
using namespace std;
class Point {
public:
float x, y;
Point(float a = 0.0f, float b = 0.0f) {
x = a, y = b;
}
};
void printCorners(Point p, Point q, float l) {
Point a, b, c, d;
if (p.x == q.x) {
a.x = p.x - (l/2.0);
d.x = p.x + (l/2.0);
a.y = d.y = p.y;
b.x = q.x - (l/2.0);
c.x = q.x + (l/2.0);
b.y = c.y = q.y;
}else if (p.y == q.y) {
a.y = p.y - (l/2.0);
d.y = p.y + (l/2.0);
a.x = d.x = p.x;
b.y = q.y - (l/2.0);
c.y = q.y + (l/2.0);
b.x = c.x = q.x;
}else{
float m = (p.x-q.x)/float(q.y-p.y);
float dx = (l /sqrt(1+(m*m))) *0.5 ;
float dy = m*dx;
a.x = p.x - dx;
a.y = p.y - dy;
d.x = p.x + dx;
d.y = p.y + dy;
b.x = q.x - dx;
b.y = q.y - dy;
c.x = q.x + dx;
c.y = q.y + dy;
}
cout << "A (" << a.x << ", " << a.y << ")\n"
<< "B (" << b.x << ", " << b.y << ")\n"
<< "C (" << c.x << ", " << c.y << ")\n"
<< "D (" << d.x << ", " << d.y << ")\n";
}
int main() {
Point p(1, 1), q(-1, -1);
printCorners(p, q, 2*sqrt(2));
}実行結果
A (0, 2) B (-2, 0) C (0, -2) D (2, 0)
この例では、中点 P (1, 1) と Q (-1, -1)、辺の長さ 2√2 を与えており、傾いた長方形の場合の計算が正しく行われていることが分かります。この手法は、コンピュータグラフィックスや幾何学計算など、座標から図形を復元する必要がある場面で役立ちます。
-
C++で与えられた点から作成できる四角形の数を求める方法
四角形とは? 四角形(クアドララテラル)とは、ユークリッド平面上で4つの頂点と4つの辺を持つ多角形のことを指します。「4-gon」という呼び方もあり、正方形や長方形なども四角形の一種に含まれます。 本記事では、与えられた点から作成できる四角形の数を求める手法について解説します。この問題では、直交座標系(XY平面)上に与えられた4つの点 (x, y) を用いて、いくつの四角形を構成できるかを求めます。まず、具体的な入力例と出力例を見てみましょう。 入力 : A( -2, 8 ), B( -2, 0 ), C( 6, -1 ), D( 0, 8 ) 出力 : 1 説明 : 作成できる四角形は1つだ
-
C++とOpenCVを使って長方形を描画する方法
OpenCVで長方形を描くには、4つの点(座標)が必要です。以下の図をご覧ください。この図には、x1、x2、y1、y2の4つの点があり、これらが長方形を構成する4つの座標を定義しています。OpenCVで長方形を描画するには、まずこれらの点を定義し、長方形を表示するためのマトリックス(行列)を用意する必要があります。さらに、線の色や線の太さといった関連する値も宣言しておきましょう。基本構文rectangle関数の基本的な構文は以下の通りです。rectangle(whiteMatrix, starting, ending, line_Color, thickness);サンプルコード次のプログラム