Я думаю, что это довольно элегантное решение:
(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 сессия:
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
, даже если ваш пример выходных данных был отформатирован как вектор,Я подумал, что это не важно.