Java: генерировать случайную точку, которая не находится внутри прямоугольника - PullRequest
1 голос
/ 25 января 2012

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

Ответы [ 3 ]

8 голосов
/ 25 января 2012

Этот код приводит к бесконечному циклу, если вы не добились успеха с первой попытки, okPoint = true должно быть внутри do блок.Посмотрите, какова ваша производительность, когда вы это исправите.Я не могу придумать более быстрого способа, когда вы проверяете несколько прямоугольников, а не один.

0 голосов
/ 25 января 2012

Генерация случайной точки.Затем проверьте, находится ли он внутри границ прямоугольника.если это так:

  1. Пусть centerX и centerY будут x и y центральной точки прямоугольника.
  2. если randPointX
  3. если randPointX> centerX, тогда пусть randPointX = randPointX + centerX
  4. Сделайте то же самое для ординаты y
  5. , вам нужно будет снова выполнить проверку границ, чтобы увидеть, находится ли точка за пределами большего видаэкран я предполагаю).Просто координаты деформации.так что если randPointX отрицателен, то пусть он будет равен max_X + randPointX
0 голосов
/ 25 января 2012

Я бы попробовал что-то вроде этого: выберите, находится ли точка выше / ниже / слева или справа от прямоугольника (nextInt (4)), а затем выберите случайную точку в этой области

код:

public Point getLegalPoint(int x, int y, int width, int height){
  Random generator = new Random();
  int position = generator.nextInt(4); //0: top; 1: right; 2: bottom; 3:right
  if (position == 0){
    return new Point(generator.nextInt(975),y-generator.nextInt(y);
  } else if (position == 2){
    return new Point(generator.nextInt(975),y+height+(generator.nextInt(650-(y+height)));
  } 
   ... same for x ...
}
...