profile
Опубликовано 6 лет назад по предмету Информатика от Трафальгар

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

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