А59е

Задача А59е. Даны действительные числа [latex]x[/latex], [latex]y[/latex]. Определить, принадлежит ли точка [latex]x[/latex], [latex]y[/latex] заштрихованной части плоскости.

A59е

Значение  [latex]x[/latex] Значение [latex]y[/latex] Комментарий
0 0 Принадлежит фигуре.
-2 0 Принадлежит фигуре.
0 1 Принадлежит фигуре.
1 0 Принадлежит фигуре.
0 -1 Принадлежит фигуре.
-2 1 Не принадлежит фигуре.
-2 -0.5 Принадлежит фигуре.
1 -1 Не принадлежит фигуре.
0.5 0.5 Принадлежит фигуре.

С++:

Java:

Если точка [latex]D[/latex] лежит справа от оси [latex]OY[/latex], ищем расстояние от неё до точки [latex]O\left(0,0 \right)[/latex]. Если оно меньше либо равно [latex]1[/latex], точка [latex]D[/latex] принадлежит полукругу.

Если точка [latex]D[/latex] лежит слева от оси [latex]OY[/latex], будем проводить прямые через каждые две вершины треугольника [latex]ABC[/latex], где [latex]A\left(-2,0 \right)[/latex], [latex]B\left(0,1 \right)[/latex], [latex]C\left(1,0 \right)[/latex].

Воспользуемся уравнением прямой:
[latex]\left ( x-x_{A} \right )\left ( y_{B}-y_{A} \right )-\left ( y-y_{A} \right )\left ( x_{B}-x_{A} \right )=0[/latex]

Прямая разделит плоскость на две части. При подстановке в уравнение точек из одной части плоскости, левая часть уравнения даст значение одного знака.

Функция dotLine определяет положение точки относительно прямой: она вычисляет значение в уравнении прямой и определяет, к какой части плоскости относится точка.

Для того, чтобы точка [latex]D[/latex] принадлежала треугольнику, она должна с каждой вершиной треугольника находиться по одну сторону от прямой, проходящей через две другие вершины.

Функция dotDot определяет, расположены ли точки в одной части плоскости.

Если уравнение прямой даст 0, то точка [latex]D[/latex] лежит на прямой и принадлежит треугольнику.

Задача на Ideone:
C++
Java

Related Images:

7 thoughts on “А59е

  1. К сожалению, с вещественными числами могут произойти досадные ошибки округления. Вот Вы пишете Sabc==Sabd+Sbdc+Sadc, а ведь левая или правая часть может оказаться чуть больше/меньше. Тогда уж, лучше написать что модуль разности очень маленький, меньше какого-то малого числа эпсилон — ошибки округления. Например, fabs(Sabd+Sbdc+Sadc-Sabc)<eps, где eps — малая константа, например 0.000001.

    Кроме того, звездочку в математических формулах использовать не нужно, умножение представляется маленькой точкой ( \cdot – center dot в разделе символы). Также используйте обычные символы больше и меньше, а не столь изогнутые.

    • Спасибо за советы. Всё исправила, кроме символов больше и меньше, так как в редакторе есть обычные символы только для больше или равно и меньше или равно.

    • Больше и меньше тоже исправила.

  2. Очень интересно решена у Вас задача — через класс point — это хорошо. Несколько небольших замечаний к Java версии — название класса должно быть с большой буквы, методы dotline и dotdot желательно сделать статическими методами класса Point — они же к нему относятся и описать (комментариями, в виде Javadoc, например, или в отчете). Кстати, по идее их имена в camelCase, dotLine и dotDot. Вызываться тогда они будут Point.dotDot (…) и Point.dotLine (…). Ну и по хорошему, поля x,y не должны быть public, можно сделать методы доступа к ним — getX и getY.

    • Исправила и дописала отчёт.

Добавить комментарий