한번 영역을 정하고 점이 그 영역 안에 포함되면 결과를 반환하도록 하고 싶었는데 영역을 매번 계산하는 방식으로 구현했다. 영역계산을 한번만 하는 식으로 만들고 싶다.
#include <iostream>
#include <vector>
using namespace std;
void input_info(int *W, int *H, int *X, int *Y, int *P, vector <pair<int, int>> &player_position)
{
int i;
int x, y;
cin >> *W >> *H >> *X >> *Y >> *P;
for (i = 0; i < *P; i++)
{
cin >> x >> y;
player_position.push_back({ x, y });
}
return;
}
bool in_the_ground(int W, int H, int X, int Y, int player_x, int player_y)
{
bool result = false;
int mid_height = H / 2;
int radius_square = mid_height * mid_height;
//cout << W << " " << H << " " << X << " " << Y << " " << player_x << " " << player_y << " " << mid_height << " " << radius_square << "\n";
//왼쪽 원에 있는지
if (((X - player_x)*(X - player_x)) + ((Y + mid_height - player_y)*(Y + mid_height - player_y)) <= radius_square &&
((player_x >= X - mid_height && player_x <= X) && (player_y >= Y && player_y <= Y + H)))
{
result = true;
return result;
}
else
{
result = false;
}
//cout << "왼쪽 원 안에 있음\n";
//가운데 사각형에 있는지
if ((player_x >= X && player_x <= X + W) && (player_y >= Y && player_y <= Y + H))
{
result = true;
return result;
}
else
{
result = false;
}
//cout << "가운데 사각형 안에 있음\n";
//오른쪽 원에 있는지
if (((X + W - player_x) * (X + W - player_x)) + ((Y + mid_height - player_y) * (Y + mid_height - player_y)) <= radius_square &&
((player_x >= X + W && player_x <= X + W + mid_height) && (player_y >= Y && player_y <= Y + H)))
{
result = true;
return result;
}
else
{
result = false;
}
//cout << "오른쪽 원 안에 있음\n";
return result;
}
void find_answer(int W, int H, int X, int Y, int P, vector <pair<int, int>> player_position)
{
int i;
int count = 0;
for (i = 0; i < P; i++)
{
if (in_the_ground(W, H, X, Y, player_position[i].first, player_position[i].second))
{
count++;
}
else
{
;
}
}
cout << count << "\n";
return;
}
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int W, H, X, Y, P;
vector <pair<int, int>> player_position;
input_info(&W, &H, &X, &Y, &P, player_position);
find_answer(W, H, X, Y, P, player_position);
return 0;
}