0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-02-04 13:29:14 -05:00
penpot/common/uxbox/common/math.cljc
2020-05-29 08:41:44 +02:00

128 lines
2.7 KiB
Clojure

;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; This Source Code Form is "Incompatible With Secondary Licenses", as
;; defined by the Mozilla Public License, v. 2.0.
;;
;; Copyright (c) 2020 UXBOX Labs SL
(ns uxbox.common.math
"A collection of math utils."
#?(:cljs
(:require [goog.math :as math])))
(defn nan?
[v]
#?(:cljs (js/isNaN v)
:clj (Double/isNaN v)))
(defn finite?
[v]
#?(:cljs (js/isFinite v)
:clj (Double/isFinite v)))
(defn abs
[v]
#?(:cljs (js/Math.abs v)
:clj (Math/abs v)))
(defn sin
"Returns the sine of a number"
[v]
#?(:cljs (js/Math.sin v)
:clj (Math/sin v)))
(defn cos
"Returns the cosine of a number."
[v]
#?(:cljs (js/Math.cos v)
:clj (Math/cos v)))
(defn acos
"Returns the arccosine of a number."
[v]
#?(:cljs (js/Math.acos v)
:clj (Math/acos v)))
(defn tan
"Returns the tangent of a number."
[v]
#?(:cljs (js/Math.tan v)
:clj (Math/tan v)))
(defn atan2
"Returns the arctangent of the quotient of its arguments."
[x y]
#?(:cljs (js/Math.atan2 x y)
:clj (Math/atan2 x y)))
(defn neg
"Negate the number"
[v]
(- v))
(defn sqrt
"Returns the square root of a number."
[v]
#?(:cljs (js/Math.sqrt v)
:clj (Math/sqrt v)))
(defn pow
"Returns the base to the exponent power."
[b e]
#?(:cljs (js/Math.pow b e)
:clj (Math/pow b e)))
(defn floor
"Returns the largest integer less than or
equal to a given number."
[v]
#?(:cljs (js/Math.floor v)
:clj (Math/floor v)))
(defn round
"Returns the value of a number rounded to
the nearest integer."
[v]
#?(:cljs (js/Math.round v)
:clj (Math/round v)))
(defn ceil
"Returns the smallest integer greater than
or equal to a given number."
[v]
#?(:cljs (js/Math.ceil v)
:clj (Math/ceil v)))
(defn precision
[v n]
(when (and (number? v) (number? n))
#?(:cljs (js/parseFloat (.toFixed v n))
:clj (.. (BigDecimal/valueOf v) (setScale n java.math.RoundingMode/HALF_UP) (doubleValue)))))
(defn radians
"Converts degrees to radians."
[degrees]
#?(:cljs (math/toRadians degrees)
:clj (Math/toRadians degrees)))
(defn degrees
"Converts radians to degrees."
[radians]
#?(:cljs (math/toDegrees radians)
:clj (Math/toDegrees radians)))
(defn distance
"Calculate the distance between two points."
[[x1 y1] [x2 y2]]
(let [dx (- x1 x2)
dy (- y1 y2)]
(-> (sqrt (+ (pow dx 2) (pow dy 2)))
(precision 2))))
(defn log10
"Logarithm base 10"
[x]
#?(:cljs (js/Math.log10 x)
:clj (Math/log10 x)))