사각형 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)이 됩니다.
발생 가능한 세 가지 경우
- 사각형이 수평 방향인 경우: AD와 BC가 X축에 평행합니다.
- 사각형이 수직 방향인 경우: AD와 BC가 Y축에 평행합니다.
- 사각형이 축에 대해 일정한 각도로 기울어져 있는 경우입니다.
세 번째 경우(기울어진 사각형)의 풀이
기울어진 경우에는 P와 Q의 좌표로부터 기울기를 먼저 구해야 합니다. AD의 기울기를 알아내면 AD를 지나는 직선의 방정식을 만들 수 있고, 거리 공식을 활용해 최종 결과를 얻을 수 있습니다.
AD의 기울기 m = (px − qx) / (py − qy)
X축 방향 이동량 dx = L / (2√(1 + m²))
Y축 방향 이동량 dy = mL / (2√(1 + m²))
즉, 중점 P에서 dx와 dy만큼 떨어진 위치가 꼭짓점 A와 D가 되고, 마찬가지로 중점 Q에서 같은 크기만큼 떨어진 위치가 B와 C가 됩니다.
C++ 구현 예제
#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;
// 수직인 경우 (P, Q가 X축에 평행한 선 위에 존재)
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;
}
// 수평인 경우 (P, 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와 Q의 x좌표가 같은지, y좌표가 같은지 확인하여 수직 또는 수평 여부를 판별합니다. 이 경우에는 단순히 변의 길이 L을 반으로 나누어 좌표에 더하고 빼는 것으로 꼭짓점을 쉽게 구할 수 있습니다.
두 좌표가 모두 다르다면 사각형이 기울어져 있는 것이므로, 앞서 설명한 기울기 m과 dx, dy 공식을 적용하여 네 꼭짓점의 좌표를 계산합니다. 예제에서는 P(1, 1), Q(-1, -1), L = 2√2를 입력했으며, 대각선이 45도로 기울어진 정사각형의 꼭짓점들이 정확히 출력되는 것을 확인할 수 있습니다.