Суть моей задачи в следующем: я рисую на канвасе круги. Их 20. И очень часто при рандоме круги накладываются друг на друга. Я хочу избежать этого и ввести проверку, не пересекает ли это какой-нибудь другой круг. Вот что я делаю:
Код | var circlesXY = new Array(); // массив для хранения координат центра кругов
|
Сами круги создаются рандомно в цикле.
Код | for(var i=0; i<20; i++){ //запускаем цикл на создание 20-ти кругов do{ var tmpX = Math.round(Math.random()*950); //рандомная координата Х var tmpY = Math.round(Math.random()*480); // Y } while(!checkCircle(tmpX, tmpY)) // функция для проверки, есть ли уже такой круг. Повторяем цикл до тех пор, пока она не скажет, что в массиве координат кругов такого круга нет. //здесь процесс создания круга и его показ }
|
Функция для проверки координат выглядит так:
Код | function checkCircle(x, y){ var result; if(circlesXY.length == 0) return true; for(var i=0; i<circlesXY.length; i++){ //цикл для прохода по всему массиву с кординатами var tmp = circlesXY[i]; //получаем во временную переменную элемент массива if(((Math.abs(tmp.x-x))>45) && ((Math.abs(tmp.y-y))>45)){ //проверяем. есть ли в радиусе 45 точек (максимальный радиус моих кругов 40 точек) другие круги result = true; //нет кругов } else { return false; //есть круг. Выходим из функции и цикл while выше продолжается. } } return result; }
|
Проблема в том, что при таком подходе даже для 20 кругов браузер висит. Цикл не бесконечный, но очень долгий. Пожалуйста, подскажите наиболее оптимальное решение проблемы. |