• Предмет: Информатика
  • Автор: Трафальгар
  • Вопрос задан 7 лет назад

Определить принадлежность точки заданному выпуклому многоугольнику. На паскаль абс, питон или с++

Ответы

Ответ дал: Аноним
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
Не внутри
Ответ дал: Аноним
0
В Интернете на поисковике посмотрите фразу "Проверка принадлежности точки многоугольнику. Метод трассировки лучом"
Ответ дал: Аноним
0
Там будут алгоритмы, рисунки и пояснения.
Ответ дал: Трафальгар
0
а какой из методов описан?Учёт числа пересечений или Учёт числа оборотов
Ответ дал: Аноним
0
Чет/нечет пересечений. Вы же видите: c:=not c; - инверсия при очередном пересечении.
Ответ дал: Аноним
0
А вот счетчика оборотов нет. И в конце if c then Writeln('Внутри')
else Writeln('Не внутри')
Вас заинтересует