1// SASSY MATH 2 3@charset "UTF-8"; 4 5////////////////////////////// 6// Variables 7////////////////////////////// 8$pi: 3.1415926535897932384626433832795028841971693993751; 9$π: $pi; 10$e: 2.71828182845904523536028747135266249775724709369995; 11 12$iter: 50; 13 14////////////////////////////// 15// Random Number 16// Working from http://xkcd.com/221/ 17// Chosen by fair dice roll. 18// Guarenteed to be random. 19////////////////////////////// 20@function rand() { 21 @return 4; 22} 23 24////////////////////////////// 25// Percent 26////////////////////////////// 27@function percent($number) { 28 @return $number * 0.01; 29} 30 31////////////////////////////// 32// Exponent 33////////////////////////////// 34@function exponent($base, $exponent) { 35 // reset value 36 $value: $base; 37 // positive intergers get multiplied 38 @if $exponent > 1 { 39 @for $i from 2 through $exponent { 40 $value: $value * $base; } } 41 // negitive intergers get divided. A number divided by itself is 1 42 @if $exponent < 1 { 43 @for $i from 0 through -$exponent { 44 $value: $value / $base; } } 45 // return the last value written 46 @return $value; 47} 48 49@function pow($base, $exponent) { 50 @return exponent($base, $exponent); 51} 52 53////////////////////////////// 54// Factorial 55////////////////////////////// 56@function factorial($number) { 57 // reset value 58 $value: 1; 59 // positive intergers get multiplied 60 @if $number > 0 { 61 @for $i from 1 through $number { 62 $value: $value * $i; 63 } 64 } 65 @return $value; 66} 67 68@function fact($number) { 69 @return factorial($number); 70} 71 72 73////////////////////////////// 74// Polynomial Approximation 75////////////////////////////// 76// Maclaurin series can be used to estimate Sine and Consine 77@function maclaurin($start, $key, $number) { 78 $value: $start; 79 $add: 0; 80 81 @for $i from 1 through $iter { 82 @if $add == 0 { 83 $value: $value - ( exponent($number, $key) / factorial($key) ); 84 $add: 1; 85 } 86 @else { 87 $value: $value + ( exponent($number, $key) / factorial($key) ); 88 $add: 0; 89 } 90 91 $key: $key + 2; 92 } 93 94 @return $value; 95} 96// Taylor series can be used to estiamte ln 97@function taylor($number) { 98 @return taylor; 99} 100 101////////////////////////////// 102// Basic Trig Functions 103////////////////////////////// 104// Bundled in Compass: http://compass-style.org/reference/compass/helpers/trig/ 105// References for implementing using MacLaurin series below: 106 107//@function sin($number, $unit: 'deg') { 108// @if $unit == 'deg' { 109// $number: deg-to-rad($number); 110// } 111// @return maclaurin($number, 3, $number); 112//} 113// 114//@function cos($number, $unit: 'deg') { 115// @if $unit == 'deg' { 116// $number: deg-to-rad($number); 117// } 118// @return maclaurin(1, 2, $number); 119//} 120// 121//// Trig Identity: Tangent = Sine divided by Cosine. 122//@function tan($number, $unit: 'deg') { 123// @if $unit == 'deg' { 124// $number: deg-to-rad($number); 125// } 126// @return sin($number) / cos($number); 127//} 128 129////////////////////////////// 130// Reciprocal Trig Functions 131////////////////////////////// 132@function csc($number, $unit: 'deg') { 133 @if $unit == 'deg' { 134 $number: deg-to-rad($number); 135 } 136 @return 1 / sin($number); 137} 138 139@function scs($number, $unit: 'deg') { 140 @if $unit == 'deg' { 141 $number: deg-to-rad($number); 142 } 143 @return 1 / cos($number); 144} 145 146@function cot($number, $unit: 'deg') { 147 @if $unit == 'deg' { 148 $number: deg-to-rad($number); 149 } 150 @return 1 / tan($number); 151} 152 153////////////////////////////// 154// Hyperbolic Functions 155////////////////////////////// 156@function sinh($number) { 157 $top: exponent($e, (2 * $number)) - 1; 158 $bottom: 2 * exponent($e, $number); 159 @return $top / $bottom; 160} 161 162@function cosh($number) { 163 $top: exponent($e, (2 * $number)) + 1; 164 $bottom: 2 * exponent($e, $number); 165 @return $top / $bottom; 166} 167 168@function tanh($number) { 169 $top: exponent($e, (2 * $number)) - 1; 170 $bottom: exponent($e, (2 * $number)) + 1; 171 @return $top / $bottom; 172} 173 174////////////////////////////// 175// Reciprocal Hyperbolic Functions 176////////////////////////////// 177@function csch($number) { 178 @return 1 / sinh($number); 179} 180 181@function sech($number) { 182 @return 1 / cosh($number); 183} 184 185@function coth($number) { 186 @return 1/ tanh($number); 187} 188 189 190@function log($number) { 191 @return $number; 192} 193 194@function ln($number) { 195 @if $number > 0 and $number < 1 { 196 $value: 0; 197 @for $i from 1 through $iter { 198 $value: $value + ( pow(-1, $i) * pow(-1 * (1 - $number), $i)) / $i; 199 } 200 $value: -1 * $value; 201 202 @return $value; 203 } 204 @else if $number == 1 { 205 @return 0; 206 } 207 @else { 208 @return ERROR; 209 @warn ln input must be greater than zero and less than or equal to 1; 210 } 211} 212 213 214////////////////////////////// 215// Degree/Radian Conversion 216////////////////////////////// 217@function deg-to-rad($number) { 218 @return $number * $pi / 180deg; 219} 220 221@function rad-to-deg($number) { 222 @return $number * 180deg / $pi; 223} 224 225////////////////////////////// 226// Root Functions 227////////////////////////////// 228// Basic General-Purpose Root Function 229@function n-root($number, $n) { 230 @if $number < 1 { 231 @return ERROR; 232 @warn ROOT ERROR; 233 } 234 // If a whole number, generate it quickly 235 @for $i from 1 through $number { 236 @if exponent($i, $n) == $number { 237 @return $i; 238 } 239 } 240 // Else, run through other options 241 @for $i from 1 through $number * 1000 / 2 { 242 @if round(exponent($i / 1000, $n) * 100) == round($number * 100) { 243 @return $i / 1000; 244 } 245 } 246} 247 248@function root($number, $n) { 249 @return n-root($number, $n); 250} 251 252// Square Roots 253@function √($number) { 254 @return sqrt($number); 255} 256 257@function sqrt($number) { 258 $guess: rand(); 259 $root: $guess; 260 @for $i from 1 through $iter { 261 $root: $root - (pow($root, 2) - $number) / (2 * $root); 262 } 263 @return $root; 264} 265 266////////////////////////////// 267// Golden Ratio 268////////////////////////////// 269@function golden() { 270 @return 1/2 + sqrt(5) / 2; 271} 272@function ϕ() { 273 @return golden(); 274} 275 276$golden-ratio: golden(); 277$ϕ: $golden-ratio; 278 279////////////////////////////// 280// Is Int and Is Float 281////////////////////////////// 282@function is-int($number) { 283 @if type-of($number) != 'number' { 284 @warn '#{$number} is not a number! It cannot be an integer if it is not a number!'; 285 @return false; 286 } 287 @if $number - floor($number) != 0 { 288 @return false; 289 } 290 @else { 291 @return true; 292 } 293} 294 295@function is-float($number) { 296 @if type-of($number) != 'number' { 297 @warn '#{$number} is not a number! It cannot be an decimal if it is not a number!'; 298 @return false; 299 } 300 @if $number - floor($number) != 0 { 301 @return true; 302 } 303 @else { 304 @return false; 305 } 306} 307 308@function is-decimal($number) { 309 @return is-float($number); 310}