与えられたポイントがバウンディングボックス内にあるかどうかをどのように判断しますか?ポイントがバウンディングボックス内にあるかどうかを確認する
私のポイントは48.847172、2.386597です。
にBoundingBox:
"48.7998602295",
"48.8198640442",
"2.46138595581",
"2.48138619423"
与えられたポイントがバウンディングボックス内にあるかどうかをどのように判断しますか?ポイントがバウンディングボックス内にあるかどうかを確認する
私のポイントは48.847172、2.386597です。
にBoundingBox:
"48.7998602295",
"48.8198640442",
"2.46138595581",
"2.48138619423"
はちょうどいつものように実行します。
if(bb.ix <= p.x && p.x <= bb.ax && bb.iy <= p.y && p.y <= bb.ay) {
// Point is in bounding box
}
bb
を(ix,iy)
はその左上の座標、および(ax,ay)
その右下の座標で、バウンディングボックスです。 p
がポイントであり、(x,y)
の座標です。
CGRectとCGPointにはかなり良いユーティリティメソッドがあります(実際に座標を格納するためにCGFloatを使用していて、値を見ても気にしないと仮定します:-))。
あなたはそのようにそれを行うことができます。
// Create bounding box
CGRect area = CGRectMake(x, y, width, height);
// Define point
CGPoint point = CGPointMake(pX, pY);
/Check
BOOL isInside = CGRectContainsPoint(area, point);
このソリューションはまた、考慮してUIは、経度180/-180どこのことができます。低ズームレベルで(マップビューを横切るボックスを送信する場合を取ります全世界を参照して、無限循環の水平スクロールを可能にするので、例えば、ボックスの底辺が170未満の場合は170、底辺が-170の場合は190度、それ以外の場合は20度の範囲を含むことが可能です。
def inBoundingBox(bl/*bottom left*/: Coordinates, tr/*top right*/: Coordinates, p: Coordinates): Boolean = {
// in case longitude 180 is inside the box
val isLongInRange =
if (tr.long < bl.long) {
p.long >= bl.long || p.long <= tr.long
} else
p.long >= bl.long && p.long <= tr.long
p.lat >= bl.lat && p.lat <= tr.lat && isLongInRange
}
リーフレットを使用している場合は、新しいLatLngBounds
とその操作を使用します。
var bounds = new L.LatLngBounds(
new L.LatLng(gc.bbox['_northEast'].lat, gc.bbox['_northEast'].lng),
new L.LatLng(gc.bbox['_southWest'].lat, gc.bbox['_southWest'].lng));
return bounds.contains(new L.LatLng(pos.latitude, pos.longitude))
使用して、この機能をCプラスプラスのための長方形の内側のポイントが終了する場合
struct Box{
Vec2 corner1;
Vec2 corner2;
Vec2 corner3;
Vec2 corner4;
};
bool boxContainsPoint(Vec2 point, Box box){
//Calculate distances from corner to corner
float abL = box.corner1.getDistance(box.corner2);////////////////////
float bcL = box.corner2.getDistance(box.corner3);////////////////////
float cdL = box.corner3.getDistance(box.corner4);////////////////////
float daL = box.corner4.getDistance(box.corner1);////////////////////
//Calculate corner touch distance//////////////////////////////////
float apL = box.corner1.getDistance(point);/////////////////////////
float bpL = box.corner2.getDistance(point);/////////////////////////
float cpL = box.corner3.getDistance(point);/////////////////////////
float dpL = box.corner4.getDistance(point);/////////////////////////
//Here we calculate the touch area
//Heron's Formula
///////////////////////////////////////////////////////////////////
float area1 = (abL + apL + bpL)/2;///////////////////////////////
float area2 = (bcL + bpL + cpL)/2;///////////////////////////////
float area3 = (cdL + cpL + dpL)/2;///////////////////////////////
float area4 = (daL + dpL + apL)/2;///////////////////////////////
float a1 = sqrtf(area1 * (area1 - abL)*(area1 - apL)*(area1 - bpL));
float a2 = sqrtf(area2 * (area2 - bcL)*(area2 - bpL)*(area2 - cpL));
float a3 = sqrtf(area3 * (area3 - cdL)*(area3 - cpL)*(area3 - dpL));
float a4 = sqrtf(area4 * (area4 - daL)*(area4 - dpL)*(area4 - apL));
//Calculate the rectangle area
float A = roundf(abL*bcL);
//Check to see if the point contains the polygon rect
if(A ==roundf(a1 + a2 + a3 + a4)) return true;
return false;
}
感謝をチェックします!これは有効です! – viniciusmo
これは、軸を合わせたバウンディングボックスでのみ機能します。 – mrueg
@mruegそれ以上の資格がなければ、バウンディングボックスは軸に整列していると見なされます。たとえば、mathopenref.com/coordbounds.htmlを参照してください。さらに、OPは、4つの数字のみを使用したサンプルボックスについて説明しています。一般的なボックスの場合、少なくとも5つが必要です。彼は明らかに軸に位置合わせされたものを指しています。また、左下が正の経度範囲(0