Тестирование точки-прямоугольника - PullRequest
4 голосов
/ 29 апреля 2009

У меня есть эта матрица

/// as if the create a rectangle
int [][] loc = {
  {5, 15},//(x1, y1)
  {5, 30}, // (x1, y2)
  {20, 15},// (x2, y1)
  {20, 30}, // (x2, y2)
}

// this are the point that i want to check if they are in the rectangular range or not
int [] [] point = {
  {6, 16}, //(x, y)
  {3, 17}, //(x, y)
} 

Мне нужен метод, который может взять точку и выполнить поиск, если она находится в диапазоне локальных значений, или нет x1<x<x2 и y1<y<y2

Ответы [ 3 ]

14 голосов
/ 29 апреля 2009

Точка (x, y) находится внутри прямоугольника (x1, y1) - (x2, y2), если

(x1 <= x <= x2) <strong>и (y1 <= y <= y2) </p>

Ваш код должен выглядеть следующим образом (на самом деле это код C, но JavaScript не должен сильно отличаться):

 x1 = loc[0][0];
 x2 = loc[2][0];
 y1 = loc[0][1];
 y2 = loc[2][1];
 for (int i = 0; i < num_points; i++) {
   if ((x1 <= point[i][0]) && (point[i][0] <= x2) && 
       (y1 <= point[i][1]) && (point[i][1] <= y2)) {
     // This point is inside the rectangle - insert code here
   } else {
     // This point is not inside the rectangle - insert code here
   }
 }

Обратите внимание, что это будет работать только в том случае, если (x1 <= x2) и (y1 <= y2), поэтому, возможно, вы можете убедиться, используя вместо этого первые четыре строки выше: </p>

x1 = Math.Min(loc[0][0], loc[2][0]);
x2 = Math.Max(loc[0][0], loc[2][0]);
y1 = Math.Min(loc[0][1], loc[2][1]);
y2 = Math.Max(loc[0][1], loc[2][1]);
6 голосов
/ 28 февраля 2013

Хотя на вопрос был дан широкий ответ, я хотел бы поделиться своим фрагментом кода, потому что он выглядит более интуитивно понятным и больше похож на математику, которую я получил в старшей школе. На всякий случай, если люди ищут этот вопрос из-за домашней работы:)

function between(min, p, max){
  result = false;

  if ( min < max ){
    if ( p > min && p < max ){
      result = true;
    }
  }

  if ( min > max ){
    if ( p > max && p < min){
      result = true
    }
  }

  if ( p == min || p == max ){
    result = true;
  }

  return result;
}

function point_in_rectagnle( x, y, left, top, right, bottom){
  result = false;

  if ( between(left,x,right) && between(top,y,bottom ) ){
    result = true;
  }
  return result;
}
4 голосов
/ 03 декабря 2013

Код в вопросе - Java или C или другой язык, который определяет литералы массива с помощью {}, но так как тег - это Javascript, и это отображается в Google для Javascript, здесь есть разумный способ сделать пересечение точки и прямоугольника в JS.

function pointRectangleIntersection(p, r) {
    return p.x > r.x1 && p.x < r.x2 && p.y > r.y1 && p.y < r.y2;
}

var point = {x: 1, y: 2};
var rectangle = {x1: 0, x2: 10, y1: 1, y2: 7};
pointRectangleIntersection(point, rectangle);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...