Как сохранить и отсортировать координаты (точек) на схеме? - PullRequest
0 голосов
/ 11 июня 2009

Я хочу сохранить координаты точек (X, Y) в списке. Также я хочу отсортировать список по значению X или Y каждый раз, когда добавляю точки в этот список.

Как я могу это сделать?

Заранее спасибо.

1 Ответ

4 голосов
/ 11 июня 2009

Есть много способов сделать это в Схеме. В этом ответе я буду использовать PLT Scheme (как указано в вашем теге). Я дам ссылки на схему PLT документация , где вы можете прочитать больше об этих вещах.

Прежде всего, мы можем определить структуру точек .

 (define-struct point (x y) #:transparent)

Это простое определение автоматически создаст много полезных функций, которые мы можем использовать при работе с нашими точками

  • (make-point 3 4) создаст новую точку с координатами (3,4)
  • (point-x <some-point>) возвращает координату x, напр. (point-x (make-point 3 4)) оценивается как 3

К сортировать список точек по их координатам y:

(define (sort-by-y lst)
  (sort lst
        <
        #:key point-y))

Если вы хотите сохранить список отсортированным, когда вы insert начинаете новую точку, вы можете сделать что-то вроде

(define (insert x xs #:predicate (p <) #:key (k (lambda (x) x)))
   (if (null? xs)
       (list x)
       (let ((y (car xs)))
         (if (p (k x) (k y))
             (cons x xs)
             (cons y (insert x 
                             (cdr xs) 
                             #:predicate p 
                             #:key k))))))

Функция insert принимает два необязательных аргумента:

  • функция предиката, которую можно использовать для сортировки списка в соответствии с различными порядками (по умолчанию <) </li>
  • ключевая функция, которую можно использовать для извлечения элемента из некоторой структуры (по умолчанию это функция идентичности)

Эту функцию можно использовать так:

> (insert 3 (list 1 2 4 5 6))
(1 2 3 4 5 6)

> (insert (make-point 3 5) plist #:key point-y)
(#(struct:point 2 1) 
 #(struct:point 9 2) 
 #(struct:point 1 3) 
 #(struct:point 3 5) 
 #(struct:point 6 6))

> (insert (make-point 3 5) (reverse plist) #:predicate > #:key point-y)
(#(struct:point 6 6) 
 #(struct:point 3 5) 
 #(struct:point 1 3) 
 #(struct:point 9 2) 
 #(struct:point 2 1))

где plist - отсортированный список точек.

...