определить, находится ли точка внутри ограничительной рамки

<p>как бы вы определили, находится ли данная точка внутри ограничительной рамки?</p><p>моя точка зрения 48,847172, 2,386597.</p><p>ограничительная рамка:</p><pre><code> "48.7998602295", "48.8198640442", "2.46138595581", "2.48138619423" </code></pre>

<p>делай как обычно:</p><pre><code>if( bb.ix <= p.x && p.x <= bb.ax && bb.iy <= p.y && p.y <= bb.ay ) { // point is in bounding box } </code></pre><p><code>bb</code> - это ограничивающий прямоугольник, <code>(ix,iy)</code> - его верхние левые координаты, а <code>(ax,ay)</code> - его нижние правые координаты. <code>p</code> - это точка, а <code>(x,y)</code> - ее координаты.</p>

<p>это решение также учитывает случай, в котором пользовательский интерфейс отправляет прямоугольник, который пересекает долготу 180/-180 (отображает представления на низком уровне масштабирования, где вы можете видеть весь мир, допускайте бесконечную циклическую горизонтальную прокрутку, поэтому возможно, например, что bottomleft.lng блока = 170, а topright.lng = -170 (= 190) и тем самым включает диапазон 20 градусов. </p><pre><code>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 } </code></pre>

<p>если вы используете листовку, вы можете создать новую <code>latlngbounds</code> и использовать ее операцию <code>contains()</code>:</p><pre><code>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)) </code></pre>

<p>есть довольно полезные служебные методы для cgrect и cgpoint (если вы не возражаете против того факта, что они используют cgfloat для хранения координат - и, глядя на ваши значения, вы этого не сделаете :-)).</p><p>вы можете сделать это так:</p><pre><code>// create bounding box cgrect area = cgrectmake(x, y, width, height); // define point cgpoint point = cgpointmake(px, py); /check bool isinside = cgrectcontainspoint(area, point); </code></pre>

<p>это должно быть быстрее.</p><pre><code>function doespointcollide(p,box) { return !(p.x < box.left || p.x > box.right || p.y > box.bottom || p.y < box.top) } </code></pre><p>если точка находится вне какого-либо из измерений, мы знаем, что она не находится в ограничительной рамке, иначе она находится в ограничительной рамке, поэтому мы можем быстрее игнорировать опущенные случаи.</p>

<p>используйте эту функцию для c плюс плюс, чтобы проверить, находится ли точка внутри прямоугольника</p><pre><code>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; } </code></pre>