【问题标题】:How to check if point is in polygon in Javascript如何检查点是否在Javascript中的多边形中
【发布时间】:2013-06-17 21:50:18
【问题描述】:

我遇到了这段 C 代码(我认为),这应该是一种检查点是否在 concaveconvex 多边形内的简洁方法,我想将其转换为 JS 等价物在我的 JS 程序中使用的函数:

int pnpoly(int nvert, float *vertx, float *verty, float testx, float testy)
{
  int i, j, c = 0;
  for (i = 0, j = nvert-1; i < nvert; j = i++) {
    if ( ((verty[i]>testy) != (verty[j]>testy)) &&
     (testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) )
       c = !c;
  }
  return c;
}

nvert:多边形中的顶点数。是否在末尾重复第一个顶点。
vertx, verty: 包含多边形顶点的 x 和 y 坐标的数组。
testx, testy: strong> 测试点的 X 和 y 坐标。

Code above taken from this Stack Overflow question.

这将如何转化为 JS? 我已经找到了如何在 JS 中启动 for 循环

j = nvert-1
for (i = 0; i < nvert; i++) {
    //The whole if thing
    j = i
}

而且我猜第一行中的“float *”在 JS 中可以省略。 但我不太确定“int i, j, c = 0;”是什么当“c = 0”时,“!c”是什么意思。 0的反义词是什么?

谢谢!

【问题讨论】:

  • 为了回答您的具体问题,c = 0 是布尔表达式的整数实现。在 C 中,布尔值实际上只是一个整数,其中 0 等于 False,1 等于 True。

标签: javascript translate point-in-polygon


【解决方案1】:

vertx 和 verty 应该是数组并且应该有值。用

初始化它们

顶点 = []; 顶点 = [];

那么函数就差不多了(假设是正确的)

function pnpoly(var nvert, var vertx, var verty, var testx, var testy).
{
  var i, j, c = 0;
  for (i = 0, j = nvert-1; i < nvert; j = i++) {
   if ( ((verty[i]>testy) != (verty[j]>testy)) &&
   (testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) )
    c = !c;
}

【讨论】:

    【解决方案2】:

    我使用您的问题和您分享的方法来解决我也遇到的相同问题。它工作得很好。我在处理任何未来查询时分享我的一段代码。谢谢。

    // generate a random amount of points
    PVector [] points = new PVector[1000];
    // the list of points for a drawable edge
    ArrayList<PVector> edgePnts = new ArrayList<PVector>();
    PVector oldViewer ;
    void setup(){
        size(800,400);
        for(int i =0; i< points.length;i++){
            points[i]=new PVector(random(width), random(height));
        }
    oldViewer= new PVector(0,0);
    }
    void draw(){
        background(255);
        noStroke();
        // turning the arraylist of vectors into an array of vectors
        PVector[] polyVerts = edgePnts.toArray(new PVector[edgePnts.size()]);
        for(int i =0; i< points.length;i++){
    
            if(edgePnts.size()>0){
                if(pnInPoly(edgePnts.size(),polyVerts,points[i])<0){
                    fill(0,255,0);
                    ellipse(points[i].x,points[i].y, 10,10);
                }else{
                    fill(0);
                    ellipse(points[i].x,points[i].y, 5,5);
                }
            }else{
                fill(0);
                ellipse(points[i].x,points[i].y, 5,5);
            }
        }
        if(edgePnts.size()>0){
            fill(255,0,0);
            stroke(255,0,0);
            for(int i =0; i< edgePnts.size();i++){
            // for(PVector p : edgePnts){
                ellipse(edgePnts.get(i).x,edgePnts.get(i).y,2,2);
                if(i>0){
                    line(edgePnts.get(i).x,edgePnts.get(i).y,edgePnts.get(i-1).x,edgePnts.get(i-1).y);
                }
            }
        }
    
        if (mousePressed){
        PVector viewer = new PVector(mouseX,mouseY);
            if(oldViewer.dist(viewer)>10){
                edgePnts.add(viewer);
                oldViewer = viewer;
            }
        }   
    }
    
    void keyPressed(){
        if(key == 'r' || key == 'R'){
            reset();
        }
    }
    void reset(){
        edgePnts = new ArrayList<PVector>();
        for(int i =0; i< points.length;i++){
            points[i]=new PVector(random(width), random(height));
        }
    }
    // the testing function to check if the point in case is inside the polygon
    int pnInPoly(int nvert, PVector [] vert, PVector test){
        int i, j;
        int c = 1;
        for (i = 0, j = nvert-1; i < nvert; j = i++) {
            if ( ((vert[i].y>test.y) != (vert[j].y>test.y)) &&
            (test.x < (vert[j].x-vert[i].x) * (test.y-vert[i].y) / (vert[j].y-vert[i].y) + vert[i].x) )
            c = c * (-1);
        }
        return c;
        // if c < 0 means it is inside
    }
    

    【讨论】:

      猜你喜欢
      • 2014-08-26
      • 1970-01-01
      • 2013-02-22
      • 2014-04-26
      • 2022-10-07
      • 2019-04-29
      • 1970-01-01
      相关资源
      最近更新 更多