Вхождение точки в заштрихованную область
Напишите программу, при выполнении которой с клавиатуры считываются координаты точки на плоскости (x, y - действительные числа) и определяется принадлежность этой точки заданной заштрихованной области (включая границы). В случае, если точка внутри заштрихованной области -- выведите слово "Inside", если снаружи - "Outside".
Я пытался решить ее разными способами и остановился на этом:
#include <iostream>
using namespace std;
int main() {
double x, y;
cin >> x >> y;
bool a = ((x - 3) * (x - 3) + (y + 3) * (y + 3) >= 9);
bool b = ((x + 3) * (x + 3) + (y + 3) * (y + 3) >= 9);
bool c = ((x - 3) * (x - 3) + (y - 3) * (y - 3) >= 9);
bool d = ((x + 3) * (x + 3) + (y - 3) * (y - 3) >= 9);
if (a && b && c && d) {
cout << "Inside";
} else {
cout << "Outside";
}
return 0;
}
Но решение не верное...
Помогите решить ее, пожалуйста.
Ответы (3 шт):
Позвольте немного оптимизации. Произведения "чуть" тяжелее сравнений, так что не надо лишних действий, выбираем четверть и только в ней проверяем длину.
#include <iostream>
#define R 3
using namespace std;
int main() {
double x, y, dx, dy;
bool res=0;
cin >> x >> y;
if(x<=R && x>=-R && y<=R && y>=-R){
dx= R+(x<0 ? x : -x);
dy= R+(y<0 ? y : -y);
// А можно так
//dx= R-abs(x);
//dy= R-abs(y);
res = dx*dx+dy*dy >= R*R;
}
cout << (res ? "Inside" : "Outside");
return 0;
}
abs использует симметрию, - 3 ставит окружность в начало координат:
#include <cmath>
#include <iostream>
using std::cin, std::cout, std::abs;
int main() {
double x, y;
cin >> x >> y;
x = abs(x) - 3;
y = abs(y) - 3;
cout << ((x <= 0 && y <= 0 && x * x + y * y >= 9) ? "Inside\n" : "Outside\n");
}
К ответу Володарского, который дал верный код но никакого объяснения:
Испробованный метод ну достаточен по условиям, к тому же слишком громоздок. Точки вне пределов всех четырех кругов ему удовлетворяют.
Задача симметричная, поэтому можно свести к одному квадранту - где оси положительные. Применить функцию abs() и проверить точку с неотрицательными координатами на условие, находится ли она под одним сегментом дуги, стчиая координаты неотрицательными:
x <= 3
y <= 3
(x-3)*(x-3) + (y-3)*(y-3) >= 9
Следует замена координат x' = abs(x)-3, y' =abs(x)-3:
x' <= 0
y' <= 0
x' * x' + y' * y' >= 9
Использование симметрии - распространенная оптимизация, в том числе в низкоуровневых алгоритмах - например, построение окружности без использования тригонометрии и связанные с ними процедуры нахождения значений тригонометрических функций.
