![]() |
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Теория - Упорядочение массива точек |
|
Теория - Упорядочение массива точек
|
Ветеран Сообщения: 1384 |
Здравствуйте. Имеем некоторый массив точек Point(float x, float y) (в примере ниже из 16 элементов). Фактически это координаты вершин некоторых правильных фигур, вложенных друг в друга. Мне нужно программно определять попадает ли пробная точка внутрь области, содержащей точки (внешнего многоугольника).
![]() В предыдущей теме я пытался найти метод определения принадлежности точки области. Нашёл при помощи создания Path: создаём Path используя массив точек и при помощи метода IsVisible() узнаём принадлежит ли наша пробная точка области. Сейчас трудность заключается в том, что массив из точек не упорядочен. В предыдущей теме я грубо задавал эти точки вбивая координаты вершин восьмиугольника руками, по часовой стрелке, например. Сейчас же набор точек из 16 элементов считается программой и может быть совершенно произволен. Если их соединить то получается не совсем то что нужно! ![]() Т.е. задача сводится к тому чтобы или как-то упорядочить массив точек чтобы они шли последовательно (а потом уже создавать тот самый Path)... или найти такой метод в C#, который позволит по заданному набору точек построить фигуру, ограничивающую этот набор. Какие будут предложения? |
|
------- Отправлено: 23:59, 27-09-2011 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата Tonny_Bennet:
|
|
Отправлено: 01:23, 28-09-2011 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Необычный Сообщения: 4466
|
Профиль | Сайт | Отправить PM | Цитировать Tonny_Bennet, сейчас попробую аккуратно объяснить мысль...
дело в том, что приведенный первый рисунок описывает именно ту "страшную" фигуру, которая и получилась. Т.е. предположение о том, что это два правильных 8 угольника - неверно. Цитата Tonny_Bennet:
Есть мой любимый школьный пример про треугольники. Например, есть треугольник ABC (см. картинку) он не равен треугольнику СВА, не смотря на то, что с виду они похожи. Равенство треугольников приводит к равенствам сторон AB = CB, BC = BA, CA = AC. Так же из равенства треугольников следует равенство углов CAB = ACB, ABC = CBA, BCA = BAC, неравенство которых, при заданном треугольнике, должно развеять все сомнения. Возвращаясь к заданию. Если мы говорим, что нам даны правильные фигуры, то массив точек описывающих фигуру автоматически, по законам геометрии, упорядочен. |
|
------- Отправлено: 08:44, 28-09-2011 | #3 |
Старожил Сообщения: 154
|
Профиль | Отправить PM | Цитировать lxa85 - пожайлуства еще раз сформулируй свою детскую задачку, или рисунок. просто треугольники у тебя равнобедренные с вершиной B и одинаковы, поэтому что ABC или CBA его назвать - одно и тоже. они равны.
а на счет вопроса по теме. да - при составлении фигуры надо указывать точки с порядке их примыкания друг к другу. т.е. нельзя указать как на битом рисунке 4-5-6-7 и т.д. он их и соединит построив поверхность. Есть тривиальное но неоптимальное решение, которое годится для относительно небольшого объема точек - это для полной выборки из всех точек трех строить поверхности и потом эту поверхность объеденить. Но это работает только для выпуклой фигуры, т.е. скажем звезду так не построить. более сложный - это упорядочивать точки. для правильной фигуры это достаточно просто - выбираешь первую точку, к ней перебираешь все точки находя длинну до них в 2-хмерной плоскости по координатам точек и из 2-х самых маленьких выбираешь произвольно любую, далее для найденной 2-ой точки делаешь абсолютно тоже самое, только исключив первую точку из списка перебора, самой маленькой длинны будет всего одна. и так далее. главное учти - поиск длинны должен быть в double а то могут быть пробемы |
Отправлено: 12:22, 28-09-2011 | #4 |
Необычный Сообщения: 4466
|
Профиль | Сайт | Отправить PM | Цитировать Beyound,
Цитата Beyound:
|
||
------- Отправлено: 13:05, 28-09-2011 | #5 |
Ветеран Сообщения: 1384
|
Профиль | Отправить PM | Цитировать Тему создавал ночью, после тяжёлого учебного дня, непростого рабочего дня и тренировки по волейболу. А потом ещё кодил это дело.... видно совсем устал тогда.
Сейчас попробую сформулировать задачу иначе: Есть некоторый произвольный конечный набор точек на плоскости. Необходимо выделить точки из этого набора, при соединении которых получается замкнутая фигура, внутрь которой попадает весь набор точек. Т.е. если рассматривать первый рисунок то на выходе я должен получить массив такого вида: 2, 10, 11, 9, 13, 5, 4, 6. Ну или подобный, сдвинутый на любое количество позиций. Проводя мозговой штурм с единомышленниками-алгоритмизаторами пришли в такой идее: Последовательно выбирая точки: от трёх до N, соединять их и получать фигуру. И проверять попадают ли точки из набора внутрь этой фигуры. Если хоть одна не попала - переходить к следующей фигуре, пока мы не найдём фигуру, внутрь которой попадают все точки набора. Это и будет фигура, ограничивающая весь набор. Пока запрограммировать было некогда. Видно что алгоритм затратный в смысле процессорного времени. Но лучше пока ничего не придумал. |
------- Отправлено: 10:25, 29-09-2011 | #6 |
Разный Сообщения: 1294
|
Профиль | Отправить PM | Цитировать это посмотрите
|
Отправлено: 12:36, 29-09-2011 | #7 |
Ветеран Сообщения: 1384
|
Профиль | Отправить PM | Цитировать ferget, спасибо. Gift wrapping - достаточно понятный и не сложный алгоритм. Попробую изобразить.
|
------- Отправлено: 16:20, 29-09-2011 | #8 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Интерфейс - [решено] Упорядочение файлов в папке путем их перетаскивания | Vadikan | Microsoft Windows 7 | 60 | 21-04-2013 16:47 | |
Разное - Очистка точек восстановления | Eduard S. | Microsoft Windows 7 | 3 | 01-07-2011 17:02 | |
Службы - Тормозит из-за точек восстановления? | gorill | Microsoft Windows 7 | 15 | 17-12-2010 10:19 | |
полосы из светлых точек | peregon_zameuka | Непонятные проблемы с Железом | 4 | 15-04-2010 10:49 | |
удаление точек востановления | sil | Microsoft Windows 95/98/Me (архив) | 1 | 16-04-2004 16:33 |
|