Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2016, 19:35   #1
NikiToZz_
Пользователь
 
Регистрация: 23.04.2016
Сообщений: 75
Вопрос Как доказать, что точка лежит внутри многоугольника?

И снова здравствуйте, господа... Начну с того, что несколько лет назад уже поднимались подобного рода темы (чтобы у модераторов вопросы отпали), но ответа в них я не нашел. Там пытаются рассматривать алгоритмы, к примеру, графический или лучевой. Кстати, последний весьма интересен.

Вернемся к задаче. Хочу на паскале после ввода с клавиатуры координат точки и координат вершин многоугольника получать "Точка принадлежит многоугольнику", либо "Точка не принадлежит многоугольника"..

Теперь самое интересное, что же сделал я.. Я пытался решить эту задачу, используя графический модуль. То есть я рисовал ребра фигуры по точкам, рисовал 2 диагонали, искал их пересечение, соединял точку пересечения с моей точкой. В итоге, если было бы пересечение получившегося отрезка с ребром фигуры, значит исходная точка вне фигуры. Else в фигуре.

З.Ы. Многоугольник всегда выпуклый.

Итог: Не очень-то мой метод заработал, ну или реализация неправильная.. Прошу помочь

Кому интересны мои каракули (Там я брал несколько фигур):

Код:
program dachniki;
  uses Graph;
  var i,k,x,y,x1,y1,x2,y2,x3,y3,x4,y4,xperint,yperint,N:integer;
    xper,yper:real;
begin
  i:=1; k:=0;
  readln(N);
  repeat
      readln(x,y,x1,y1,x2,y2,x3,y3,x4,y4);
      line(x1,y1,x2,y2);
      line(x2,y2,x3,y3);
      line(x3,y3,x4,y4);
      line(x4,y4,x1,y1);
      xper:=-((x1*y2-x2*y1)*(x4-x3)-(x3*x4-x4*y3)*(x2-x1))/((y1-y2)*(x4-x3)-(y3-y4)*(x2-x1));
      yper:=((y3-y4)*(-x)-(x3*y4-x4*y3))/(x4-x3);
      xperint:=round(xper);
      yperint:=round(yper);
      line(x,y,xperint,yperint);
      if not((xper>=x1)and(xper<=x2))or((xper>=x2)and(xper<=x1)) then
           write ('Внутри') 
           else write ('Снаружи');
      inc(i);
  until i<>N;
  readln;
end.
NikiToZz_ вне форума Ответить с цитированием
Старый 19.06.2016, 00:00   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Нет бы помог) Ты же знаешь алгоритм
да чо мелочиться? давай я сразу всю прогу тебе напишу, а? А то я целыми днями лысого теребонькаю от безделья.

Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 19.06.2016, 00:06   #3
NikiToZz_
Пользователь
 
Регистрация: 23.04.2016
Сообщений: 75
По умолчанию

min@y™, слушай, уж лучше ничего не писать, чем так писать) Или кем ты возомнил себя на этом форуме?) Репутация большая? ;-) Вон у Smitt&Wesson в свое время больше была...
NikiToZz_ вне форума Ответить с цитированием
Старый 19.06.2016, 00:19   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
уж лучше ничего не писать, чем так писать
твоё субъективное мнение меня не интересует. можешь думать, что твоя тема, состоящая из одного поста принесёт тебе больше пользы. Мне всё равно.
Цитата:
Или кем ты возомнил себя на этом форуме?
Не понял вопроса.
Цитата:
Репутация большая?
Это вот то число, что под аватаркой? Оно, разве, на что-то влияет? Или его можно обналичить?
Цитата:
Вон у Smitt&Wesson в свое время больше была...
И чо?


Я тебе ничего не должен. Чем ты недоволен?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 19.06.2016, 00:23   #5
NikiToZz_
Пользователь
 
Регистрация: 23.04.2016
Сообщений: 75
По умолчанию

Молодец ;-) Расфармил мою тему сообщениями, больше от тебя, собственно ничего не нужно теперь..
NikiToZz_ вне форума Ответить с цитированием
Старый 19.06.2016, 00:25   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Ну вот. И все довольны.
Инцидент исчерпан.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 19.06.2016, 02:22   #7
GreyScall
Пользователь
 
Аватар для GreyScall
 
Регистрация: 01.01.2011
Сообщений: 29
Восклицание

Если многоугольник строго выпуклый - достаточно проверить как изучаемая точка располагается относительно каждой его стороны: если обходить многоугольник по часовой стрелке, считая каждое как вы выразились ребро - вектором - с какой стороны от вектора будет эта точка?
Точка находящаяся внутри выпуклого многоугольника будет "правее" одновременно ко всем рёбрам. Кстати, аналогично проверяется а выпуклый ли многоугольник - вместо точки изучается следующая вершина.

Впрочем, нечто подобное и рассматривается по ссылке указанной (почему-то в виде скриншота) в сообщении #2, только для более общих случаев.
Regards, GreyScall.
GreyScall вне форума Ответить с цитированием
Старый 19.06.2016, 12:16   #8
NikiToZz_
Пользователь
 
Регистрация: 23.04.2016
Сообщений: 75
По умолчанию

Та я уже посмотрел, спасибо..
NikiToZz_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Лежит ли точка на прямой dimon_snake Паскаль, Turbo Pascal, PascalABC.NET 8 22.11.2015 19:38
Определить, лежит ли точка внутри треугольника. Исправить код. С++ V-alterman Помощь студентам 1 22.12.2013 22:41
[Pascal] Исправить код определения, лежит ли точка внутри данного прямоугольника 777pro777 Помощь студентам 5 27.02.2012 13:34
лежит ли точка внутри треугольника х-prof Помощь студентам 1 16.06.2011 20:16
лежит ли заданная точка А внутри или вне много-угольника. Anton1997 Общие вопросы Delphi 4 30.11.2008 16:07