StackGenVis: Alignment of Data, Algorithms, and Models for Stacking Ensemble Learning Using Performance Metrics
https://doi.org/10.1109/TVCG.2020.3030352
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.2 KiB
50 lines
1.2 KiB
var vecDot = require('gl-vec3/dot')
|
|
var vecCross = require('gl-vec3/cross')
|
|
var vecLength = require('gl-vec3/length')
|
|
var vecNormalize = require('gl-vec3/normalize')
|
|
|
|
var quatNormalize = require('./normalize')
|
|
var quatAxisAngle = require('./setAxisAngle')
|
|
|
|
module.exports = rotationTo
|
|
|
|
var tmpvec3 = [0, 0, 0]
|
|
var xUnitVec3 = [1, 0, 0]
|
|
var yUnitVec3 = [0, 1, 0]
|
|
|
|
/**
|
|
* Sets a quaternion to represent the shortest rotation from one
|
|
* vector to another.
|
|
*
|
|
* Both vectors are assumed to be unit length.
|
|
*
|
|
* @param {quat} out the receiving quaternion.
|
|
* @param {vec3} a the initial vector
|
|
* @param {vec3} b the destination vector
|
|
* @returns {quat} out
|
|
*/
|
|
function rotationTo (out, a, b) {
|
|
var dot = vecDot(a, b)
|
|
if (dot < -0.999999) {
|
|
vecCross(tmpvec3, xUnitVec3, a)
|
|
if (vecLength(tmpvec3) < 0.000001) {
|
|
vecCross(tmpvec3, yUnitVec3, a)
|
|
}
|
|
vecNormalize(tmpvec3, tmpvec3)
|
|
quatAxisAngle(out, tmpvec3, Math.PI)
|
|
return out
|
|
} else if (dot > 0.999999) {
|
|
out[0] = 0
|
|
out[1] = 0
|
|
out[2] = 0
|
|
out[3] = 1
|
|
return out
|
|
} else {
|
|
vecCross(tmpvec3, a, b)
|
|
out[0] = tmpvec3[0]
|
|
out[1] = tmpvec3[1]
|
|
out[2] = tmpvec3[2]
|
|
out[3] = 1 + dot
|
|
return quatNormalize(out, out)
|
|
}
|
|
}
|
|
|