728x90
(x1, y1)좌표와, (x2, y2)좌표에서 반지름이 각각 r1, r2인 원을 그릴 때
접하는 부분이 몇개인지 구하는 문제입니다.
1. 두개의 좌표가 접할 경우 ( x1 == x2 && y1 == y2 )
1) 반지름이 동일하면 똑같은 위치에서 같은 크기의 원을 그리므로 무수한 부분을 접함 ( - 1)
r1 == r2
2) 반지름이 같지 않으면 원안에 원이 있는 모양으로 접하는 부분이 없음 ( 0 )
r1 != r2
2. 두개의 좌표가 다를 경우 ( x1 != x2 || y1 != y2 )
1) 두개의 반지름의 길이의 합보다 둘 사이의 거리가 작고,
두개의 반지름의 차보다 둘 사이의 거리보다 크면 두개의 점을 가짐 (2)
r1 + r2 > d && abs(r1 - r2) < d
2) 두개의 반지름의 합과 거리가 같거나, 두개의 반지름의 차와 거리가 같으면 한개의 점을 가짐 ( 1 )
r1 + r2 == i || abs(r1 - r2) == i
3) 이 외의 부분에서는 접하는 부분이 없음 ( 0 )
#include <iostream>
#include <cmath>
using namespace std;
int main(int argc, char *argv[])
{
double d;
int ts;
int x1, x2, y1, y2, r1, r2;
cin >> ts;
while (ts--) {
cin >> x1;
cin >> y1;
cin >> r1;
cin >> x2;
cin >> y2;
cin >> r2;
d = sqrt(pow(x1 - x2, 2.0) + pow(y1 - y2, 2.0));
if (x1 == x2 && y1 == y2) {
if (r1 == r2) {
cout << "-1";
}
else {
cout << "0";
}
}
else {
if ((r1 + r2) > d && abs(r1 - r2) < d) {
cout << "2";
}
else if ((r1 + r2) == d || abs(r1 - r2) == d) {
cout << "1";
}
else{
cout << "0";
}
}
cout << "\n";
}
return 0;
}
'알고리즘' 카테고리의 다른 글
[C++] 백준 2231번 분해합 (0) | 2019.09.01 |
---|---|
[C++] 백준 2798번 블랙잭 (0) | 2019.09.01 |
[C++] 백준 3053번 택시 기하학 (0) | 2019.08.31 |
[C++] 백준 4153번 직각삼각형 (0) | 2019.08.31 |
[C++] 백준 3009번 네 번째 점 (0) | 2019.08.31 |