UNPKG

clay-core

Version:

Provide a more friendly web-side drawing interface!

55 lines (44 loc) 1.94 kB
// 针对任意射线(a1,b1,c1)->(a2,b2,c2) // 计算出二个变换矩阵 // 分别为:任意射线变成OZ轴变换矩阵 + OZ轴变回原来的射线的变换矩阵 var _transform = function (a1, b1, c1, a2, b2, c2) { if (_is_number(a1) && _is_number(b1)) { // 如果设置二个点 // 表示二维上围绕某个点旋转 if (!_is_number(c1)) { c1 = 0; a2 = a1; b2 = b1; c2 = 1; } // 只设置三个点(设置不足六个点都认为只设置了三个点) // 表示围绕从原点出发的射线旋转 else if (!_is_number(a2) || !_is_number(b2) || !_is_number(c2)) { a2 = a1; b2 = b1; c2 = c1; a1 = 0; b1 = 0; c1 = 0; } if (a1 == a2 && b1 == b2 && c1 == c2) throw new Error('It\'s not a legitimate ray!'); var sqrt1 = Math.sqrt((a2 - a1) * (a2 - a1) + (b2 - b1) * (b2 - b1)), cos1 = sqrt1 != 0 ? (b2 - b1) / sqrt1 : 1, sin1 = sqrt1 != 0 ? (a2 - a1) / sqrt1 : 0, b = (a2 - a1) * sin1 + (b2 - b1) * cos1, c = c2 - c1, sqrt2 = Math.sqrt(b * b + c * c), cos2 = sqrt2 != 0 ? c / sqrt2 : 1, sin2 = sqrt2 != 0 ? b / sqrt2 : 0; return [ // 任意射线变成OZ轴变换矩阵 [ cos1, cos2 * sin1, sin1 * sin2, 0, -sin1, cos1 * cos2, cos1 * sin2, 0, 0, -sin2, cos2, 0, b1 * sin1 - a1 * cos1, c1 * sin2 - a1 * sin1 * cos2 - b1 * cos1 * cos2, -a1 * sin1 * sin2 - b1 * cos1 * sin2 - c1 * cos2, 1 ], // OZ轴变回原来的射线的变换矩阵 [ cos1, -sin1, 0, 0, cos2 * sin1, cos2 * cos1, -sin2, 0, sin1 * sin2, cos1 * sin2, cos2, 0, a1, b1, c1, 1 ] ]; } else { throw new Error('a1 and b1 is required!'); } };