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

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

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2013, 00:36   #11
simples
Форумчанин
 
Регистрация: 03.10.2013
Сообщений: 142
По умолчанию

Цитата:
Сообщение от Izotic Посмотреть сообщение
да, координаты случайны
Этим все сказано (для меня).
Форма полигона - лю-ба-я.

Накидал пробы ради эту задачку с условиями:
100 полигонов
10 точек в каждом
точки внутри квадрата 10*10
проверка "есть пересечение последнего отрезка (посл.точка<->первая точка) с любым другим в этом же полигоне?"

Итого: 60+ из 100

"Вы все еще стирает порошком? Тогда мы идем к Вам!"

Последний раз редактировалось simples; 04.10.2013 в 19:34.
simples вне форума Ответить с цитированием
Старый 04.10.2013, 17:44   #12
Izotic
Пользователь
 
Регистрация: 26.05.2013
Сообщений: 13
По умолчанию

http://ru.wikipedia.org/wiki/%D0%9C%...BD%D0%B8%D0%BA
определение многоугольника - замкнутая ломаная(в общем случае)
поэтому
Цитата:
посл.точка<>первая точка
(если я правильно помню и <> означает неравенство) противоречит этому определению.
В моем же случае, надо поменять координаты так, чтобы многоугольник стал простым(т.е без самопересечений)
Izotic вне форума Ответить с цитированием
Старый 04.10.2013, 19:36   #13
simples
Форумчанин
 
Регистрация: 03.10.2013
Сообщений: 142
По умолчанию

Цитата:
Сообщение от Izotic Посмотреть сообщение
если я правильно помню и <> означает неравенство
Исправил "<>" на "<->".
В моем случае это "отрезок между первой и последней точками".

Цитата:
Сообщение от Izotic Посмотреть сообщение
определение многоугольника - замкнутая ломаная
...
противоречит этому определению.
Ничего не противоречит. Если принять что НЕ надо дублировать первую точку в последней.

Цитата:
Сообщение от Izotic Посмотреть сообщение
надо поменять координаты так, чтобы многоугольник стал простым
Соб-но это меня в Вашем вопросе и интересует.
Алгоритм накидайте хотя бы тезисно.

Последний раз редактировалось simples; 04.10.2013 в 19:42.
simples вне форума Ответить с цитированием
Старый 04.10.2013, 20:25   #14
Izotic
Пользователь
 
Регистрация: 26.05.2013
Сообщений: 13
По умолчанию

simples
Цитата:
Алгоритм накидайте хотя бы тезисно.
Мой алгоритм примерно таков:
-мы, начиная с 3-го ребра проходим все ребра многоугольника, сравнивая их с предыдущими ребрами, за исключением последнего предшествующего ребра(т.к их пересечение, кроме как в вершине, в принципе невозможно).
-для проверки пересечения я равняю координату у и из получившегося выражения выражаю х, если этот х принадлежит ребру, то точка пересечения есть, для того чтобы исключить пересечение в вершинах используется строгое неравенство
- если точка пересечения найдена, то координаты второй вершины ребра которое мы проверяем меняются, и цикл проверки пересечения с другими ребрами начинается сначала.
- если же последнее ребро многоугольника имеет пересечение, то, вместе с последней меняем так же первую вершину(которая собственно одна и та же)
и начинаю весь алгоритм проверки сначала
Цитата:
Если принять что НЕ надо дублировать первую точку в последней.
тогда это будет уже не многоугольник, а просто ломанная линия, которая возможно имеет несколько пересечений( а может и не иметь))

Последний раз редактировалось Izotic; 04.10.2013 в 22:25.
Izotic вне форума Ответить с цитированием
Старый 04.10.2013, 23:18   #15
simples
Форумчанин
 
Регистрация: 03.10.2013
Сообщений: 142
По умолчанию

Цитата:
Сообщение от Izotic Посмотреть сообщение
тогда это будет уже не многоугольник, а просто ломанная линия, которая возможно имеет несколько пересечений( а может и не иметь))
Вы путаете набор отрезков из которых состоит мн-ник и набор УНИКАЛЬНЫХ точек из которых строятся отрезки из которых строится мн-ник -)
Последний отрезок мн-ка (который Вас так смущает) - строится из последней и первой точки.
Возьмите листик и ручку, поставьте 3(три) точки. Соедините из отрезками. Получился мн-ник? Отлично. Вам не понадобилась для этого 4я точка? нет? Ну значит Вы меня поняли.

Цитата:
Сообщение от Izotic Посмотреть сообщение
- если точка пересечения найдена, то координаты второй вершины ребра которое мы проверяем меняются, и цикл проверки пересечения с другими ребрами начинается сначала.
меняются на что?

Последний раз редактировалось simples; 04.10.2013 в 23:21.
simples вне форума Ответить с цитированием
Старый 04.10.2013, 23:47   #16
Izotic
Пользователь
 
Регистрация: 26.05.2013
Сообщений: 13
По умолчанию

Цитата:
Вы путаете набор отрезков из которых состоит мн-ник и набор УНИКАЛЬНЫХ точек из которых строятся отрезки из которых строится мн-ник -)
да, действительно, спасибо, только сейчас понял
Цитата:
меняются на что?
на другие случайные координаты, и так пока не соберется простой многоугольник

