Задача А59е. Даны действительные числа [latex]x[/latex], [latex]y[/latex]. Определить, принадлежит ли точка [latex]x[/latex], [latex]y[/latex] заштрихованной части плоскости.
Значение [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 |
Принадлежит фигуре. |
С++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
#include <iostream> #include <cmath> using namespace std; struct point { double x, y; }; struct point get() { struct point a; cin >> a.x >> a.y; return a; } double dotline(struct point a, struct point b, struct point d) { return (d.x - a.x) * (b.y - a.y) - (d.y - a.y) * (b.x - a.x); } bool dotdot(struct point a, struct point b, struct point c, struct point d) { return dotline(a, b, c) * dotline(a, b, d) >= 0; } int main() { struct point a, b, c; a.x = -2; a.y = 0; b.x = 0; b.y = 1; c.x = 0; c.y = -1; struct point d = get(); if(d.x<0){ if(dotdot(a,b,c,d) && dotdot(b,c,a,d) && dotdot(c,a,b,d)){ cout << "Точка D принадлежит заштрихованной части плоскости."; } else { cout << "Точка D не принадлежит заштрихованной части плоскости."; } } else { if (sqrt(pow(d.x, 2) + pow(d.y, 2))<=1) { cout << "Точка D принадлежит заштрихованной части плоскости."; } else { cout << "Точка D не принадлежит заштрихованной части плоскости."; } } return 0; } |
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
import java.util.*; import java.lang.*; import java.io.*; class Ideone { public static class Point { private double x, y; public Point(double x, double y){ this.x = x; this.y = y; } public double getX(){ return this.x; } public double getY(){ return this.y; } private static double dotLine(Point a, Point b, Point d) { return (d.getX() - a.getX()) * (b.getY() - a.getY()) - (d.getY() - a.getY()) * (b.getX() - a.getX()); } public static boolean dotDot(Point a, Point b, Point c, Point d) { return dotLine(a, b, c) * dotLine(a, b, d) >= 0; } } public static void main (String[] args) { Scanner in = new Scanner(System.in); Point a = new Point(-2, 0); Point b = new Point(0, 1); Point c = new Point(0, -1); Point d = new Point(in.nextDouble(), in.nextDouble()); if(d.getX()<0){ if(Point.dotDot(a,b,c,d) && Point.dotDot(b,c,a,d) && Point.dotDot(c,a,b,d)){ System.out.println("Точка D принадлежит заштрихованной части плоскости."); } else { System.out.println("Точка D не принадлежит заштрихованной части плоскости."); } } else { if (Math.sqrt(Math.pow(d.getX(), 2) + Math.pow(d.getY(), 2))<=1) { System.out.println("Точка D принадлежит заштрихованной части плоскости."); } else { System.out.println("Точка D не принадлежит заштрихованной части плоскости."); } } } } |
Если точка [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: