문제 개요
주어진 세 개의 좌표를 이용해 넓이가 0이 아닌 평행사변형을 만들 수 있는 모든 네 번째 좌표를 찾는 것이 이 글의 목표입니다. 점 A, B, C가 주어졌을 때 평행사변형을 구성할 수 있는 경우는 다음의 세 가지뿐입니다.
- AB와 AC가 두 변이 되고, BC가 대각선이 되는 경우
- AB와 BC가 두 변이 되고, AC가 대각선이 되는 경우
- BC와 AC가 두 변이 되고, AB가 대각선이 되는 경우
즉, 세 좌표만 주어져도 평행사변형을 완성할 수 있는 네 번째 좌표는 정확히 세 개 존재합니다. 평행사변형에서는 마주보는 두 변의 길이가 같으므로 AD = BC, AB = CD가 성립합니다. 이 성질을 이용하면 빠진 점 D의 좌표를 다음과 같이 계산할 수 있습니다.
(Dx - Ax, Dy - Ay) = (Cx - Bx, Cy - By) Dx = Ax + Cx - Bx Dy = Ay + Cy - By
C++ 예제 코드
#include <iostream>
using namespace std;
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 << cx + bx - ax << ", " << cy + by - 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
결과 해석
각 출력값이 어느 경우에 해당하는 네 번째 점인지 살펴보면 다음과 같습니다.
- (4, -4) = A + B - C : BC와 AC가 변이 되고 AB가 대각선일 때의 네 번째 점
- (6, 4) = A + C - B : AB와 BC가 변이 되고 AC가 대각선일 때의 네 번째 점
- (-2, 6) = B + C - A : AB와 AC가 변이 되고 BC가 대각선일 때의 네 번째 점
정리하면 네 번째 점 D는, 대각선이 되는 두 점의 좌표를 더한 값에서 나머지 한 점의 좌표를 빼면 구할 수 있습니다. 세 점 중 어느 두 점을 대각선으로 삼느냐에 따라 세 가지 답이 나오며, 세 점이 한 직선 위에 있지 않은 한 항상 넓이가 0이 아닌 평행사변형을 만들 수 있습니다.