Alright, spent a little time optimizing it and making it easier to read. It now takes 0.631 sec to gen a 4000 by 3000 map with 16 HW (in flash ). The spacing is also now much better.
heres the pic:
[img]http://www.chasekernan.com/flashNovaMap2.gif[/img]
I also re-uploaded the actual app in case you want to see it.
Heres the better code (put some stuff in funcs so its a bit easier to read and shorter):
public function generateRectMap(dimensions:Vector, numberOfPlanets:uint, players:Array, names:Array, germanium:int = -1):void
{
_objects = [];
//removed the checks because they're the same from above
//randomize player and name order
players = randomizeArray(players);
names = randomizeArray(names);
var planetPoints :Array = createPoints(dimensions, numberOfPlanets, 0.05);
for(i = 0; i < planetPoints.length; i ++)
_objects.push(new Planet(planetPoints[i], names[i]));
var hwPoints :Array = createPoints(dimensions, players.length, 0.2);
for(i = 0; i < hwPoints.length; i++)
{
//hw loc
var point :Vector = hwPoints[i] as Vector;
//find closest planet
var dist :Number = _objects[0].Location.getDistance(point);
var curDist :Number = 0;
var planetNum :int = 0;
for(var j:int = 0; j < _objects.length; j++)
{
curDist = _objects[j].Location.getDistance(point);
if(curDist < dist)
{
dist = curDist;
planetNum = j;
}
}
//found the planet so now change it to HW
var planet :Planet = _objects[planetNum] as Planet;
var player :Player = players[i] as Player;
//probably don't want to have this hardcoded.
planet.IsHomeworld = true;
planet.Owner = player;
planet.Environment = player.PlayerRace.PerfectEnv;
planet.MinConcentrations.Germanium = germanium;
planet.Population = player.PlayerRace.GrowthRate * 5000 + 50000;
planet.Factories = 10;
planet.Mines = 10;
}
}
private function createPoints(dimensions:Vector, numberOfPoints:int, borderPercent:Number):Array
{
var points :Array = [];
var sqrt :int = Math.ceil(Math.sqrt(numberOfPoints));
var plotSize :Vector = new Vector(dimensions.x / sqrt, dimensions.y / sqrt);
var excessPlots :int = int(sqrt * sqrt - numberOfPoints);
var border :Number = borderPercent * Math.min(plotSize.x, plotSize.y);
//remove excess
var randomIntX :int;
var randomIntY :int;
var remove :Array = [];
//setup array
for(var i:int = 0; i < sqrt; i++)
{
remove[i] = [];
for(var j:int = 0; j < sqrt; j++) remove[i][j]= 1;
}
//remove extra
for(i = 0; i < excessPlots; i++)
{
do {
randomIntX = int(Math.random() * (sqrt - 0.0001));
randomIntY = int(Math.random() * (sqrt - 0.0001));
} while (remove[randomIntX][randomIntY] == 0);
remove[randomIntX][randomIntY] = 0;
}
//setup actual points
for(i = 0; i < sqrt; i++)
{
for(j = 0; j < sqrt; j++)
{
if(remove[i][j] == 0) continue;
var xloc :int = i * plotSize.x + border + Math.random() * (plotSize.x - border * 2);
var yloc :int = j * plotSize.y + border + Math.random() * (plotSize.y - border * 2);
points.push(new Vector(xloc, yloc));
}
}
return points;
}
private function randomizeArray(a:Array):Array
{
var newA :Array = [];
for(var i:int = a.length - 1; i >= 0; i--)
newA.push(a.splice(Math.floor(Math.random() * (a.length - 0.0001)), 1)[0]);
return newA;
}