当前位置: 首页 > 面试题库 >

多边形触摸检测Google Map API V2

陈项禹
2023-03-14
问题内容

我试图找出最好的方法,我在上面绘制了一张Polygon地图。由于Google Maps API
V2似乎没有在Polygon上进行触摸检测。我想知道是否可以检测接触点是否在多边形内部?如果是这样,那么,我的主要目标是在地图上勾画一个状态,当用户点击该状态时,它将在html" target="_blank">自定义视图中显示更多详细信息。到目前为止,我已经能够捕获MapOnClick地图的,但是当用户在内点击时,Polygon我想要polygon.getID()上的地图Toast。我是新手,如果我不太清楚,我深表歉意。

googleMap.setOnMapClickListener(new OnMapClickListener() 
    {
        public void onMapClick(LatLng point) 
        {
        boolean checkPoly = true;

        Toast.makeText(MainActivity.this,"The Location is outside of the Area", Toast.LENGTH_LONG).show();
        }    
     });
     }
     }
   catch (Exception e) {
         Log.e("APP","Failed", e);
     }

好的,这是我到目前为止的半工作

    private boolean rayCastIntersect(LatLng tap, LatLng vertA, LatLng vertB) {

    double aY = vertA.latitude;
    double bY = vertB.latitude;
    double aX = vertA.longitude;
    double bX = vertB.longitude;
    double pY = tap.latitude;
    double pX = tap.longitude;
     if (aY > bY) {
            aX = vertB.longitude;
            aY = vertB.latitude;
            bX = vertA.longitude;
            bX = vertA.latitude;
        }
    System.out.println("aY: "+aY+" aX : "+aX);
    System.out.println("bY: "+bY+" bX : "+bX);

     if (pX < 0) pX += 360;
        if (aX < 0) aX += 360;
        if (bX < 0) bX += 360;

        if (pY == aY || pY == bY) pY += 0.00000001;
        if ((pY > bY || pY < aY) || (pX > Math.max(aX, bX))) return false;
        if (pX < Math.min(aX, bX))

            return true;
//  }

    double m = (aX != bX) ? ((bY - aY) / (bX - aX)) : aX;
    double bee = (aX != pX) ? ((pY - aY) / (pX - aX)) : aX;
    double x = (pY - bee) / m;

    return x > pX;
}

}

我遇到的问题是在每个多边形的左侧都碰到触摸,直到到达另一个多边形为止。我的算法有什么问题会导致此问题?任何帮助,将不胜感激。


问题答案:

您要解决的问题是“ 多边形中点”测试。

为了帮助形象化射线投射的概念:

在一张纸上绘制一个多边形。然后,从任意随机点开始,在页面右侧绘制一条直线。如果线与多边形相交的次数是奇数次,则意味着起点在多边形内。

那么,如何在代码中做到这一点?

您的多边形由一系列顶点组成: ArrayList<Geopoint> vertices。您需要Line Segment单独查看每个对象,并查看它们是否Ray相交

private boolean isPointInPolygon(Geopoint tap, ArrayList<Geopoint> vertices) {
    int intersectCount = 0;
    for(int j=0; j<vertices.size()-1; j++) {
        if( rayCastIntersect(tap, vertices.get(j), vertices.get(j+1)) ) {
            intersectCount++;
        }
    }

    return (intersectCount%2) == 1); // odd = inside, even = outside;
}

private boolean rayCastIntersect(Geopoint tap, Geopoint vertA, Geopoint vertB) {

    double aY = vertA.getLatitude();
    double bY = vertB.getLatitude();
    double aX = vertA.getLongitude();
    double bX = vertB.getLongitude();
    double pY = tap.getLatitude();
    double pX = tap.getLongitude();

    if ( (aY>pY && bY>pY) || (aY<pY && bY<pY) || (aX<pX && bX<pX) ) {
        return false; // a and b can't both be above or below pt.y, and a or b must be east of pt.x
    }

    double m = (aY-bY) / (aX-bX);               // Rise over run
    double bee = (-aX) * m + aY;                // y = mx + b
    double x = (pY - bee) / m;                  // algebra is neat!

    return x > pX;
}


 类似资料:
  • 本文向大家介绍sprite-kit 检测触摸,包括了sprite-kit 检测触摸的使用技巧和注意事项,需要的朋友参考一下 示例 您可以覆盖4种SKScene检测用户触摸的方法 请注意,每种方法都接收一个touches参数(在特定情况下),该参数可以包含一个以上的单个触摸事件。

  • 多路触摸上包含多个触摸传感器,可以检测对应触点被触摸的状态. 当检测到对应触点被触摸时,触点对应的指示灯会亮起。同时你可以通过鳄鱼夹或导线,将触摸传感器上的触点引出,比如通过导线将触点与水果相连,这将大大扩宽该模块的应用场景。 该模块能够智能地调节阈值,每一次断电重启后,该模块都会重置阈值,确保触点连接各种导电材质后,依旧能够灵敏的检测触摸事件。你还可以使用软件中的编程积木进一步调节触摸传感器的灵

  • 多路触摸上包含多个触摸传感器,可以检测对应触点被触摸的状态,当检测到对应触点被触摸时,触点对应的指示灯会亮起。同时你可以通过鳄鱼夹或导线,将触摸传感器上的触点引出,比如通过导线将触点与水果相连,这将大大扩宽该模块的应用场景。 该模块能够智能地调节阈值,每一次断电重启后,该模块都会重置阈值,确保触点连接各种导电材质后,依旧能够灵敏的检测触摸事件。你还可以使用软件中的编程积木进一步调节触摸传感器的灵敏

  • 所以我试图用pygame制作一个我们之间的游戏。我刚刚开始,所以我没有太多东西,现在正在制作地图。然而,我正在努力解决的一件事是碰撞逻辑。地图目前有一个细长的八边形形状,但是我想不管是什么形状,我都会使用类似pygame多边形的东西。当我运行我现在的代码时,它会检查我的玩家(pygame矩形)和墙壁(pygame多边形)之间的碰撞,它说: 我发现这是因为pygame多边形返回了一个矩形,但在碰撞检

  • 问题内容: 在Javascript / jQuery中,如何检测客户端设备是否有鼠标? 我有一个网站,当用户将鼠标悬停在某个项目上时,该网站会在信息面板上向上滑动。我正在使用jQuery.hoverIntent来检测悬停,但这显然不适用于iPhone/ iPad / Android等触摸屏设备。因此,在这些设备上,我想还原为点按以显示信息面板。 问题答案: +1,两者兼而有之。另一种方法是使用CS

  • 问题内容: 我试图检测我的sprite节点是否已被触摸并且我不知道从哪里开始。 问题答案: 首先将的属性设置为字符串。 然后在功能上 这是一种方法。 您也可以继承并覆盖其中的内部。 然后做