Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
102 / 86 / 5
Регистрация: 27.10.2010
Сообщений: 534
Записей в блоге: 2
1

Поиск трех ближайших точек к данной

01.01.2014, 19:29. Показов 3123. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть массив точек, заданных координатами х и y.
Нужно найти три ближайшие точки к данной, чтобы данная точка была в треугольнике, вершинами которого являются искомые точки.
Меня интересует самый быстрый алгоритм.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.01.2014, 19:29
Ответы с готовыми решениями:

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

Поиск двух ближайших друг к другу точек
5. Разработать программу, которая ищет во введенном множестве точек (заданных парами...

Поиск ближайших точек
На плоскости случайно расставляются точки. Далее задаётся ещё одна точка, для которой нужно найти n...

Поиск пары ближайших точек
Подскажите пожалйста, алгоритмы решения задачи о паре ближайших точек

21
194 / 174 / 30
Регистрация: 10.07.2012
Сообщений: 800
01.01.2014, 19:34 2
люди, вы когда задачи придумываете, придумывайте их решаемыми... как я должен понять фразу "в треугольнике"? если данная точка лежит на одной из сторон? может ли треугольник вырождаться в прямую?...
0
102 / 86 / 5
Регистрация: 27.10.2010
Сообщений: 534
Записей в блоге: 2
01.01.2014, 20:16  [ТС] 3
salam, точка также может лежать на стороне треугольника. Вершины треугольника - три искомые точки.
0
69 / 57 / 14
Регистрация: 20.12.2013
Сообщений: 656
01.01.2014, 21:34 4
На вскидку:
Вычислить длины векторов из точки к точкам массива, а потом добавлять в выборку по очереди точки, соответствующие минимальным длинам векторов и сортировать их по описывающему контуру вместе с заданной точкой. Когда заданная точка не будет попадать в выборку- она внутри и последняя добавленная точка с соседними в выборке образуют искомый треугольник.
0
102 / 86 / 5
Регистрация: 27.10.2010
Сообщений: 534
Записей в блоге: 2
01.01.2014, 23:38  [ТС] 5
AndrSlav,
Цитата Сообщение от Taras_Z Посмотреть сообщение
Меня интересует самый быстрый алгоритм.
Как по мне это не самый быстрый алгоритм. У меня сделано все так же, но это работает очень долго и поэтому мне надо быстрый способ.
0
Заблокирован
02.01.2014, 07:55 6
Есть такая мысль:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
//точка С в треугольнике из трех других точек р1, р2, р3
//если параметры одинакового знака, то точка внутри треугольника
//если какой-то параметр = 0, то точка лежит на стороне
//иначе - точка вне треугольника
int IsInTriangle (TPoint *p1, TPoint *p2, TPoint *p3, TPoint *c)
{   int param1 = (p1->X - c->X)*(p2->Y - p1->Y) - (p2->X - p1->X)*(p1->Y - c->Y);
    int param2 = (p2->X - c->X)*(p3->Y - p2->Y) - (p3->X - p2->X)*(p2->Y - c->Y);
    int param3 = (p3->X - c->X)*(p1->Y - p3->Y) - (p1->X - p3->X)*(p3->Y - c->Y);
 
    if (param1*param2 >= 0 && param2*param3 >= 0)
        return 1;
    return 0;
}
Если воспользоваться, то массив из 200 точек, перебранных по три by brute force, "сдается" менее чем за секунду.
Миниатюры
Поиск трех ближайших точек к данной  
0
Заблокирован
02.01.2014, 08:08 7
А это - уже для 2000 точек.
Время выполнения: чуть больше 2 минут.

При этом, поскольку вы разрешили точке находиться на стороне, она приютилась в вершине треугольника )
Миниатюры
Поиск трех ближайших точек к данной  
0
102 / 86 / 5
Регистрация: 27.10.2010
Сообщений: 534
Записей в блоге: 2
02.01.2014, 12:37  [ТС] 8
IrineK, Оно то так, но я делаю олимпиадную задачу, где надо уложиться в определенный тайм-лимит. В задаче, кроме этого алгоритма есть еще куча других, и вместе они будут выполняться достаточно долго. Мне просто нужно усовершенствовать это место.
Две минуты это очень долго. И точка может находиться на стороне, но не на вершине. Извиняюсь, что не указал этого раньше.
0
194 / 174 / 30
Регистрация: 10.07.2012
Сообщений: 800
02.01.2014, 12:50 9
Тогда бы уж дали ссылку на задачу.
0
102 / 86 / 5
Регистрация: 27.10.2010
Сообщений: 534
Записей в блоге: 2
02.01.2014, 15:18  [ТС] 10
salam, Ссылку дать не могу, так как такой не существует.
Могу объяснить суть задачи.
В комнате есть большой круглый (синий ) сундук посреди комнаты.
Надо перенести сундук из комнаты - но мешают колонны ( оранжевые ) .
Нужно найти , через какую стену возможно вынести сундук ( левая, правая , верхняя , нижняя) . (Если это возможно).
Переносить сундук через угол нельзя.
В файле задается размер комнаты ( XY ) , координаты и диаметр сундука , количество колонн n , их координаты и диаметр.
Выводить 0 , если сундук вынести из комнаты нельзя , или указывать номер стены , через которую можно вынести ящик ( все варианты ) .
Если нижняя стена - 1
Верхняя - 2
Левая - 3
Правая - 4
Пример файла:
Кликните здесь для просмотра всего текста
31 14
17 8 6
11
2 3 3
5 1 2
11 1 2
18 1 2
26 1 2
8 9 2
1 12 2
13 12 2
21 11 3
25 8 2
29 12 2

