Java: рисование неперекрывающихся фигур случайным образом в пределах области - PullRequest
0 голосов
/ 19 апреля 2011

Мне нужно нарисовать некоторые графические объекты на JPanel в JApplet, это объекты Graphics2D.

Вот некоторая визуальная помощь

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

2) Было бы неплохо, если бы я мог равномерно распределить их так, чтобы при наличии 4 кругов расстояние между кругами было почти одинаковым, но все равно было случайным до некоторой величины.

3) Если нарисованы первые 3 или 4 круга, нарисуйте другие меньшие и случайные по размеру круги на всей панели, которая не используется.

Это кажется странной идеей, но можно ли создать алгоритм, который дает вам координаты центра на основе некоторых ограничений, таких как (x-100) ^ 2 + (y-100) ^ 2> 200 && 0

Теперь я делаю это так: разделите всю область на сетку, где каждая ячейка в свободном или занятом слоте, и внутри этой ячейки нарисуйте круги со случайными координатами, но все еще внутри этой ячейки.

Эта идея не выглядит так хорошо, и я хотел бы сделать это лучше. Я реализую это в Java, но общие идеи также приветствуются.

1 Ответ

0 голосов
/ 20 апреля 2011

Если у вас есть только круги, тест «не перекрывающийся» прост: два круга не перекрываются, если и только если расстояние между их центрами больше, чем сумма их радиусов (для равенства они соприкасаются).Для перекрытия границы: расстояние от границы должно быть больше радиуса.

Таким образом, вы можете просто продолжить и сгенерировать случайные координаты (с фиксированными или случайными радиусами), а затем проверить, не перекрываются ли они.Если да, либо начните заново, либо отбросьте только перекрывающиеся и продолжайте.

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

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

...