2013-08-18 3 views

ответ

18

делать так же, как обычно:

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) его координаты.

+0

Спасибо! Это сработало! – viniciusmo

+6

Это будет работать только для выровненных по оси ограничивающих прямоугольников! – mrueg

+1

@mrueg Без дополнительной квалификации ограничительные коробки понимаются как ориентированные по оси. См. Например, mathopenref.com/coordbounds.html. Кроме того, OP описывает поле примера, используя только 4 числа. Для общей коробки требуется не менее 5. Очевидно, он имеет в виду выровненные по оси. –

2

Есть довольно хорошие утилиты для 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); 
4

Это решение также принимает во внимание случай, в котором пользовательский интерфейс отправляет окно, которое пересекает долготу 180/-180 (карты взглядов на низком уровне масштабирования, где вы можете см. весь мир, разрешите бесконечную циклическую горизонтальную прокрутку, так что, например, возможно, что нижний нижний ящик окна = 170, а topRight.lng = -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 
} 
3

Если вы используете рекламный листок, вы можете создать новый 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)) 
0

Используйте эту функцию для с плюс плюс, чтобы проверить, если точка выходит внутри прямоугольника

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; 

}