使用点网格来检测对象是否在范围内

时间:2017-10-01 07:16:59

标签: javascript

我有一个点网格,我在我的应用程序开头使用for循环制作它们。每个点都有两个数组,一个名为objectsAroundMe,另一个名为pointsAroundMe。

目标是检测物体是否接近该点(对于物体和点使用for循环)

检测完后,如果对象在范围内,我们将其推送到point.objectsAroumdMe数组。

我所有这一切都很好并且正常工作,但是当对象不再接近时,问题就是释放引用了,我已经尝试运行if语句来做它并使引用为null但它没有不行。如果有一种有效的方法可以做到这一点,那么只有一个引用从一个数组移动到另一个数组,那么这将是完美的。接下来我将尝试使用array.splice和slice来复制amd paste引用。但是现在我尝试使用array.filter和indexof并且findindex都没有用。但是我对类很新,所以如果它们是使用for循环迭代Id和使用“this”语句澄清对象之间的区别那么请给我一个例子,我将如何找到“this”对象的索引并从点数组中删除它的引用。

    onHitTest(){
                for (let ii = 0; ii < jsEngine.pointGrid.length; ii++) {
                    let point = jsEngine.pointGrid[ii];
                    let distanceBetween = calcTotalDistance(this.transform.x,this.transform.y,point.x,point.y);
                    let pointPosition = point.x + point.y;


         if (!point.objectsAroundMe.includes(this)) {
            if ( distanceBetween < mapWidth/density*1.4) {
                point.objectsAroundMe.push(this);
                this.hitTestArray = point.objectsAroundMe;
                this.pointArray = point.pointsAroundMe;
                //console.log(this.hitTestArray);
            } 


if(point.objectsAroundMe.includes(this)) {
                 if (pointPosition - distanceBetween > 100000) {
                     let indx= point.objectsAroundMe.indexOf(this);
                     point.objectsAroundMe[indx] = null;
                 }
             }
        }
            }

////第二个for循环,用于测试从点到对象的传递数组。

        for (let i = 0 ; i < this.hitTestArray.length; i++){
            let hitTestObject = this.hitTestArray[i];
            if(hitTestObject.transform=== null)
                continue;
            if(hitTestObject === this)
                continue;
            let distance = calc_distance(this.transform,hitTestObject.transform);
            if (distance <  hitTestObject.transform.width + hitTestObject.transform.width
                && distance  <  this.transform.height + this.transform.height){
                //console.log("hit!")
            }

        }
    }

Mapwidth = 1000000,密度为10.

distanceBetween:对象与点之间的距离使用:return Math.sqrt((x1 - x2)** 2 +(y1 - y2)** 2);

this =有问题的对象(避免双循环)

pointGrid =一个点网格,总共有90个点,由mapwidth / density

等间隔

1 个答案:

答案 0 :(得分:0)

我在2周后终于放弃了这项技术后发现它确实表现不如预期,现在我将采取类似的方法,我将通过以下方式上传我的代码:(功能和操作顺序不久。