![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Дана прямоугольная область, ширина и высота известны, дано N(вводится пользователем) точек, необходимо расположить эти точки равномерно по области. Загвоздка в том, что под словом равномерно подразумевается, что любая точка должна быть равноудалена от соседних (по x и y осям, т.е. диагональ не учитывается).
Я не прошу делать за меня, просто может кто сталкивался с подобным или знает хотя бы в какую сторону копать, а то второй день пошел а придумать как реализовать такое не могу.
__________________
местонахождение |
|
|||||
|
В хаотичном порядке или в виде таблицы - строки, столбцы?
__________________
Стой! Опасная зона! Работа мозга! |
|
|||||
|
вроде бы у такой задачки нет аналитического решения, только численно
вот эксперимент, попытка получить равноудаленные точки в прямоугольнике: считаем, что все точки одинаково заряженные частицы и двигаем их в соответствии с силой отталкивания каждой от остальных и от стенок - должно бы устаканится, но реально что-то не очень.. но вообще как вариант может сработать, там enterFrame только для посмотреть, считать-то можно просто в цикле и останавливать при какой-то точности public class Main extends Sprite { private var rect:Rectangle = new Rectangle(50, 50, 400, 300); private var points:Array /*Sprite*/ = []; private var num:int = 48; public function Main():void { this.graphics.lineStyle(0, 0x000000); this.graphics.drawRect(rect.x, rect.y, rect.width, rect.height); // частицы for (var i:int = 0; i < num; i++) { var item:Sprite = new Sprite(); item.graphics.beginFill(0x0000FF); item.graphics.drawCircle(0, 0, 10); item.x = rect.x + rect.width * Math.random(); item.y = rect.y + rect.height * Math.random(); points.push(addChild(item)); } // считаем-смотрим this.addEventListener(Event.ENTER_FRAME, enterFrame); } private function enterFrame(event:Event):void { for (var i:int = 0; i < num; i++) { var item:Sprite = points[i]; var fX:Number = 0; var fY:Number = 0; var dX:Number; var dY:Number; var r:Number; var fi:Number; // отталкивание от других частиц for (var j:int = i + 1; j < num; j++) { dX = points[j].x - item.x; dY = points[j].y - item.y; r = dX * dX + dY * dY; fi = Math.atan2(dY, dX); //сила отталкивания fX += Math.cos(fi) / r; fY += Math.sin(fi) / r; } // отталкивание от стенок var d:Number = 3; // коефф. влияния стенок fX -= d / (item.x - rect.left) / (item.x - rect.left); fX += d / (item.x - rect.right) / (item.x - rect.right); fY -= d / (item.y - rect.top) / (item.y - rect.top); fY += d / (item.y - rect.bottom) / (item.y - rect.bottom); var p:Number = 1e3;// * (1 + 0.2 * Math.random()); item.x -= p * fX; item.y -= p * fY; // проверка границ if (item.x < rect.left) item.x += 2 * (item.x - rect.left); if (item.y < rect.top) item.y += 2 * (item.y - rect.top); if (item.x > rect.right) item.x += 2 * (rect.right - item.x); if (item.y > rect.bottom) item.y += 2 * (rect.bottom - item.y); } } } |
|
|||||
|
2silin, Спасибо за идею.
Буду пробовать, если толковое решение найду, выложу код сюда.
__________________
местонахождение |
|
|||||
|
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
А если построить сетку из равносторонних треугольников? По-моему как раз - точка идеально "равноудалена от соседних"... Может ошибаюсь. Может вообще не в тему
![]()
__________________
Загружаем картинки, минуя ошибки безопасности |
![]() |
![]() |
Часовой пояс GMT +4, время: 10:17. |
|
|
« Предыдущая тема | Следующая тема » |
|
|