Даны действительные числа [latex]x[/latex], [latex]y[/latex]. Определить, принадлежит ли точка с координатами [latex]x[/latex], [latex]y[/latex] заштрихованной части плоскости.
Тесты:
KX | KY | ПРИНАДЛЕЖИТ? |
1 | 1 | нет |
0 | 0 | да |
0.5 | 0 | да |
0.25 | 0.5 | да |
-0.25 | 1.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 |
#include <iostream> #include <math.h> using namespace std; double f (double x, double x0, double x1, double y, double y0, double y1) { return (x - x0) * (y1 - y0) - (y - y0) * (x1 - x0); } int main() { double xa, ya, xb, yb, xc, yc, xd, yd,xk,yk; xa = -0.5; ya = 0; xb = 0; yb = 1; xc = 0.5; yc = 0; xd = 0; yd = -1; cin >> xk >> yk; double l,m,q,w; l = f(xk,xa,xb,yk,ya,yb); m = f(xk,xb,xc,yk,yb,yc); q = f(xk,xc,xd,yk,yc,yd); w = f(xk,xd,xa,yk,yd,ya); if ((l >= 0) && (m >= 0) && (q >= 0) && (w >= 0)) { printf ("Принадлежит"); } else printf ("Не принадлежит"); return 0; } |
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 |
import java.util.*; import java.lang.*; import java.io.*; /* Name of the class has to be "Main" only if the class is public. */ class Ideone { static double f (double x, double x0, double x1, double y, double y0, double y1){ return (x - x0) * (y1 - y0) - (y - y0) * (x1 - x0); } public static void main (String[] args) throws java.lang.Exception { double xa, ya, xb, yb, xc, yc, xd, yd,xk,yk; xa = -0.5; ya = 0; xb = 0; yb = 1; xc = 0.5; yc = 0; xd = 0; yd = -1; Scanner in = new Scanner(System.in); xk = in.nextDouble(); yk = in.nextDouble(); double l,m,q,w; l = f(xk,xa,xb,yk,ya,yb); m = f(xk,xb,xc,yk,yb,yc); q = f(xk,xc,xd,yk,yc,yd); w = f(xk,xd,xa,yk,yd,ya); if ((l >= 0) && (m >= 0) && (q >= 0) && (w >= 0)){ System.out.printf("Принадлежит " ); } else System.out.printf("Не принадлежит " ); } } |
Ход решения:
Зададим функцией [latex]f\left({x}\right)[/latex] уравнение прямой для двух точек с координатами[latex]\left(x_{0} ; y_{0}\right)[/latex] и [latex]\left(x_{1} ; y_{1}\right)[/latex], которое имеет вид: [latex]\left( x — x_{0}\right)\cdot\left( y_{1} — y_{0}\right) — \left( y-y_{0}\right)\cdot\left( x_{1} — x_{0}\right) = 0[/latex]
Подставим нужную нам точку в уравнение каждой прямой. Если значение положительное, то точка находится со внутренней стороны. На самом деле в двух четвертях значение будет отрицательное, но для удобства я сделал так, чтобы они были тоже положительны (отнимая вершины наоборот в тех четвертях, где значение отрицательное). То есть, если значение во всех 4 случаях будут положительные, либо [latex]= 0[/latex] (Значение [latex]0[/latex] означает что наша точка лежит на прямой, а следовательно принадлежит фигуре) мы можем утверждать что точка находится в заштрихованной плоскости. В противном случае она находится вне неё.
«Зададим функцией f уравнение прямой для двух точек с координатами\left(x_{0};y_{0}\right)и \left(x_{1};y_{1}\right); \left( x-x_{0}\right)*\left( y_{1}-y_{0}\right)-\left( y-y_{0}\right)*\left( x_{1}-x_{0}\right)» — во первых, нужно было указать, что f(x) = Ваша формула, во вторых, в мат. формуле звездочка не ставится, а ставится маленькая точка посередине строки или даже знак умножения опускается. В третьих, уравнение прямой имеет вид f(x)=0 (знак равенства должен быть в уравнении).
«если значение во всех 4 случаях будут \geq 0 (Значение 0 означает что наша точка лежит на прямой, а следовательно принадлежит фигуре), то мы можем утверждать что точка принадлежит нашей фигуре.» — почему? «Значение 0 означает что наша точка лежит на прямой, а следовательно принадлежит фигуре» — согласен, но если значение функции больше нуля — это с одной стороны от прямой, но с какой? в отчете не указано.
Программа то верная, и тесты это показывают — необходимо пояснение подкорректировать.
Ошибки учел, исправил. С функцией вы меня немного неправильно поняли , я имел ввиду функцию, которую задаю в программе и потом использую.
«Зададим функцией f\left(_{x}\right) уравнение » нижний индекс лишний
«с координатами\left(x_{0};y_{0}\right)и» а тут не хватает пробелов
«с координатами\left(x_{0};y_{0}\right)и \left(x_{1};y_{1}\right); \left( x-x_{0}\right)\cdot\left( y_{1}-y_{0}\right)-\left( y-y_{0}\right)\cdot\left( x_{1}-x_{0}\right)=0» можно вставить какую-то связку, например «уравнение прямой для двух точек с координатами\left(x_{0};y_{0}\right)и \left(x_{1};y_{1}\right), которое имеет вид …»
«Если значение>0, то точка находится со внутренней стороны. » вот это и нужно аргументировать или хотя бы написать, что получено эмпирически — если это так и есть. Подсказка: можете использовать тот факт, какой обход фигуры, по часовой или против часовой стрелки, можете использовать то, что f(x) векторное произведение, или можете подставить в уравнение координаты какой-то внутренней точки, например, (0,0) — центра координат. Кстати «Если значение>0» — в таких случаях лучше писать «Если значение положительно» или «Если значение больше нуля» — раз Вы написали словом «значение» (а не формулой), словами пишите и условие «больше нуля».
Кстати, интересный факт, не то чтобы ошибка, но почему printf ("Принадлежит"); в фигурных скобках, а printf (" Не принадлежит"); не в фигурных скобках, в printf ("Принадлежит"); пробела в начале выводимой строки нет, а в а printf (" Не принадлежит"); есть, в функции f открывающая фигурная скобка на следующей строке, а в остальные открывающие скобки на той же строке, что и оператор или заголовок. Какая-то непоследовательность получается.
Программа ведь написана по сути хорошо, использование функции оправданно, по оформлению программы и отчета небольшие замечания.
Учел ваши замечания.
Засчитано, 5 баллов (сентябрьское задание в ноябре).