Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выпуклый многоугольник 
:(
    Опции темы
Marathon
Дата 2.12.2015, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2015

Репутация: нет
Всего: нет



Добрый день. Нужно определить, попадает ли  точка в выпуклый многоугольник вершины должны быть в массиве.среда программирования Си++
PM MAIL   Вверх
rudolfninja
Дата 2.12.2015, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: 1
Всего: 6



Добрый день.
Не знаю как реализовать алгоритм в 
Цитата(Marathon @  2.12.2015,  08:18 Найти цитируемый пост)
среда программирования Си++ 

Но вот полное описание алгоритма и его реализация на яызке программирования Си++
PM MAIL Skype   Вверх
Marathon
Дата 2.12.2015, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2015

Репутация: нет
Всего: нет



Спасибо, это я нашел, но так выскакивают некоторые проблемки. Да и код уже есть, но хоть убей не могу понять почему не работает для 5 и 6 угольников.
#include <iostream>
 
typedef struct {
    int x, y;
} point;
 
/* принадлежность точки многоугольнику(для выпуклых)
   обход вершин по часовой стрелки */
bool PtInPolygon(const point& p, const point* d, int n){
    int r;
    --n;
    for(int i = 0; i < n; ++i) {
        r = (p.x - d[i].x)*(d[i].y - d[i + 1].y) - 
            (p.y - d[i].y)*(d[i].x - d[i + 1].x);
        if(r < 0)
            return false;
    }
    r = (p.x - d[n].x)*(d[n].y - d[0].y) - 
        (p.y - d[n].y)*(d[n].x - d[0].x);
    return (r >= 0);
}
 
int main(void){
    const int n = 4;
    point  d[n] = {
        { 200, 10  },
        { 250, 60  },
        { 200, 130 },
        { 150, 60  }
    };
    point p = { 190, 100 };
 
    if(PtInPolygon(p, d, n))
        std::cout << "Yes." << std::endl;
    else
        std::cout << "No!" << std::endl;
    return 0;
}
PM MAIL   Вверх
ИгорьПереверзев
Дата 3.12.2015, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 22.6.2013
Где: Москва

Репутация: нет
Всего: нет



Ваше заполнение данными массива d[] не соответствует порядку обхода многоугольника (четырёхугольника) по часовой стрелке. Должно быть, к примеру, так:
{ 150, 60  },
{ 200, 130 },
{ 250, 60  },
{ 200, 10  }


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL WWW   Вверх
math64
Дата 3.12.2015, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



можно опрелелять автоматически. Все r должны быть одного знака. r == 0 значает, что точка лежит на стороне полигона, но проверять дальше всё равно надо - она может быть на продолжении стороны.
Код

bool PtInPolygon(const point& p, const point* d, int n){
    double r0 = 0;
    for(int i = 0; i < n; ++i) {
       int j = (i+1) % n;
       double r = // double чтобы избежать переполнения
            (double)(p.x - d[i].x)*(d[i].y - d[j].y) -
            (double)(p.y - d[i].y)*(d[i].x - d[j].x);
        if(r*r0 < 0)
            return false;
        if (r0 == 0)
            r0 = r;
    }
    return true;
}


PM   Вверх
Marathon
Дата 3.12.2015, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2015

Репутация: нет
Всего: нет



math64, Спасибо, то есть и по часовой и против?
PM MAIL   Вверх
Marathon
Дата 4.12.2015, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2015

Репутация: нет
Всего: нет



ИгорьПереверзев, Там все правильно и для 5 и 6 угольников все работает, я перепутал, против часовой стрелки. Оказывается, сказали, чтобы интерфейс был " для   рядового пользователя" , исправил на ввод с клавиатуры вершин многоугольника и точки, но опять проблема, я не должен ставить рамки этому пользователю, точки вводит, да, по порядку, но не только против часовой, но и по, а вот тут уже прлблемы
PM MAIL   Вверх
math64
Дата 4.12.2015, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Цитата(Marathon @  4.12.2015,  12:33 Найти цитируемый пост)
 но не только против часовой, но и по, а вот тут уже прлблемы 

А мой код, что не работает?
PM   Вверх
Marathon
Дата 4.12.2015, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2015

Репутация: нет
Всего: нет



math64, Точка на самом деле лежит в многоугольнике, а вот программа выдает, что нет
PM MAIL   Вверх
Marathon
Дата 7.12.2015, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2015

Репутация: нет
Всего: нет



math64, идей никаких, все пробую и не получается по часовой стрелке определять
PM MAIL   Вверх
math64
Дата 7.12.2015, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Я в твоем коде заменил PtInPolygon на свой - выдает YES.
PM   Вверх
Marathon
Дата 7.12.2015, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2015

Репутация: нет
Всего: нет



math64, Да,  выдает, я взял 5-угольник    const int n = 5;
    point  d[n] = {
        { 0, 5  },
        { 10, 8  },
        { 10, 25 },
        { -15, 25  },
        {-15, 9 }
    };
    point p = { 0, 100 };
Точки внутри - да, на пересечении - да, ну и в этой точке  0, 100 тоже да
PM MAIL   Вверх
math64
Дата 7.12.2015, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Проверил с Вашим новым полигоном - выдаёт No - как и должно быть, точка намного выше полигона (верхняя сторона y=25)
PM   Вверх
Marathon
Дата 7.12.2015, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2015

Репутация: нет
Всего: нет



math64, так, интересно

#include <iostream>
 
typedef struct {
    int x, y;
} point;
 
bool PtInPolygon(const point& p, const point* d, int n)
{
     double r0=0;
    for(int i = 0; i < n; ++i)
 {
         int j=(I+1)% n;
     double   r = 
    (double) (p.x - d[i].x)*(d[i].y - d[j].y) - 
        (double)(p.y - d[i].y)*(d[i].x - d[j].x);
        if(r* r0 <0)
            return false; 
         if (r0==0)
              r0=r ;
    return true;
        }
}
 
int main(void){
    const int n = 5;
    point  d[n] = {
        { 0, 5  },
        { 10, 8  },
        { 10, 25 },
        {- 15, 25},
        {-15, 9}
    };
    point p = { 0, 6 };
 
    if(PtInPolygon(p, d, n))
        std::cout << "Yes." << std::endl;
    else
        std::cout << "No!" << std::endl;
    return 0;


Так ведь?
PM MAIL   Вверх
math64
Дата 7.12.2015, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



С точкой {0, 6} выдает Yes. И пользуйтесь тегом [code] (кнопка Код) для оформления кода программы в сообщении.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1484 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.