Предмет: Информатика,
автор: Трафальгар
Определить принадлежность точки заданному выпуклому многоугольнику. На паскаль абс, питон или с++
Аноним:
Могу на современном PascalABC.NET написать, на Pascal ABC лениво, это уже не язык, а пережиток прошлого.
давайте
Ответы
Автор ответа:
0
PascalABC.NET 3.4.0, сборка 1671 от 31.05.2018
Внимание! Если программа не работает, обновите версию!
begin
var n:=ReadInteger('Число сторон многоугольника:');
var xp:=new real[n];
var yp:=new real[n];
Writeln('Введите парами координаты вершин');
for var i:=0 to n-1 do Read(xp[i],yp[i]);
var (x,y):=ReadReal2('Введите координаты точки:');
var (i,j,c):=(0,n-1,False);
while i<n do begin
if ((yp[i]<=y) and (y<yp[j]) or (yp[j]<=y) and (y<yp [i]))
and (x<(xp[j]-xp[i])*(y-yp[i])/(yp[j]-yp[i])+xp[i]) then c:=not c;
j:=i;
i+=1;
end;
if c then Writeln('Внутри')
else Writeln('Не внутри')
end.
Примеры
Число сторон многоугольника: 5
Введите парами координаты вершин
-5 2 2 6 7 3.1 4.3 -5 -6 -6
Введите координаты точки: 2.1 1.7
Внутри
Число сторон многоугольника: 5
Введите парами координаты вершин
-5 2 2 6 7 3.1 4.3 -5 -6 -6
Введите координаты точки: -2 5
Не внутри
Внимание! Если программа не работает, обновите версию!
begin
var n:=ReadInteger('Число сторон многоугольника:');
var xp:=new real[n];
var yp:=new real[n];
Writeln('Введите парами координаты вершин');
for var i:=0 to n-1 do Read(xp[i],yp[i]);
var (x,y):=ReadReal2('Введите координаты точки:');
var (i,j,c):=(0,n-1,False);
while i<n do begin
if ((yp[i]<=y) and (y<yp[j]) or (yp[j]<=y) and (y<yp [i]))
and (x<(xp[j]-xp[i])*(y-yp[i])/(yp[j]-yp[i])+xp[i]) then c:=not c;
j:=i;
i+=1;
end;
if c then Writeln('Внутри')
else Writeln('Не внутри')
end.
Примеры
Число сторон многоугольника: 5
Введите парами координаты вершин
-5 2 2 6 7 3.1 4.3 -5 -6 -6
Введите координаты точки: 2.1 1.7
Внутри
Число сторон многоугольника: 5
Введите парами координаты вершин
-5 2 2 6 7 3.1 4.3 -5 -6 -6
Введите координаты точки: -2 5
Не внутри
*Текста, извините. Там первым или последним символом в строке что-то влезло непечатаемое. Попробуйте нащупать его курсовом и удалить. Другой вариант - вставьте текст в Блокнот, а оттуда уже в программу.
Я сейчас только этот текст отсюда скопировал в браузере Mozilla FireFox - все прекрасно работает.
Все эти проблемы - результат последних изменений, внесенных здешними сайтописателями, после которого в копию стал добавляться хвостик со ссылкой на Знания. Что-то еще попутно оно вносит, многие жалуются.
спасибо за то, что не послали) переписала текст с 0 и все работает) можно вопросик? что значит сие формула (x<(xp[j]-xp[i])*(y-yp[i])/(yp[j]-yp[i])+xp[i]?
Почему я должен Вас "посылать"? То, что Вы спросили - это формула из алгоритма "Трассировка луча", с помощью которого решается данная задача для произвольного многоугольника (и даже не обязательно выпуклого.
В Интернете на поисковике посмотрите фразу "Проверка принадлежности точки многоугольнику. Метод трассировки лучом"
Там будут алгоритмы, рисунки и пояснения.
а какой из методов описан?Учёт числа пересечений или Учёт числа оборотов
Чет/нечет пересечений. Вы же видите: c:=not c; - инверсия при очередном пересечении.
А вот счетчика оборотов нет. И в конце if c then Writeln('Внутри')
else Writeln('Не внутри')
else Writeln('Не внутри')
Похожие вопросы
Предмет: Математика,
автор: mihoyana480
Предмет: История,
автор: nikitatazmin79
Предмет: Биология,
автор: nastenka907
Предмет: Биология,
автор: максон24
Предмет: Физика,
автор: annaocotnicova