UNPKG

dltjs

Version:

A package for computing Direct Linear Transformation matrix.

71 lines (55 loc) 1.88 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _mathjs = require('mathjs'); var _mathjs2 = _interopRequireDefault(_mathjs); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * See this paper for more about DLT. * https://www.cs.ubc.ca/grads/resources/thesis/May09/Dubrofsky_Elan.pdf */ var dltjs = { /** * Create transformation matrix from given point pairs. * @param {array} p0 Original points. At least 4 points must be given. * @param {array} p1 Transformed points. At least 4 points must be given. */ dlt2d: function dlt2d(p0, p1) { if (p0.length < 4 || p1.length < 4) { throw new Error('At least 4 point pairs must be given.'); } var H = [], B = []; for (var i = 0; i < 4; i++) { var _ref = [p0[i][0], p0[i][1], p1[i][0], p1[i][1]], x = _ref[0], y = _ref[1], u = _ref[2], v = _ref[3]; H.push([x, y, 1, 0, 0, 0, -x * u, -y * u]); H.push([0, 0, 0, x, y, 1, -x * v, -y * v]); B.push(u); B.push(v); } var M = _mathjs2.default.lusolve(H, B); M = _mathjs2.default.reshape(M, [8]); M.push(1); return _mathjs2.default.reshape(M, [3, 3]); }, /** * Transform point p with matrix M. * @param {array} M 3x3 matrix. * @param {array} p point with format of [x, y]. */ transform2d: function transform2d(M, p) { if (M[2][2] !== 1) { M = _mathjs2.default.divide(M, M[2][2]); } var p0 = [p[0], p[1], 1]; var p1 = _mathjs2.default.multiply(M, p0); p1 = _mathjs2.default.divide(p1, p1[2]); return [p1[0], p1[1]]; } }; exports.default = dltjs;