"use strict";
var _ = require("lodash");
var Tracker = require("./Tracker.js");
var MATRIX = require("gl-matrix");
/**
* @class View3D.LineBasedRectTracker
* @extend Tracker
* 基于线的矩形tracker
*
* 可用于绘制矩形时展现绘制的动态效果
*/
function LineBasedRectTracker(objectID) {
this.objectID = objectID;
};
LineBasedRectTracker.prototype = _.create(Tracker.prototype, {
constructor: LineBasedRectTracker
});
/**
* 根据起始线和另外一个不在线上的点计算出矩形对应的四个点
*
* @param {Object} baseLine 矩形的起始边
* @param {vec3} baseLine.startPt 矩形起始边的起点
* @param {vec3} baseLine.endPt 矩形起始边的终点
* @param {vec3} point 不在线上的另外一个点
*
* @return {vec3[]} 矩形的四个顶点的点组
*/
LineBasedRectTracker.prototype.calcRectPts = function(baseLine, point){
var lineEndPt = baseLine.endPt;
var lineStartPt = baseLine.startPt;
var startLineDir = MATRIX.vec3.create();
startLineDir = MATRIX.vec3.sub(startLineDir, lineEndPt, lineStartPt); //e - s
startLineDir = MATRIX.vec3.normalize(startLineDir, startLineDir);
var thirdPt = point;
var thirdDir = MATRIX.vec3.create();
thirdDir = MATRIX.vec3.sub(thirdDir, thirdPt, lineEndPt); //t - s
var thirdLength = MATRIX.vec3.length(thirdDir);
thirdDir = MATRIX.vec3.normalize(thirdDir, thirdDir);
var dot = MATRIX.vec3.dot(startLineDir, thirdDir); //startLineDir * thirdDir;
var norm = MATRIX.vec3.create();
norm = MATRIX.vec3.cross(norm, startLineDir, thirdDir);
var offsetDir = MATRIX.vec3.create();
offsetDir = MATRIX.vec3.cross(offsetDir, norm, startLineDir);
offsetDir = MATRIX.vec3.normalize(offsetDir, offsetDir);
var cosa = MATRIX.vec3.dot(thirdDir, offsetDir);
var offsetLength = thirdLength * cosa;
var offsetMove = MATRIX.vec3.create();
offsetMove = MATRIX.vec3.scale(offsetMove, offsetDir, offsetLength);
var rectPts = [];
rectPts.push(lineStartPt);
rectPts.push(lineEndPt);
var movedStartPt = MATRIX.vec3.create();
movedStartPt = MATRIX.vec3.add(movedStartPt, lineStartPt, offsetMove);
var movedEndPt = MATRIX.vec3.create();
movedEndPt = MATRIX.vec3.add(movedEndPt, lineEndPt, offsetMove);
rectPts.push(movedEndPt);
rectPts.push(movedStartPt);
return rectPts;
};
module.exports = LineBasedRectTracker;