得到几乎相等的点(一种IndexOfPoint方法)

时间:2014-11-11 23:23:44

标签: javascript three.js

使用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)

提前致谢

2 个答案:

答案 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;
    }
}