1
0
Fork 0
mirror of https://github.com/kidoman/embd synced 2025-07-03 20:07:40 +02:00

initial commit

This commit is contained in:
Karan Misra 2014-03-31 06:33:08 +05:30
commit b3bad4e383
114 changed files with 14939 additions and 0 deletions

View file

@ -0,0 +1,159 @@
require 'compass'
Compass::Frameworks.register("sassy-math", :path => "#{File.dirname(__FILE__)}/..")
# Sassy math Functions
module Sass::Script::Functions
# Exponents
def exponent(base, powerNum, powerDen)
base = base.value.to_f
powerNum = powerNum.value.to_f
powerDen = powerDen.value.to_f
result = base ** (powerNum / powerDen)
Sass::Script::Number.new(result)
end
def power(base, exponent)
base = base.value.to_f
exponent = exponent.value.to_f
result = base ** exponent
Sass::Script::Number.new(result)
end
def sqrt(number)
number = number.value.to_f
result = Math.sqrt(number)
Sass::Script::Number.new(result)
end
def nth_root(number, root)
number = number.value.to_f
root = root.value.to_f
result = number ** (1.0 / root)
Sass::Script::Number.new(result)
end
# Logarithms
def ln(num)
result = Math.log(num.value)
Sass::Script::Number.new(result)
end
def log10(num)
result = Math.log10(num.value)
Sass::Script::Number.new(result)
end
# Miscellaneous
def factorial(number)
result = 1
number = number.value
if number > 0
(1..number).each do |i|
result = result * i
end
end
Sass::Script::Number.new(result)
end
def random(max = Sass::Script::Number.new(100)) ## shamelessly taken from here: https://gist.github.com/1561650
Sass::Script::Number.new(rand(max.value), max.numerator_units, max.denominator_units)
end
def hypot(a, b)
a = a.value.to_f
b = b.value.to_f
result = Math.hypot(a, b)
Sass::Script::Number.new(result)
end
# Constants
def pi
pi = Math::PI
Sass::Script::Number.new(pi)
end
def e
e = Math::E
Sass::Script::Number.new(e)
end
def golden_ratio()
result = (1.0 / 2.0) + (Math.sqrt(5) / 2.0)
Sass::Script::Number.new(result)
end
# Comparative Functions
def is_int(number)
number = number.value.to_f
if number - number.floor != 0
result = false
else
result = true
end
Sass::Script::Bool.new(result)
end
def is_float(number)
number = number.value
if number - number.floor != 0
result = true
else
result = false
end
Sass::Script::Bool.new(result)
end
# Trigonometric Functions
def deg_to_rad(degree)
result = degree.value.to_f * Math::PI / 180
Sass::Script::Number.new(result)
end
def rad_to_deg(rad)
result = rad.value.to_f * 180 / Math::PI
Sass::Script::Number.new(result)
end
def cosh(rad)
rad = rad.value.to_f
result = Math.cosh(rad)
Sass::Script::Number.new(result)
end
def acos(rad)
rad = rad.value.to_f
result = Math.acos(rad)
Sass::Script::Number.new(result)
end
def acosh(rad)
rad = rad.value.to_f
result = Math.acosh(rad)
Sass::Script::Number.new(result)
end
def sinh(rad)
rad = rad.value.to_f
result = Math.sinh(rad)
Sass::Script::Number.new(result)
end
def asin(rad)
rad = rad.value.to_f
result = Math.asin(rad)
Sass::Script::Number.new(result)
end
def asinh(rad)
rad = rad.value.to_f
result = Math.asinh(rad)
Sass::Script::Number.new(result)
end
def tanh(rad)
rad = rad.value.to_f
result = Math.tanh(rad)
Sass::Script::Number.new(result)
end
def atan(rad)
rad = rad.value.to_f
result = Math.atan(rad)
Sass::Script::Number.new(result)
end
def atan2(y, x)
y = y.value.to_f
x = x.value.to_f
result = Math.atan2(y, x)
Sass::Script::Number.new(result)
end
def atanh(rad)
rad = rad.value.to_f
result = Math.atanh(rad)
Sass::Script::Number.new(result)
end
end
module SassyMath
VERSION = "1.5"
DATE = "2012-07-29"
end

View file

@ -0,0 +1,310 @@
// 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);
}