Как решить это логическое утверждение с тремя перекрывающимися фигурами? - PullRequest
0 голосов
/ 05 декабря 2011

Мне нужно записать условие в while(...), где все три фигуры будут перекрываться, а затем использовать в цикле while попытку найти комбинацию координат для фигуры, которая не будет перекрывать другие фигуры.У меня есть 3 цикла while в коде - каждый для выбора пары координат для конкретной фигуры.

Этот код останавливает программу:

                    xRing = (int) ((getWidth() - ringSize) * (Math.random()));
                yRing = (int) ((getHeight() - ringSize) * (Math.random()));
                while( !( 

                           (xSquare + squareSize) < (xRing)
                        || (xSquare) > (xRing + ringSize )
                        || (ySquare + squareSize) < (yRing)
                        || (ySquare) > (yRing + ringSize)
                        )

                        ||

                        !( 

                           (xSquare2 + square2Size) < (xRing)
                        || (xSquare2) > (xRing + ringSize )
                        || (ySquare2 + square2Size) < (yRing)
                        || (ySquare2) > (yRing + ringSize)
                        )

                        ||

                        !( 

                           (xSquare + squareSize) < (xSquare2)
                            || (xSquare) > (ySquare2 + square2Size )
                            || (ySquare + squareSize) < (ySquare2)
                            || (ySquare) > (ySquare2 + square2Size)
                        )

                    ){
                    xRing = (int) ((getWidth() - ringSize) * (Math.random()));
                    yRing = (int) ((getHeight() - ringSize) * (Math.random()));


                }

, и это работает, но позволяет перекрывать Square и Square2:

        while( !( 

                           (xSquare + squareSize) < (xRing)
                        || (xSquare) > (xRing + ringSize )
                        || (ySquare + squareSize) < (yRing)
                        || (ySquare) > (yRing + ringSize)
                        )

                        ||

                        !( 

                           (xSquare2 + square2Size) < (xRing)
                        || (xSquare2) > (xRing + ringSize )
                        || (ySquare2 + square2Size) < (yRing)
                        || (ySquare2) > (yRing + ringSize)
                        )

Насколько я понимаю, я должен проверить каждую пару на перекрытие, есть 3 фигуры, 3 возможных перекрытия.Как я уже упоминал ранее, с помощью моей логики кода я могу проверить совпадение 2 пар.Когда я добавляю третью проверку состояния - он не может выйти, пока.Вся логика кажется мне совершенно нормальной.Мой цикл завершится, если он найдет первую координату, где невозможно перекрытие трех фигур.

На самом деле моя короткая версия кода должна выглядеть следующим образом:

while( not(ring NOT overlaps square 1) or 
       not(ring NOT overlaps square 2) or 
       not(square 1 NOT overlaps square 2) ) {
  ...
}

решено: IЯ должен проверять 2 комбинации (НЕ 3) при рисовании каждой фигуры, поэтому для каждого while () у меня должны быть разные условия.

1 Ответ

1 голос
/ 05 декабря 2011

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

Было бы лучше перебрать все пиксели в вашем прямоугольнике и проверить их. Таким образом, ваш цикл остановится после проверки всех пикселей.

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

Я предполагаю, что ваши 3 условия высшего уровня должны выглядеть следующим образом:

while( not(ring overlaps square 1) or 
       not(ring overlaps square 2) or 
       not(square 1 overlaps square 2) ) {
  ...
}

Если, например, квадраты 1 и 2 не перекрываются, условие всегда будет истинным и цикл будет выполняться вечно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...