Ответ: 1
Миниатюры
Поиск трех ближайших точек к данной  
0
Заблокирован
02.01.2014, 18:08 11
Две минуты для 2000 "колонн".
Для тех 11, которые мы видим в примере - речь идет о долях миллисекунд.
Кстати, в корректно поставленной спортивной задаче должно быть дано ограничение на их кво.
Каковы границы этого числа?
0
102 / 86 / 5
Регистрация: 27.10.2010
Сообщений: 534
Записей в блоге: 2
02.01.2014, 18:35  [ТС] 12
IrineK, 11 колонн это лишь пример.
Четких ограничений на количество колонн сожалению нет. Не надо за меня решать всю задачу. Она уже решена. Я просто хочу улучшить время ее выполнения. То что мне нужно, сказано в моем первом сообщении. Если вы не знаете лучшего алгоритма, то не надо писать то, что здесь было уже написано.
0
Заблокирован
02.01.2014, 19:12 13
Цитата Сообщение от Taras_Z Посмотреть сообщение
Она уже решена
Почему меня это должно останавливать? )

Все-таки хочется знать порядок величин, в частности заинтересовали ограничения на площадь комнаты: каждая стена длиной до сотен, до тысяч? Думаю, эдакий bitmap помещения может сильно помочь.

Цитата Сообщение от Taras_Z Посмотреть сообщение
Я просто хочу улучшить время ее выполнения
Т.е. не все тесты проходим. Тогда задача - не совсем решена
0
102 / 86 / 5
Регистрация: 27.10.2010
Сообщений: 534
Записей в блоге: 2
02.01.2014, 19:26  [ТС] 14
IrineK, У меня нет точных ограничений. Также я не знаю, проходит ли мое решение по времени, потому что не могу проверить его. Вы можете решать эту задачу. Даже, если хотите, можете мне рассказать свою идею ррешения задачи. Просто все, что я хочу сейчас это усовершенствовать свой ​​метод.
0
Заблокирован
02.01.2014, 19:31 15
ОК.
Тогда сориентируйте во времени, которое необходимо вашему коду, чтобы перемолоть пример.
И какое время хотелось бы получить?
0
102 / 86 / 5
Регистрация: 27.10.2010
Сообщений: 534
Записей в блоге: 2
02.01.2014, 19:41  [ТС] 16
Цитата Сообщение от IrineK Посмотреть сообщение
И какое время хотелось бы получить?
Чем меньше тем лучше)
Пример выполняется за 0,003 с.
Но при увеличении колонн время существенно изменится.
0
Заблокирован
03.01.2014, 06:44 17
Основная идея альтернативного подхода такая.

Мне нужно пронести круглый сундук с определенным конечным радиусом, обходя круглые препятствия (fig1).

В принципе, если я "сброшу" радиус сундука на эти препятствия, то задача сводится к прохождению пикселя, который может проходить и по границе препятствий (fig2 - там пиксель несколько преувеличен).

Дальше - волновой алгоритм нам в помощь. Заходим со стен комнаты.

Однако, волнует следующее. Обе картинки даны с зумом 50. Видим два пути, похожих на выходы: слева и внизу.

В реале сундук проходит внизу впритык (окружности касаются, но не пересекаются). Слева по расчетам сундуку не хватает 0,015 пикселя, чтобы протиснуться. Но мы ставим на построение карты, а не на расчеты. Исходя из "0,015" зума 200 достаточно, чтобы увидеть, что окружности слева "наезжают", а не касаются (fig3 - слева, fig4 - внизу, зум 200).

В общем, Брезенхейм и "правильный" масштаб нам алсо в помощь )
Миниатюры
Поиск трех ближайших точек к данной   Поиск трех ближайших точек к данной   Поиск трех ближайших точек к данной  

Поиск трех ближайших точек к данной  
0
102 / 86 / 5
Регистрация: 27.10.2010
Сообщений: 534
Записей в блоге: 2
03.01.2014, 11:25  [ТС] 18
IrineK, Очень интересный метод!)
Спасибо)
0
102 / 86 / 5
Регистрация: 27.10.2010
Сообщений: 534
Записей в блоге: 2
07.01.2014, 16:35  [ТС] 19
Никто не знает лучшего алгоритма?
1
60 / 60 / 19
Регистрация: 11.07.2013
Сообщений: 305
07.01.2014, 16:42 20
Цитата Сообщение от Taras_Z Посмотреть сообщение
Четких ограничений на количество колонн сожалению нет.
Мде... классная задача. Тогда тайминг ничего не решает, ибо можно ввести максимальное число и тут даже самый оптимальный алгоритм не справится за секунду-другую.
0
07.01.2014, 16:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.01.2014, 16:42
Помогаю со студенческими работами здесь

Поиск ближайших точек, язык си
Здравствуйте! Есть задача: 1.Фиксируем несколько точек (А,Б,С.Д и т.д. их может быть сколько...

Поиск ближайших точек по координатам
На плоскости заданы 5 точек с координатами (x0, y0), (x1, y1) ... (x4, y4). Найти две ближайшие...

Поиск ближайших точек в пространстве которые образуют многогранник
Дана точка с координатами (X, Y, Z). Необходимо найти ближайшие к ней 4 точки, которые образуют...

Выяснить встречаются ли в данной последовательности группы из трех стоящих рядом точек
Народ помогите пожалуйста. Заранее спасибо! Для натурального n и последовательности символов...


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

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