и все таки вот в этом фрагменте кода что то не срабатывает, и пересечения остаются.(
Код:
for (int j = 3; j <= (k+1); j++)
            {
               
                
                for (int m = 1; m <= (j-2); m++)
                {
                    
                    k1 = (Y[j] - Y[j - 1]) / (X[j] - X[j - 1]);
                    k2 = (Y[m] - Y[m - 1]) / (X[m] - X[m - 1]);
                    b1 = Y[j - 1] - k1 * X[j - 1];
                    b2 = Y[m - 1] - k2 * X[m - 1];
                    x = (b2 - b1) / (k1 - k2);
                    if (((x>X[j-1])&&((x)<X[j]))||((x>X[m-1])&&(x<X[m])))
                    {
                        X[j] = rnd.Next(0, 10) + rnd.NextDouble();
                        Y[j] = rnd.Next(0, 10) + rnd.NextDouble();
                        m=0; 

                    }

                }

Последний раз редактировалось Stilet; 05.10.2013 в 11:38.
Izotic вне форума Ответить с цитированием
Старый 05.10.2013, 06:18   #17
simples
Форумчанин
 
Регистрация: 03.10.2013
Сообщений: 142
По умолчанию

Цитата:
Сообщение от Izotic Посмотреть сообщение
и все таки вот в этом фрагменте кода что то не срабатывает
Код:
                    k1 = (Y[j] - Y[j - 1]) / (X[j] - X[j - 1]);
                    k2 = (Y[m] - Y[m - 1]) / (X[m] - X[m - 1]);
                    b1 = Y[j - 1] - k1 * X[j - 1];
                    b2 = Y[m - 1] - k2 * X[m - 1];
                    x = (b2 - b1) / (k1 - k2);
                    if (((x>X[j-1])&&((x)<X[j]))||((x>X[m-1])&&(x<X[m])))
Это же проверка на "пересекаются отрезки"?
Советую вырезать этот кусок в отд.функцию и протестировать ее известным Вам набором данных.
О результатах - телеграфируйте.
simples вне форума Ответить с цитированием
Старый 05.10.2013, 09:42   #18
Izotic
Пользователь
 
Регистрация: 26.05.2013
Сообщений: 13
По умолчанию

Цитата:
Советую вырезать этот кусок в отд.функцию и протестировать ее известным Вам набором данных.
Блин, не люблю так делать если честно(
и разве от этого что то поменяется?
проверил(пока не вынося в отдельную функцию) на известной фигуре с пересечением, пересечение есть, но координаты вершин сдвинуты, весьма рандомно

сейчас попробовал вынести одну из вершин из начала координат, пересечения осталось,точнее как, в зависимости от направления обхода, с права на лево пересечение ликвидируются,а в обратном порядке нет , хотя проверка выполняется, и координаты действительно изменяются

Последний раз редактировалось Stilet; 05.10.2013 в 11:41.
Izotic вне форума Ответить с цитированием
Старый 05.10.2013, 22:23   #19
simples
Форумчанин
 
Регистрация: 03.10.2013
Сообщений: 142
По умолчанию

Цитата:
Сообщение от Izotic Посмотреть сообщение
Блин, не люблю так делать если честно(
А что делать - так учат.

Цитата:
Сообщение от Izotic Посмотреть сообщение
и разве от этого что то поменяется?
Да, можно будет проверить (тестами) - КОНКРЕТНО.ЭТОТ.КУСОК.

Цитата:
Сообщение от Izotic Посмотреть сообщение
проверил(пока не вынося в отдельную функцию) на известной фигуре с пересечением, пересечение есть
Надо проверить все возможные варианты ("есть пересечение, нет пересечения, есть общая точка у 2х отрезков". Не стесняйтесь, это Ваш интерес "найти проблему").

Цитата:
Сообщение от Izotic Посмотреть сообщение
сейчас попробовал вынести одну из вершин из начала координат, пересечения осталось,точнее как, в зависимости от направления обхода, с права на лево пересечение ликвидируются,а в обратном порядке нет , хотя проверка выполняется, и координаты действительно изменяются
Я все же настаиваю на отладке проверки до 100% результата. А то в случае неправ.проверки - Вы просто делаете НЕ нужные телодвижения приводящие хз к чему вообще.
simples вне форума Ответить с цитированием
Старый 06.10.2013, 04:06   #20
Izotic
Пользователь
 
Регистрация: 26.05.2013
Сообщений: 13
По умолчанию

Цитата:
Я все же настаиваю на отладке проверки до 100% результата.
я понимаю что она у меня не работает, и самое прискорбное что я и не знаю, что в ней отлаживать, я уже 6 алгоритмов определяющих пересечение попробовал, вот этот подсказал препод, и все равно не получается 100% результата(
Izotic вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
правильный многоугольник fist001 C++ Builder 7 10.06.2011 21:50
Многоугольник и круг Никита_96 Паскаль, Turbo Pascal, PascalABC.NET 2 09.02.2011 21:10
Многоугольник без самопересечения С++ kochet-kov Помощь студентам 0 23.12.2010 01:18
Динамический многоугольник. alex_8 Общие вопросы C/C++ 1 01.12.2010 17:55
Звёздчатый многоугольник Alex_FF Помощь студентам 0 30.12.2009 01:24