mirror of
https://github.com/kidoman/embd
synced 2025-02-10 04:33:19 +01:00
310 lines
6.4 KiB
SCSS
Executable File
310 lines
6.4 KiB
SCSS
Executable File
// SASSY MATH
|
|
|
|
@charset "UTF-8";
|
|
|
|
//////////////////////////////
|
|
// Variables
|
|
//////////////////////////////
|
|
$pi: 3.1415926535897932384626433832795028841971693993751;
|
|
$π: $pi;
|
|
$e: 2.71828182845904523536028747135266249775724709369995;
|
|
|
|
$iter: 50;
|
|
|
|
//////////////////////////////
|
|
// Random Number
|
|
// Working from http://xkcd.com/221/
|
|
// Chosen by fair dice roll.
|
|
// Guarenteed to be random.
|
|
//////////////////////////////
|
|
@function rand() {
|
|
@return 4;
|
|
}
|
|
|
|
//////////////////////////////
|
|
// Percent
|
|
//////////////////////////////
|
|
@function percent($number) {
|
|
@return $number * 0.01;
|
|
}
|
|
|
|
//////////////////////////////
|
|
// Exponent
|
|
//////////////////////////////
|
|
@function exponent($base, $exponent) {
|
|
// reset value
|
|
$value: $base;
|
|
// positive intergers get multiplied
|
|
@if $exponent > 1 {
|
|
@for $i from 2 through $exponent {
|
|
$value: $value * $base; } }
|
|
// negitive intergers get divided. A number divided by itself is 1
|
|
@if $exponent < 1 {
|
|
@for $i from 0 through -$exponent {
|
|
$value: $value / $base; } }
|
|
// return the last value written
|
|
@return $value;
|
|
}
|
|
|
|
@function pow($base, $exponent) {
|
|
@return exponent($base, $exponent);
|
|
}
|
|
|
|
//////////////////////////////
|
|
// Factorial
|
|
//////////////////////////////
|
|
@function factorial($number) {
|
|
// reset value
|
|
$value: 1;
|
|
// positive intergers get multiplied
|
|
@if $number > 0 {
|
|
@for $i from 1 through $number {
|
|
$value: $value * $i;
|
|
}
|
|
}
|
|
@return $value;
|
|
}
|
|
|
|
@function fact($number) {
|
|
@return factorial($number);
|
|
}
|
|
|
|
|
|
//////////////////////////////
|
|
// Polynomial Approximation
|
|
//////////////////////////////
|
|
// Maclaurin series can be used to estimate Sine and Consine
|
|
@function maclaurin($start, $key, $number) {
|
|
$value: $start;
|
|
$add: 0;
|
|
|
|
@for $i from 1 through $iter {
|
|
@if $add == 0 {
|
|
$value: $value - ( exponent($number, $key) / factorial($key) );
|
|
$add: 1;
|
|
}
|
|
@else {
|
|
$value: $value + ( exponent($number, $key) / factorial($key) );
|
|
$add: 0;
|
|
}
|
|
|
|
$key: $key + 2;
|
|
}
|
|
|
|
@return $value;
|
|
}
|
|
// Taylor series can be used to estiamte ln
|
|
@function taylor($number) {
|
|
@return taylor;
|
|
}
|
|
|
|
//////////////////////////////
|
|
// Basic Trig Functions
|
|
//////////////////////////////
|
|
// Bundled in Compass: http://compass-style.org/reference/compass/helpers/trig/
|
|
// References for implementing using MacLaurin series below:
|
|
|
|
//@function sin($number, $unit: 'deg') {
|
|
// @if $unit == 'deg' {
|
|
// $number: deg-to-rad($number);
|
|
// }
|
|
// @return maclaurin($number, 3, $number);
|
|
//}
|
|
//
|
|
//@function cos($number, $unit: 'deg') {
|
|
// @if $unit == 'deg' {
|
|
// $number: deg-to-rad($number);
|
|
// }
|
|
// @return maclaurin(1, 2, $number);
|
|
//}
|
|
//
|
|
//// Trig Identity: Tangent = Sine divided by Cosine.
|
|
//@function tan($number, $unit: 'deg') {
|
|
// @if $unit == 'deg' {
|
|
// $number: deg-to-rad($number);
|
|
// }
|
|
// @return sin($number) / cos($number);
|
|
//}
|
|
|
|
//////////////////////////////
|
|
// Reciprocal Trig Functions
|
|
//////////////////////////////
|
|
@function csc($number, $unit: 'deg') {
|
|
@if $unit == 'deg' {
|
|
$number: deg-to-rad($number);
|
|
}
|
|
@return 1 / sin($number);
|
|
}
|
|
|
|
@function scs($number, $unit: 'deg') {
|
|
@if $unit == 'deg' {
|
|
$number: deg-to-rad($number);
|
|
}
|
|
@return 1 / cos($number);
|
|
}
|
|
|
|
@function cot($number, $unit: 'deg') {
|
|
@if $unit == 'deg' {
|
|
$number: deg-to-rad($number);
|
|
}
|
|
@return 1 / tan($number);
|
|
}
|
|
|
|
//////////////////////////////
|
|
// Hyperbolic Functions
|
|
//////////////////////////////
|
|
@function sinh($number) {
|
|
$top: exponent($e, (2 * $number)) - 1;
|
|
$bottom: 2 * exponent($e, $number);
|
|
@return $top / $bottom;
|
|
}
|
|
|
|
@function cosh($number) {
|
|
$top: exponent($e, (2 * $number)) + 1;
|
|
$bottom: 2 * exponent($e, $number);
|
|
@return $top / $bottom;
|
|
}
|
|
|
|
@function tanh($number) {
|
|
$top: exponent($e, (2 * $number)) - 1;
|
|
$bottom: exponent($e, (2 * $number)) + 1;
|
|
@return $top / $bottom;
|
|
}
|
|
|
|
//////////////////////////////
|
|
// Reciprocal Hyperbolic Functions
|
|
//////////////////////////////
|
|
@function csch($number) {
|
|
@return 1 / sinh($number);
|
|
}
|
|
|
|
@function sech($number) {
|
|
@return 1 / cosh($number);
|
|
}
|
|
|
|
@function coth($number) {
|
|
@return 1/ tanh($number);
|
|
}
|
|
|
|
|
|
@function log($number) {
|
|
@return $number;
|
|
}
|
|
|
|
@function ln($number) {
|
|
@if $number > 0 and $number < 1 {
|
|
$value: 0;
|
|
@for $i from 1 through $iter {
|
|
$value: $value + ( pow(-1, $i) * pow(-1 * (1 - $number), $i)) / $i;
|
|
}
|
|
$value: -1 * $value;
|
|
|
|
@return $value;
|
|
}
|
|
@else if $number == 1 {
|
|
@return 0;
|
|
}
|
|
@else {
|
|
@return ERROR;
|
|
@warn ln input must be greater than zero and less than or equal to 1;
|
|
}
|
|
}
|
|
|
|
|
|
//////////////////////////////
|
|
// Degree/Radian Conversion
|
|
//////////////////////////////
|
|
@function deg-to-rad($number) {
|
|
@return $number * $pi / 180deg;
|
|
}
|
|
|
|
@function rad-to-deg($number) {
|
|
@return $number * 180deg / $pi;
|
|
}
|
|
|
|
//////////////////////////////
|
|
// Root Functions
|
|
//////////////////////////////
|
|
// Basic General-Purpose Root Function
|
|
@function n-root($number, $n) {
|
|
@if $number < 1 {
|
|
@return ERROR;
|
|
@warn ROOT ERROR;
|
|
}
|
|
// If a whole number, generate it quickly
|
|
@for $i from 1 through $number {
|
|
@if exponent($i, $n) == $number {
|
|
@return $i;
|
|
}
|
|
}
|
|
// Else, run through other options
|
|
@for $i from 1 through $number * 1000 / 2 {
|
|
@if round(exponent($i / 1000, $n) * 100) == round($number * 100) {
|
|
@return $i / 1000;
|
|
}
|
|
}
|
|
}
|
|
|
|
@function root($number, $n) {
|
|
@return n-root($number, $n);
|
|
}
|
|
|
|
// Square Roots
|
|
@function √($number) {
|
|
@return sqrt($number);
|
|
}
|
|
|
|
@function sqrt($number) {
|
|
$guess: rand();
|
|
$root: $guess;
|
|
@for $i from 1 through $iter {
|
|
$root: $root - (pow($root, 2) - $number) / (2 * $root);
|
|
}
|
|
@return $root;
|
|
}
|
|
|
|
//////////////////////////////
|
|
// Golden Ratio
|
|
//////////////////////////////
|
|
@function golden() {
|
|
@return 1/2 + sqrt(5) / 2;
|
|
}
|
|
@function ϕ() {
|
|
@return golden();
|
|
}
|
|
|
|
$golden-ratio: golden();
|
|
$ϕ: $golden-ratio;
|
|
|
|
//////////////////////////////
|
|
// Is Int and Is Float
|
|
//////////////////////////////
|
|
@function is-int($number) {
|
|
@if type-of($number) != 'number' {
|
|
@warn '#{$number} is not a number! It cannot be an integer if it is not a number!';
|
|
@return false;
|
|
}
|
|
@if $number - floor($number) != 0 {
|
|
@return false;
|
|
}
|
|
@else {
|
|
@return true;
|
|
}
|
|
}
|
|
|
|
@function is-float($number) {
|
|
@if type-of($number) != 'number' {
|
|
@warn '#{$number} is not a number! It cannot be an decimal if it is not a number!';
|
|
@return false;
|
|
}
|
|
@if $number - floor($number) != 0 {
|
|
@return true;
|
|
}
|
|
@else {
|
|
@return false;
|
|
}
|
|
}
|
|
|
|
@function is-decimal($number) {
|
|
@return is-float($number);
|
|
} |