Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/121: Рейтинг темы: голосов - 121, средняя оценка - 4.93
1 / 1 / 2
Регистрация: 06.04.2011
Сообщений: 27
1
.NET 4.x

Проверка пересечения фигур

12.08.2011, 14:29. Показов 24551. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всех приветствую. У меня возникла такая проблема, мне необходимо нарисованный полигон проверить на наличие пересечений с расставленными на поле другими объектами (прямоугольниками). Т.е. это выглядит примерно так, на PictureBox в разном порядке расположенны простейшие геометрически фигуры, которые имеют свои имена, далее поверх рисуются два Polygon-а, которые нужно проверить на пересечение и вывод потом в список какие оъекты были перекрыты, Polygon - ом. Немогу найти какое-нибудь более или менее достойное решение!
Подскажите пожалуйста, как можно это организовать или где можно по этому вопросу почитать.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.08.2011, 14:29
Ответы с готовыми решениями:

Проверка пересечения фигур
Здравствуйте. Подскажите как проверить пересекаются ли фигуры на координатной плоскости? Фигуры...

Как найти точки пересечения этих фигур
Всем доброго времени суток. У меня есть граф редактор. В нем рисуются более 15 видов фигур,...

Проверка пересечения отрезков и триангуляция
Здравствуйте, господа! У меня стоит задача сделать программу, делающую триангуляцию точек,...

Событие пересечения фигур
Привет. Есть координаты двух квадратов, то есть 4 координаты на квадрат. Необходимо определить...

11
Мохаммед Али
131 / 70 / 5
Регистрация: 14.08.2009
Сообщений: 916
12.08.2011, 14:33 2
обычное достойное решение проверяем все пары точек на пересечение(так как пара тчоек это отрезок) а полигон как таковой состоит из таких точек то просто для каждого отрезка соотвественно прмиеняем функцию
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
  /// <summary>
        /// определение наличия пересечения двух отрезков
 
        public bool Intersection(double ax1, double ay1, double ax2, double ay2, double bx1, double by1, double bx2, double by2)
        {
            double v1, v2, v3, v4;
            v1 = (bx2 - bx1) * (ay1 - by1) - (by2 - by1) * (ax1 - bx1);
            v2 = (bx2 - bx1) * (ay2 - by1) - (by2 - by1) * (ax2 - bx1);
            v3 = (ax2 - ax1) * (by1 - ay1) - (ay2 - ay1) * (bx1 - ax1);
            v4 = (ax2 - ax1) * (by2 - ay1) - (ay2 - ay1) * (bx2 - ax1);
            bool res = (v1 * v2 < 0) && (v3 * v4 < 0);
            return res;
        }
при хотть одном совпадении фигуры пересекаются, тоесть если не понятно вдруг мы сравниваем каждый отрезок одного контура с каждым отрезком другого контура(полигона)
1
826 / 717 / 110
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
12.08.2011, 14:49 3
Советую на эту тему прочитать тут: Пересечение: Два выпуклых многоугольника.
Если лень разбираться, то можно просто каждое ребро одного полигона проверять на пересечение со всеми ребрами другого полигона.
1
1 / 1 / 2
Регистрация: 06.04.2011
Сообщений: 27
12.08.2011, 15:15  [ТС] 4
Это может и не плохой способ, но проблема в том что таких отрезков может быть милион, а то и больше не удобно! Может есть какой-нибудь способ сравнивать объекты целиком, ну или разбить их на более мелкие и сравнивать массивы объектов.
0
Мохаммед Али
131 / 70 / 5
Регистрация: 14.08.2009
Сообщений: 916
12.08.2011, 15:31 5
более короткого способа нету, этот самый оптимальный, вы же не все проверяете отрезки а только до того момента пока одна из пар не персечеться, алгоримт для большого количества можно сократить методом "золотого сечения" не видел чтоб этот алгоритм применялся для подобных задач но в моей голове это выглядит так, берем делим полигон на 4 примерно равные части, составляющтие которых отрезки, если какой т оотрезок перескает отрезок другого многоугольника который тоже разделен на 4 отрезка то дальше мы вясняем какой именно подотрезок пересеккся с другим подотрезко, постепенно разбивая подотрезки на другие подотрезки допустим по 2, так как в итоге может оказаться чт оони не пересекаются, точно также при условии чт они один из первых четырех отрезко не пересекается с соотвествующими 4 отрезкаим другого много гульника- разбиваем многоугольник уже на 16 32 и тд отрезко дял фломрирвоания более четкой фигуры контура в конце соотвествующей искомой фигуре....... как то так по омему неплохо)
0
1 / 1 / 2
Регистрация: 06.04.2011
Сообщений: 27
12.08.2011, 15:31  [ТС] 6
О спасибо, про выпуклые многоугольники, вроде то что надо, жаль что не для C#, но не беда!
Но если, кто-то еще, какие-нибудь способы подскажет буду благодарен!
0
Мохаммед Али
131 / 70 / 5
Регистрация: 14.08.2009
Сообщений: 916
12.08.2011, 15:33 7
Лучший ответ Сообщение было отмечено как решение

