使用three.js我需要得到几乎相等(在'模糊'内)的网格点到计算点。此计算点不是THREE.Vector2 / 3,它是具有x y属性的通用对象。 函数/方法由递归函数和“实时”过程使用,这就是为什么必须对其进行优化。
我发现的最简单的表达方式如下。让我们说这是一个2D点,我提供了一个数组(geometry.vertices),并且不需要计算距离:
function IndexOfPoint ( pt, lst ) {
var i = -1;
var test = lst.some( function ( p ) {
i++;
return ( Math.abs( p.x - pt.x ) < 1E-12 ) && ( Math.abs( p.y - pt.y ) < 1E-12 );
});
return test? i: -1;
}
它有效,但我很快就做到了,并且想知道是否有最好和最快的方法...(请不要额外的库,只有普通的js)
提前致谢
答案 0 :(得分:0)
对我来说很好。您可以跳过索引var i上的增量,因为当前索引已作为第二个参数提供给回调,如Array.prototype.some中所示(函数(元素,索引,数组){...}):< / p>
function IndexOfPoint ( pt, lst ) {
var i = -1;
lst.some( function ( p, idx ) {
if ( ( Math.abs( p.x - pt.x ) < 1E-12 ) && ( Math.abs( p.y - pt.y ) < 1E-12 ) ) {
i = idx;
return true;
}
else {
return false;
}
});
return i;
}
答案 1 :(得分:0)
我不熟悉three.js,但是如果对列表进行排序并且网格是统一的,那么您可以立即获得最接近向量的索引并简单地测试该索引。例如:
function IndexOfPoint (pt, list) {
// assuming the list of points is sorted going from left to right, top to bottom
var index = Math.floor((pt.x - offsetX) * scaleX) + gridWidth * Math.floor((pt.y - offsetY) * scaleY);
var candidatePoint = list[index];
if (candidatePoint && (Math.abs(pt.x - candidatePoint.x) < 1E-12) && (Math.abs(pt.y - candidatePoint.y) < 1E-12) {
return index;
} else {
return -1;
}
}