5.0.0 • Published 8 years ago

linear-conversion v5.0.0

Weekly downloads
2
License
MIT
Repository
github
Last release
8 years ago

linear-conversion

Build Status Coverage Status Code Climate

Linear conversion class for linear-converter

Install

npm i linear-conversion

Basic usage

var Decimal = require('linear-arbitrary-precision')(require('floating-adapter'));
var lc = require('linear-converter')(Decimal);
var LinearConversion = require('linear-conversion')(lc);

// using linear-presets@1.x
var temp = require('linear-presets').PRESETS.temperature;

var celsiusToFahrenheit = new LinearConversion(temp.celsiusToFahrenheit);

celsiusToFahrenheit.convert(25); // => new Decimal('77')

See CodePen example for a quick interactive intro.

A simpler (although less flexible) setup is possible using linear-converter-to-go:

var lc = require('linear-converter-to-go');
var LinearConversion = require('linear-conversion')(lc);

// notice that in this case, the presets for common units are bundled
// linear-presets@3.x or higher
var temp = lc.PRESETS.temperature;

Conversion inversion

var fahrenheitToCelsius = celsiusToFahrenheit.invert();

fahrenheitToCelsius.convert(77); // => 25 (as decimal)

Conversion composition

var celsiusToKelvin = new LinearConversion(temp.celsiusToKelvin);
var kelvinToFahrenheit = celsiusToKelvin.invert().compose(celsiusToFahrenheit);

kelvinToFahrenheit.convert(293.15); // => 68 (as decimal)

Custom conversions

Custom conversions are achieved by passing an array with 2 scales, each of those an array with 2 values. For example, [0, 1, 0, 2] means that 0 and 1 in the first scale map to 0 and 2 in the second scale respectively; in short, it multiplies by 2. Any linear conversion can be described that way:

// f(x) = ax + b
(new LinearConversion([[0, 1], [b, a+b]])).convert(x); // => ax + b
(new LinearConversion([[1/a, -b/a], [b+1, 0]])).convert(x); // => ax + b

For an arbitrary f(x) = ax + b, any [x1, x2, f(x1), f(x2)] is a valid preset.

More examples:

// degrees to radians
(new LinearConversion([[0, 180], [0, Math.PI]])).convert(240); // => 4 * Math.PI / 3

// f(x) = 3x
(new LinearConversion([[0, 1/3], [0, 1]])).convert(5); // => 15

// f(x) = -2x - 46
(new LinearConversion([[0, 1], [-46, -48]])).convert(-23); // => 0

Coefficients

// f(x) = 2x + 1
var doublePlus1 = new LinearConversion([[0, 1], [1, 3]]);

doublePlus1.getCoefficientA(); // => 2
doublePlus1.getCoefficientB(); // => 1

// f(x) = ax + b
var timesAPlusB = new LinearConversion([[x1, x2], [f(x1), f(x2)]]);

timesAPlusB.getCoefficientA(); // => a
timesAPlusB.getCoefficientB(); // => b

Preset equivalence

var eq = new LinearConversion([[1, 5], [3, -9]]);

eq.equates(new LinearConversion([[-1, 100], [9, -294]])); // => true (both f(x) = -3x + 6)


var notEq = new LinearConversion([[0, 1], [0, 2]]); // f(x) = 2x

notEq.equates(new LinearConversion([[0, 1], [0, 3]])); // => false (new one is f(x) = 3x)

Arbitrary precision

Arbitrary precision support is provided via linear-arbitrary-precision. See all available adapters.

var doublePlusPoint1 = new LinearConversion([[0, 0.1], [0.1, 0.3]]);

// without arbitrary precision adapters
doublePlusPoint1.getCoefficientA(); // => 1.9999999999999998

// with arbitrary precision adapters
doublePlusPoint1.getCoefficientA(); // => 2

See CodePen example.

See more

Related projects

5.0.0

8 years ago

4.0.2

9 years ago

4.0.1

9 years ago

4.0.0

9 years ago

3.0.1

9 years ago

3.0.0

9 years ago

2.1.1

9 years ago

2.1.0

9 years ago

2.0.4

9 years ago

2.0.3

9 years ago

2.0.2

9 years ago

2.0.1

9 years ago

2.0.0

9 years ago

1.0.1

9 years ago

1.0.0

9 years ago