import {Vector3} from './Vector3';
//==========================================================
// 三维坐标。
//
// @struct
// @param x:Number X坐标
// @param y:Number Y坐标
// @param z:Number Z坐标
// @author maocy
// @version 141230
//==========================================================
export class Point3 extends Vector3 {
//============================================================
// 获得反方向。
//
// @method
// @param p:value:SQuaternion 四元数
// @return SQuaternion 四元数
//============================================================
public conjugate(p) {
var o = this;
var r = null;
if (p) {
r = p;
} else {
r = new Point3();
}
r.x = -o.x;
r.y = -o.y;
r.z = -o.z;
return r;
}
//============================================================
// 合并最小值。
//
// @method
// @param p:value:SPoint3 三维点
//============================================================
public mergeMin(p) {
var o = this;
o.x = Math.min(o.x, p.x);
o.y = Math.min(o.y, p.y);
o.z = Math.min(o.z, p.z);
}
//============================================================
// 合并最小值。
//
// @method
// @param x:Number X坐标
// @param y:Number Y坐标
// @param z:Number Z坐标
//============================================================
public mergeMin3(x, y, z) {
var o = this;
o.x = Math.min(o.x, x);
o.y = Math.min(o.y, y);
o.z = Math.min(o.z, z);
}
//============================================================
// 合并最大值。
//
// @method
// @param p:value:SPoint3 三维点
//============================================================
public mergeMax(p) {
var o = this;
o.x = Math.max(o.x, p.x);
o.y = Math.max(o.y, p.y);
o.z = Math.max(o.z, p.z);
}
//============================================================
// 合并最大值。
//
// @method
// @param x:Number X坐标
// @param y:Number Y坐标
// @param z:Number Z坐标
//============================================================
public mergeMax3(x, y, z) {
var o = this;
o.x = Math.max(o.x, x);
o.y = Math.max(o.y, y);
o.z = Math.max(o.z, z);
}
//==========================================================
// 修改坐标偏移。
//
//
// @method
// @param x:Integer X坐标
// @param y:Integer Y坐标
// @param z:Integer Z坐标
//==========================================================
public resize(x, y, z) {
var o = this;
if (x != null) {
o.x += x;
}
if (y != null) {
o.y += y;
}
if (z != null) {
o.z += z;
}
}
//==========================================================
// 根据方向移动坐标。
//
//
// @method
// @param direction:SVector3 方向
// @param length:Float 长度
//==========================================================
public moveTo(direction, length) {
var o = this;
o.x += direction.x * length;
o.y += direction.y * length;
o.z += direction.z * length;
}
//==========================================================
// 计算插值。
//
// @method
// @param v1:value1:SPoint3 开始坐标
// @param v2:value2:SPoint3 结束坐标
// @param r:rate:Float 比率
//==========================================================
public slerp(v1, v2, r) {
var o = this;
o.x = (v2.x - v1.x) * r + v1.x;
o.y = (v2.y - v1.y) * r + v1.y;
o.z = (v2.z - v1.z) * r + v1.z;
}
}