如何在计划中保存和排序坐标(的点数)?

问题描述:

我想将点(X,Y)的坐标保存在列表中。此外,我想每次在列表中添加点时按X或Y值排序列表。如何在计划中保存和排序坐标(的点数)?

我该怎么做?

在此先感谢。

在Scheme中有很多方法可以做到这一点。在这个答案中,我将使用PLT Scheme(如你的标签建议)。我将提供PLT计划documentation的链接,您可以在这里阅读有关这些内容的更多信息。

首先我们可以define a point structure

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

这个简单的定义会自动创建,我们可以用我们的点工作时使用

  • (make-point 3 4)将创建一个具有坐标新点(3,4)
  • (point-x <some-point>)返回许多有用的功能x坐标,例如。 (point-x (make-point 3 4))通过y的计算,以3

sort点的坐标列表:

(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函数有两个可选参数:

  • 谓词功能,可根据不同顺序(默认为<)
  • 其可被用于从一些结构中提取的元素的键功能(默认为恒等函数)被用于保持列表排序

此功能可像这样使用:

> (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是一个点的排序列表。

+0

太棒了!非常感谢乔纳斯。很好的解释! 我是非常新的plt-scheme。我认为(个人)计划书或文档是以这样一种方式编写的,即你必须从头开始,并且不能按照你的要求随机飞行。 如果你能指导文档链接,会更好。这将有助于我走上正轨并在询问下一个问题之前尝试使用文档:) – fireball003 2009-06-11 12:04:26