|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Алгоритм сортировки точек
механизатор
Самара
Регистрация: 28.12.2004
Сообщений: 312
|
||
Просмотров: 5130
|
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Может поможет
http://algolist.manual.ru/olimp/geo_prb.php Задача №12 http://mivmiv.narod.ru/Math/tetra.html Задача №1 http://www.autocad.ru/cgi-bin/f1/board.cgi?t=3908Xo Найдешь решение-покажи. Мое утверждение требует доказательств, но по моему этот четырехугольник - выпуклый и площадь его максимальна. Как вариант перебрать все варианты расположения вершин, их по моему 2**4=16 и найти максимальную площадь, это если влоб. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Еще пришла идея поискать алгоритм построения выпуклой области, 4-х угольник частный случай.
Бесконечная прямая пересекает замкнутую выпуклую область ровно в двух точках. http://www.codenet.ru/progr/cg/lec_3_1.php |
|||
![]() |
|
||||
механизатор Регистрация: 28.12.2004
Самара
Сообщений: 312
![]() |
to VVA
Спасибо за интересные ссылки. Также нашел вот такую задачу http://algolist.manual.ru/olimp/geo_prb.php задача 3. Из всего можно сделать вывод - что для того чтобы отсортировать четыре точки - углы выпуклого четырехугольника - надо сделать следующее: 1. найти любую внутренню точку четырехугольника х=1/3*(х1+х2+х3); у=1/3*(у1+у2+у3) 2. найти углы образуемые отрезками соединяющими эту точку со всеми углами 3. отсортировать углы по возрастанию или убыванию, в данном случае неважно. 4. после сортировки сопоставить углу точку в итоге получим список точек , по которым можно построить этот самый выпуклый четырехугольник. сейчас сделаю lisp программку, проверю и выложу. |
|||
![]() |
|
||||
Регистрация: 12.01.2006
Донецк
Сообщений: 30
|
(defun C:sss (/)
; Как отсортировать список координат ; ((660 307) (0 307) (440 0) (660 0) (220 307) (0 0) (220 0) (440 307)) ; чтобы получить ; ((0 0) (220 0) (440 0) (660 0) (0 307) (220 307) (440 307) (660 307)) ;############################################################################## (vl-sort '((660 307) (0 308) (440 0) (500 600) (660 0) (220 307) (0 0) (220 0) (440 307)) (function (lambda (e1 e2) (if (= (cadr e1) (cadr e2)) (< (car e1) (car e2)) (< (cadr e1) (cadr e2)) ) ) ) ) ;############################################################################## (princ) ) |
|||
![]() |
|
||||
механизатор Регистрация: 28.12.2004
Самара
Сообщений: 312
![]() |
to PSW
Не очень понял алгоритм Вашей функции, но она сортирует не так как нужно (возможно я непонятно сформулировал задачу) Мой вариант выглядит так: Код:
Кстати - как можно более изящно реализовать вот это выражение: Код:
|
|||
![]() |