我是clojure脚本的新手,我正试图将以下函数覆盖到clojurescript中
function getLengthAtPoint(pt){
var i = 0;
while(i < p.getTotalLength())
{
var xy = p.getPointAtLength(i);
// console.log(i, xy);
if(Math.round(xy.y) == pt[1] && Math.round(xy.x) == pt[0])
{
return i;
}
i++;
}
return 0;
}
我有以下逻辑
(defn get-length-at-point
[p pt]
(doseq [
i (range (.getTotalLength p))
:let [xy (.getPointAtLength p i)]
:when (and (= (round js/Math (first xy)) (first pt)) (= (round js/Math (last xy)) (last pt)))]
i)
0)
但我认为我在这里可能错了,因为:什么时候不会返回i
呢?
更新
想出了这个
(defn get-length-at-point
[pt {p :path}]
(loop [i 0]
(let [point (.getPointAtLength p i)]
(cond
(and (= (.round js/Math (.-x point)) (.round js/Math (:x pt)))
(= (.round js/Math (.-y point)) (.round js/Math (:y pt)))) i
(>= i (.getTotalLength p)) 0
:else (recur (inc i))
))))
如果有人知道更简单的方法请分享
答案 0 :(得分:2)
目前还不完全清楚你要在这里计算什么,但这是你要追求的目标之一:
(defn get-length-at-point
[pt p]
(->> (map #(.getPointAtLength p %) (range (.getTotalLength p)))
(filter (fn [point] (and (= (.round js/Math (.-x point)) (.round js/Math (:x pt)))
(= (.round js/Math (.-y point)) (.round js/Math (:y pt))))))
(count)))
惯用语Clojure代码通常会避免loop
map
所做的事情。 doseq
仅针对副作用运行,不会向您返回值。大多数时候,Clojure代码也不使用索引。如果您使用更多上下文更新帖子以了解您要执行的操作以及可以在p
上调用哪些功能,我们可能会提供更多帮助。