2012-01-25 2 views
1

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

public Point getLegalPoint() { 
      Random generator = new Random(); 
      Point point; 
      boolean okPoint = true; 
      do { 
        point = new Point(generator.nextInt(975), generator.nextInt(650)); 
        for (int i = 0; i < buildingViews.size(); i++) { 
          if (buildingViews.get(i).getBuilding().getRectangle() 
              .contains(point)) { 
            okPoint = false; 
            break; 
          } 

        } 
      } while (okPoint == false); 
      return point; 
    } 

Есть ли что-то, что я делаю неправильно, или есть более эффективный способ сделать это, чтобы он не заморозил мое приложение?

+0

Предполагаю, что вы хотите создать точку INSIDE прямоугольником R1, который является ВНЕШНИМ другим прямоугольником R2. Если это так, вы должны сообщить нам относительные размеры R1 R2 и если R2 находится внутри R1 – leonbloy

+4

Представьте выполнение этого кода, если первая итерация цикла for устанавливает «okPoint = false». Когда он снова установлен в значение true? – nos

+0

Каков размер прямоугольника? Я имею в виду, что если это очень близко к 975x650, тогда вероятность низкая, и вам потребуется много итераций. – rodrigoap

ответ

8

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

0

Я хотел бы попробовать что-то вроде этого: выбрать, является ли точка выше/ниже/на левой стороне/на правой стороне прямоугольника в (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 ... 
} 
+0

Это не будет выбирать все точки с равной вероятностью; что может или не имеет значения для ОП, но я предполагаю, что это намерение. –

+0

Ок, это правда, но проблема заключается только в «углах», которая имеет удвоенную вероятность. Она может быть исправлена ​​путем ограничения другой оси .. что-то вроде: если выбрано пространство выше, чем выбрать x из (rectangle.x, space. ширина), если выбрано пространство ниже, выберите x из (0, rectangle.x + rectangle.width) – Ficik

+0

Я передумал это .. и вы правы ..вероятность не будет равна – Ficik

0

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

  1. Пусть центр X и центр Y являются x и y центральной точки прямоугольника.
  2. если randPointX < CenterX то пусть randPointX = randPointX - CenterX
  3. если randPointX> CenterX то пусть randPointX = randPointX + CenterX
  4. ли то же самое для у ординате
  5. вам нужно будет сделать границы еще раз проверяя, точка находится за пределами большего вида (экран, который я предполагаю). Просто координаты координат. поэтому, если randPointX отрицательный, то пусть он равен max_X + randPointX
+0

Это не генерирует все возможные точки с равной вероятностью и даже не заканчивается в некоторых случаях (например, вы выбираете центр прямоугольника). –

Смежные вопросы