|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
23.06.2014, 14:29 | #1 |
Пользователь
Регистрация: 23.06.2014
Сообщений: 13
|
Задача с сортировкой (Delphi). Дано n точек на плоскости. Указать (n-1)-звенную несамопересекающуюся незамкнутую ломаную
Здравствуйте, подскажите как правильно это реализовать, вот задание:
Дано n точек на плоскости. Указать (n-1)-звенную несамопересекающуюся незамкнутую ломаную, проходящую через все эти точки. (Соседним отрезкам ломаной разрешается лежать на одной прямой.) Обеспечить число действий порядка n*log n. Указание. Упорядочим точки по x-координате, а при равных x-координатах - по y-координате. В таком порядке и можно проводить ломаную. С одной стороны все понятно, 1. создаю массив, наполняю его координатами (тут пока не совсем понимаю как их наполнять ведь в координатах будет две цифры по х и по у) 2. отсортировать массив по х это понятно, но как подставить если по х одинаковые значения, чтобы смотрелось на вторую координату y. 3. далее уже с упорядоченного массива можно построить график и прочертить ломаную. Пока все проблемы, что непонятно как быть со второй координатой? есть мысль пузырьком упорядочить, но как туда подставить проверку на -y координаты если по -х совпадут значения. |
23.06.2014, 20:20 | #2 |
Регистрация: 23.06.2014
Сообщений: 6
|
Надо создать массив структур и отсортировать его qsort'ом. В функции сравнения сначала сравнивать X'ы, а при их совпадении -- Y'и. По отсортированному таким образом массиву координат легко строится ломаная.
Кстати, интересно было бы модифицировать алгоритм так, чтобы по заданному набору случайных точек строилась ломаная, закрученная по спирали, от краев области к центру. |
23.06.2014, 21:33 | #3 |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Модифицировать можно, но эффективность упадет. Зачем нужны эти спирали вообще, что за извращения?
Упадет потому, что надо будет получать точки выпуклой оболочки, соединять их, получать новую оболочку и т.п. Время будет вроде бы тоже n*log(n), но лишних операций будет достаточно. Достаточно и непонятно из за чего вся эта свистопляска. |
23.06.2014, 22:18 | #4 |
Регистрация: 23.06.2014
Сообщений: 6
|
Спираль -- это усложнённая вариация задачи. Как я и написал, просто интересно было бы её решить, почему сразу "извращения"? В результате работы программы, решающей исходную задачу, область будет "заштрихована" линиями, идущими более или менее вертикально, а в моей вариации получится красивая спиралька. Попробую сделать, отпишусь по результатам.
|
24.06.2014, 23:40 | #5 |
Пользователь
Регистрация: 23.06.2014
Сообщений: 13
|
Спасибо за ответы, но не получается пока. *(плохо с программированием)
К примеру сделал массив (пока без рандома или ручного ввода): Const po : Array[0..4] Of TPoint = ((x:20; y:40),(x:40; y:40),(x:30; y:10),(x:50; y:20),(x:30; y:20)); Вывожу на форме по нажатии кнопки так: procedure TForm1.btn1Click(Sender: TObject); begin Form1.Canvas.Polygon(po); end; Помогите как его упорядочить перед выводом. |
25.06.2014, 12:13 | #6 |
Регистрация: 23.06.2014
Сообщений: 6
|
Используйте любой алгоритм сортировки (ищите на этом сайте по запросу "сортировка массива delphi"). В том месте, где сравниваются элементы массива, сначала сравнивайте x координаты, при их равенстве -- у координаты.
Например при пузырьковой сортировке код, сравнивающий элементы будет такой: Код:
|
25.06.2014, 14:22 | #7 |
Пользователь
Регистрация: 23.06.2014
Сообщений: 13
|
Нашел такой пример:
Код:
Код:
Код:
|
25.06.2014, 18:42 | #8 |
Регистрация: 23.06.2014
Сообщений: 6
|
В BubbleSort у параметра a поменяйте тип вместо "массив целых чисел" сделайте "массив TPoint'ов". Алгоритм остаётся тот же, только вместо сравнения чисел сравнивайте точки, вернее их координаты, код сравнения я уже приводил. Аналогично, вместо обмена двух чисел между ячейками массива надо обменивать структуры.
|
25.06.2014, 20:14 | #9 |
Пользователь
Регистрация: 23.06.2014
Сообщений: 13
|
так немного вроде получилось, в мемо1 я записал координаты:
x:20; y:40 x:40; y:30 x:30; y:50 x:50; y:20 x:30; y:20 x:20; y:60 x:40; y:30 x:30; y:40 x:50; y:30 x:30; y:30 x:20; y:50 x:40; y:10 x:30; y:10 x:50; y:20 x:30; y:20 x:20; y:30 x:40; y:50 x:30; y:20 x:50; y:30 x:30; y:10 В коде я заменил массив на TPoint, вставил код для сравнения, но еще проблемы есть, как быть с этими строками перемещения элементов массива и передачи элементов к вызову процедуры: Код:
|
26.06.2014, 14:02 | #10 |
Пользователь
Регистрация: 23.06.2014
Сообщений: 13
|
Теперь вот как:
Код:
Координаты в массиве / вывод в мемо2 x:10; y:20 / 10,20 x:20; y:30 / 40,50 x:30; y:40 / 20,30 x:40; y:50 / 30,40 x:50; y:60 / 50,60 x:60; y:70 / 60,70 x:70; y:80 / 70,80 Подскажите, что еще не так в коде? |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
На плоскости задано множество точек. Определить все тройки точек, которые являются вершинами прямоугольного треугольника | Олечка12 | Помощь студентам | 11 | 22.04.2014 19:56 |
Даны координаты точек n на плоскости. Найти номера двух точек, расстояние между которыми наибольшее. | getredtm | Помощь студентам | 3 | 01.07.2013 01:47 |
Delphi. На плоскости заданы n точек своими координатами.Построить квадрат | Allexey | Помощь студентам | 4 | 18.06.2013 13:46 |
Даны координаты n точек на плоскости. Найти номера двух точек, расстояние между которыми наибольшее. | Viwwna | Паскаль, Turbo Pascal, PascalABC.NET | 2 | 19.11.2011 06:33 |
определить радиус и центр окружности, на кот. лежит наиб.число точек заданного на плоскости мн-ва точек) | kcю | Помощь студентам | 0 | 17.11.2009 19:50 |