通过three.js向量Vector3点乘方法.dot()判断一个点(物体)是否在人前方的扇形范围内。
已知条件如图中的坐标
余弦值的规律 -90到90度角度越小cos值越大,因此cos的值大于人到mid与人到b的cos值,且点到人的距离小于扇形的半径时则在扇形内
具体实现和相应的注释如下
const inSector = (point)=>{
const a = new THREE.Vector3(0, 2, 0);
const b = new THREE.Vector3(2, 2, 0);
const person = new THREE.Vector3(1, 0, 0);
// 计算abMid的中点
const abMid = a.clone().add(b).multiplyScalar(0.5);
// abMid到person的方向向量
const abMidToPersonDir = abMid.clone().sub(person).normalize();
// person到a和b的夹角
const apersonangle = a.clone().sub(person).normalize().dot(abMidToPersonDir);
// 点到人的向量
const pointPerson = point.clone().sub(person);
let ins = false;
// 半径长度
const r = abMid.clone().sub(person).length();
// 点到人的长度
const pointlength = pointPerson.length();
// 如果点到人的长度大于半径长度,则不在扇形内
if(pointlength > r){
ins = false;
}else{
// 点乘返回的是cos,cos的特性扇形夹角小于180是
const angle = pointPerson.clone().normalize().dot(abMidToPersonDir);
if(angle > apersonangle){
ins = true;
}else{
ins = false;
}
}
return ins;
}
console.log(inSector(new THREE.Vector3(1,3,0)))