Вхождение точки в заштрихованную область

Напишите программу, при выполнении которой с клавиатуры считываются координаты точки на плоскости (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 шт):

Автор решения: Solt

Позвольте немного оптимизации. Произведения "чуть" тяжелее сравнений, так что не надо лишних действий, выбираем четверть и только в ней проверяем длину.

#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;
}
→ Ссылка
Автор решения: Stanislav Volodarskiy

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");
}
→ Ссылка
Автор решения: Swift - Friday Pie

К ответу Володарского, который дал верный код но никакого объяснения:

Испробованный метод ну достаточен по условиям, к тому же слишком громоздок. Точки вне пределов всех четырех кругов ему удовлетворяют.

Задача симметричная, поэтому можно свести к одному квадранту - где оси положительные. Применить функцию 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

Использование симметрии - распространенная оптимизация, в том числе в низкоуровневых алгоритмах - например, построение окружности без использования тригонометрии и связанные с ними процедуры нахождения значений тригонометрических функций.

→ Ссылка