Решение

вообще для полигонов вси шарпе есть готовая функция наличия пересечения
C#
1
2
 GraphicsPath dsd = new GraphicsPath();
               dsd.IsVisible(Point dsds);
1
1 / 1 / 2
Регистрация: 06.04.2011
Сообщений: 27
12.08.2011, 15:37  [ТС] 8
asd321, Спасибо! Может эта функция даст мне больший результат и быстрей! Мне нужно толко два полигона проверить с десятком мелких полигонов на пересечение.
0
мастер топоров
916 / 741 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
13.08.2011, 00:53 9
Leotor, если ваш математический аппарат не хромает и полигон довольно хитрый, то на Хабре есть статья на эту тему
2
1 / 1 / 2
Регистрация: 06.04.2011
Сообщений: 27
15.08.2011, 13:06  [ТС] 10
Спасибо, Koran. Я эту статью видел, неплохая статья немного мудрено. Там на одну точку проверка, а если точек будет тысячи, то тогда как? Вот пытаюсь найт способ проще и быстрей! Сравнение нескольких полигонов это самы, наверное, удобный способ, т.к. у меня несколько десятков маленьких полигонов и два основных.
P.S. Как реализую этот вопрос обязательно выложу код, а пока я еще в поиске лучшего варианта.
0
20 / 20 / 3
Регистрация: 01.04.2010
Сообщений: 57
15.08.2011, 14:07 11
Добрый день!
Есть Теория R-функций. Мне кажеться это наиболее достойное решение. Суть его в том, что имея уравнения всех полигонов, или нужных вам, вы с помощью R-функции можете получить новую функцию, которая у вас будет описывать пересечение, объеденение или отрицание примитивов.

Вот пример:

1. У вас есть круг, уравнение которого в двумерном пространстве имеет вид: f1 = R*R-x*x-y*y >= 0
2. У вас есть плоскость, уравнение которой f2 = x >= 0

Вам нужно найти, пересечение (коньюнкцию).

Составляете такую формулу: f1&f2 = f1 + f2 - sqrt(f1*f1 + f2*f2)

В результате получаете: f3 = f1&f2 = R*R-x*x-y*y + x - sqrt((R*R-x*x-y*y)*(R*R-x*x-y*y) + x*x)

И теперь, если эта функция хотя бы в одной точке больше нуля, то фигуры накладываются.

Подробнее еще можно здесь.
 Комментарий модератора 
На форуме есть редактор формул.
1
826 / 717 / 110
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
15.08.2011, 18:39 12
Почитайте тут: Обнаружение столкновений.
Создавайте вокруг полигонов ограничивающие прямоугольники и проверяйте на пересечение их. Если пересекаются, то проверяйте на пересечение сами полигоны.
1
15.08.2011, 18:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.08.2011, 18:39
Помогаю со студенческими работами здесь

Нахождение точек пересечения 2-х фигур
Необходимо, используя компонент TImage, нарисовать 2-ва любых примитива и найти точки их...

Найти область пересечения фигур
Здравствуйте, господа. Ситуация такова: имеется два массива точек (каждая - объект, хранящий 3...

Пересечения двух объемных фигур
Необходимо найти точки пересечения(далее построить плоскость) двух объемных фигур, если фигуры...

Определение точек пересечения фигур
Люди добрые помогите, проверить доработать и дать советы в задачах: Вычислить с помощью любого...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru