5.0.0 • Published 10 years ago

linear-conversion v5.0.0

Weekly downloads
2
License
MIT
Repository
github
Last release
10 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

10 years ago

4.0.2

10 years ago

4.0.1

10 years ago

4.0.0

10 years ago

3.0.1

10 years ago

3.0.0

10 years ago

2.1.1

10 years ago

2.1.0

10 years ago

2.0.4

10 years ago

2.0.3

10 years ago

2.0.2

10 years ago

2.0.1

10 years ago

2.0.0

10 years ago

1.0.1

10 years ago

1.0.0

10 years ago