私はこれを行うための最善の方法を見つけようとしPolygon
ています。地図が描かれた地図があります。Google Maps API V2がポリゴン上でタッチ検出をしているようには見えないので。タッチポイントがポリゴンの内側にあるかどうかを検出することは可能ですか?もしそうなら、どのように、私の主な目標は、マップ上の状態を概説することであり、ユーザーがその状態をタップすると、カスタムビュー内に詳細が表示されます。現在のところ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;
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加