2016-07-30 5 views
0

ich clojure Skript neu bin und ich versuche, die folgende Funktion in clojurescriptFunktion Testwert in einem Bereich von Werten und Rückgabewert

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; 
} 

ich zu decken haben die folgende Logik

(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) 

Aber ich denke, ich vielleicht hier falsch, weil: Wann wird nicht i wird es zurückgeben?

aktualisieren


mit diesem

(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)) 
     )))) 

Kam Wenn jemand weiß, einen einfacheren Weg

+0

Ihr Javascript bezieht sich auf 'p' und' pt', obwohl nur 'pt' ein Parameter ist. – Thumbnail

+0

yeah Ich füge einige zusätzliche Sachen in die Clojure-Version ein – Kendall

+0

Funktioniert das Javascript 'getLengthAtPoint', wie oben beschrieben, tatsächlich? Da der Körper der Funktion auf einer undefinierten Variablen "p" operiert, scheint dies unwahrscheinlich. – Thumbnail

Antwort

2

Es ist nicht ganz klar, teilen Sie bitte, was Sie hier zu berechnen sind versuchen, aber das ist etwas von dem, was Sie suchen:

(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))) 

Idiomatische Clojure-Code in der Regel vermeidet loop wo eine map tun wird. doseq wird nur für Nebenwirkungen ausgeführt und gibt keinen Wert an Sie zurück. Meistens verwendet Clojure Code auch keine Indizes. Wenn Sie den Post mit mehr Kontext für das, was Sie versuchen zu aktualisieren, und welche Funktionen Sie auf p aufrufen können, können wir möglicherweise mehr helfen.

+0

Sorry, ich dachte, das wäre über das Javascript offensichtlich gewesen. p ist ein '' Element und ich versuche die Länge zu einem gegebenen Punkt zu bekommen (opp. von 'getPointAtLength') – Kendall

Verwandte Themen