Показать сообщение отдельно
Старый 14.06.2011, 19:20
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 5  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
вроде бы у такой задачки нет аналитического решения, только численно
вот эксперимент, попытка получить равноудаленные точки в прямоугольнике:
считаем, что все точки одинаково заряженные частицы и двигаем их в соответствии с силой отталкивания каждой от остальных и от стенок - должно бы устаканится, но реально что-то не очень..
но вообще как вариант может сработать, там enterFrame только для посмотреть, считать-то можно просто в цикле и останавливать при какой-то точности
Код AS3:
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);
 
		}
	}
}