首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Clojure中从两点创建直线段

在Clojure中从两点创建直线段
EN

Stack Overflow用户
提问于 2011-03-28 10:53:51
回答 2查看 313关注 0票数 3

做这件事最好的方法是什么?这是我到目前为止所得到的

代码语言:javascript
复制
(defn line-segment [start end]
  (let [x-direction (abs (- (first end) (first start)))
        y-direction (abs (- (last end) (last start)))]
    (cond
      (= 0 x-direction) (something ...)
      (= 0 y-direction) (something ...))))

这是我的最终目标

代码语言:javascript
复制
user=> (line-segment [5 6] [5 8])
([5 6] [5 7] [5 8])

是的,没有对角线,只有x或y运动。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-28 12:40:13

我认为这是一个非常优雅的解决方案:

代码语言:javascript
复制
(defn line-segment [start end]
  (let [x1 (first start) x2 (first end)
        y1 (last start)  y2 (last end)
        dx (if (> x1 x2) -1 1)
        dy (if (> y1 y2) -1 1)]
    (for [x (range x1 (+ dx x2) dx)
          y (range y1 (+ dy y2) dy)]
      [x y])))

REPL会话:

代码语言:javascript
复制
user> (line-segment [5 6] [5 8])
([5 6] [5 7] [5 8])
user> (line-segment [5 8] [5 6])
([5 8] [5 7] [5 6])
user> (line-segment [-2 7] [1 7])
([-2 7] [-1 7] [0 7] [1 7])
user> (line-segment [1 7] [-2 7])
([1 7] [0 7] [-1 7] [-2 7])

即使您的示例输出被格式化为向量,此函数也会返回LazySeq。我觉得这并不重要。

票数 2
EN

Stack Overflow用户

发布于 2011-03-28 17:38:33

这里有一个简单的解决方案,也允许使用对角线:

代码语言:javascript
复制
(use 'clojure.contrib.math)

(defn line-segment [start end]
  (let [x1 (first start) x2 (first end)
        y1 (last start)  y2 (last end)
        xdiff (- x2 x1)
        ydiff (- y2 y1)
        maxdiff (max (abs xdiff) (abs ydiff))
        dx (/ xdiff maxdiff)
        dy (/ ydiff maxdiff)]
    (for [i (range (inc maxdiff))]
      [(round (+ x1 (* i dx))) (round (+ y1 (* i dy)))])))

与dbryne的解决方案一样,这返回一个懒惰的点序列,而不是一个向量:我认为这是最有用的形式,假设您随后想要依次对线段上的每个点执行某些操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5454183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档