Помогите с лабораторной работой
Для десяти выстрелов, координаты которых задаются с клавиатуры, вывести текстовые сообщения о попадании в мишень.
Мега туплю с математикой, прошу помощи, как правильно составить отрезки попадания. Мои попытки:
#include <iostream>
#include <cmath>
bool is_hit(double x, double y, double a, double b, double r)
{
return ((x <= a) && (x > 0) && (y <= b) && (y > 0) && (y >= std::sqrt(1 - x * x))) || ((std::fabs(x) <= r) && (x < 0) && (y >= -b) && (std::fabs(y) <= r) && (y < 0) && (y >= -std::sqrt(1 - x * x)));
}
int main()
{
setlocale(LC_ALL, "rus");
double radius, a, b;
std::cout << "Введите радиус окружности: ";
std::cin >> radius;
std::cout << "\nВведите a и b: ";
std::cin >> a >> b;
double x, y;
for (int i = 0; i < 10; ++i)
{
std::cout << "\n[Выстрел " << i + 1 << "]\nВведите x и y: ";
std::cin >> x >> y;
std::cout << "\nx = " << x << "\ny = " << y;
is_hit(x, y, a, b, radius) ? std::cout << "\n\nПопал!\n" : std::cout << "\n\nМимо!\n";
}
return 0;
}
Ответы (2 шт):
Автор решения: Tellator
→ Ссылка
Я так понимаю, что a и b - координаты центра мишени?
Я бы вычислял расстояние от центра мишени до точки попадания и сравнивал бы его с радиусом
AB = sqrt(pow(x - a, 2) + pow(y - b, 2)); где а - координата по х, b - координата по y;
for(short i = 0; i < 10; i++){
cin >> x >> y;
if (sqrt(pow(x - a, 2) + pow(y - b, 2)) <= radius) cout << "\n Попал!";
}
Автор решения: Harry
→ Ссылка
Если мишень — это черное, то для попадания в первую часть, вверху справа, что надо?
0 <= x <= a
0 <= y <= b
x^2 + y^2 >= R^2
Т.е.
(x >= 0 && x <= a && y >= 0 && y <= b && x*x + y*y >= R*R)
А в ту, что слева внизу
-a <= x <= 0
-b <= y <= 0
x^2 + y^2 <= R^2
Т.е.
(x <= 0 && x >= -a && y <= 0 && y >= -b && x*x + y*y <= R*R)
А теперь объединяем:
if ((x >= 0 && x <= a && y >= 0 && y <= b && x*x + y*y >= R*R) ||
(x <= 0 && x >= -a && y <= 0 && y >= -b && x*x + y*y <= R*R)) ....
