2013-08-18 14 views

risposta

18

fare proprio come al solito:

if(bb.ix <= p.x && p.x <= bb.ax && bb.iy <= p.y && p.y <= bb.ay) { 
    // Point is in bounding box 
} 

bb è il rettangolo di selezione, (ix,iy) sono le sue coordinate in alto a sinistra, e (ax,ay) sue coordinate in basso a destra. p è il punto e (x,y) le sue coordinate.

+0

Grazie! Questo è funzionante! – viniciusmo

+6

Funzionerà solo per i riquadri di delimitazione allineati agli assi! – mrueg

+1

@mrueg Senza ulteriore qualifica, le caselle di delimitazione sono intese come assi allineate. Vedi ad esempio mathopenref.com/coordbounds.html. Inoltre, l'OP descrive la casella di esempio utilizzando solo 4 numeri. Per una scatola generica, sono richiesti almeno 5. Ovviamente si riferisce a quelli allineati sull'asse. –

2

Ci sono metodi di utilità piuttosto buoni per CGRect e CGPoint (presumendo che non si tenga conto del fatto che stanno utilizzando CGFloat per l'archiviazione delle coordinate - e guardando i propri valori, non lo si :-)).

Si può fare così:

// Create bounding box 
CGRect area = CGRectMake(x, y, width, height); 

// Define point 
CGPoint point = CGPointMake(pX, pY); 

/Check 
BOOL isInside = CGRectContainsPoint(area, point); 
4

Questa soluzione prende anche in considerazione il caso in cui l'utente invia una scatola che attraversa longitudine 180/-180 (vista Maps sul livello di zoom basso dove è possibile vedere il mondo intero, consentire lo scorrimento orizzontale ciclico infinito, quindi è possibile ad esempio che bottomLeft.lng = 170 di una casella mentre topRight.lng = -170 (= 190) e di quello compreso un intervallo di 20 gradi

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

Se si utilizza un opuscolo, è possibile creare un nuovo LatLngBounds e utilizzare il suo funzionamento :

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

Usare questa funzione per c plus plus per verificare se un punto uscite all'interno di un rettangolo

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; 

} 
Problemi correlati