0

I was working not so long ago with KineticJS and I have a problem.

I can draw circles (white, blue and red), and then I'll draw a polygon along the path of the blue circles.

But how do I find the coordinates, or at least something about the red circles. That is, about those who fall under the following polygons.

I tried using getIntersection but I do not understand what it returns. Sorry for my bad english. Thanks in advance!!

http://imageshack.us/scaled/thumb/42/7gok.jpg

4

1 回答 1

0

我从您的图片中假设所有红点和蓝点都位于网格上。

这意味着任何点的 x 和 y 都被夹在该网格上(轴对齐)

我进一步假设蓝点定义了多边形的外部。

所以你想看看那个多边形内是否有任何特定的红点?

鉴于这些假设,如果任何红点在所有 4 个垂直和水平边上都被蓝点包围,则它位于多边形内

  • 红点左侧的蓝点

    blueY==redY && blueX<redX
    
  • 红点右侧的蓝点

    blueY==redY && blueX>redX
    
  • 红点上方的蓝点

    blueX==redX && blueY<redY
    
  • 红点下方的蓝点

    blueX==redX && blueY>redY
    

首先,您需要能够获取所有蓝点,因此当您创建蓝点时,请务必为它们分配一个蓝色的名称属性

name:"blue",

然后,您可以使用此函数测试任何红点,该函数检查该红点是否被蓝点包围:

function isRedInPolygon(red){

    // get XY of the red circle
    var redX=red.getX();
    var redY=red.getY();

    // set up vars for results
    // these vars become true when blue dots are
    // directly up, down, left and right of the red dot
    var up=false;
    var down=false;
    var left=false;
    var right=false;

    // get all the blue dots into an array
    var blues=layer.get('.blue').toArray();

    for(var j=0;j<blues.length;j++){

        // get the XY of this blue
        var blue=blues[j];
        blueX=blues[j].getX();
        blueY=blues[j].getY();

        // test left/right
        if(blueX==redX){
            // left
            if(blueY<redY){ up=true; }
            // right
            if(blueY>redY){ down=true; }
        }

        // test up/down
        if(blue.Y==red.Y){
            if(blueX<redX){ left=true; }
            if(blueX>redX){ right=true; }
        }
    }

    // return true if this red dot is surrounded
    // by blue dots on all 4 sides
    return(up && down && left && right);
}

获取多边形内所有红色对象的列表

首先,将 name="red" 分配给所有红点。

name:"red",

然后使用此调用获取多边形中所有红色对象的数组。

var redsInside = listOfRedsInPolygon();

使用此功能:

function listOfRedsInPolygon(){

    var reds=layer.get('.red').toArray();

    var redsInsidePolygon=[];

    for(var i=0;i<reds.length;i++){

        if(isRedInPolygon(reds[i])){
            redsInsidePolygon.push(reds[i]);
        }
    }

    return(redsInsidePolygon);
}

免责声明:我没有测试过这段代码......它可能需要一些调整。

于 2013-07-30T17:33:23.963 回答