mirror of
https://github.com/vcmi/vcmi.git
synced 2025-02-03 13:01:33 +02:00
Zone placer will remember the best solution, not the last generated.
This commit is contained in:
parent
208ca224a1
commit
067b56dda4
@ -101,6 +101,10 @@ void CZonePlacer::placeZones(const CMapGenOptions * mapGenOptions, CRandomGenera
|
|||||||
|
|
||||||
//gravity-based algorithm. connected zones attract, intersceting zones and map boundaries push back
|
//gravity-based algorithm. connected zones attract, intersceting zones and map boundaries push back
|
||||||
|
|
||||||
|
//remember best solution
|
||||||
|
float bestTotalDistance = 1e10;
|
||||||
|
std::map<CRmgTemplateZone *, float3> bestSolution;
|
||||||
|
|
||||||
auto getDistance = [](float distance) -> float
|
auto getDistance = [](float distance) -> float
|
||||||
{
|
{
|
||||||
return (distance ? distance * distance : 1e-6);
|
return (distance ? distance * distance : 1e-6);
|
||||||
@ -200,7 +204,7 @@ void CZonePlacer::placeZones(const CMapGenOptions * mapGenOptions, CRandomGenera
|
|||||||
}
|
}
|
||||||
logGlobal->traceStream() << boost::format("Total distance between zones in this iteration: %2.2f, Worst distance/movement ratio: %3.2f") % totalDistance % maxRatio;
|
logGlobal->traceStream() << boost::format("Total distance between zones in this iteration: %2.2f, Worst distance/movement ratio: %3.2f") % totalDistance % maxRatio;
|
||||||
|
|
||||||
if (maxRatio > 100) //TODO: scale?
|
if (maxRatio > 100)
|
||||||
{
|
{
|
||||||
//find most distant zone that should be attracted and move inside it
|
//find most distant zone that should be attracted and move inside it
|
||||||
|
|
||||||
@ -227,11 +231,19 @@ void CZonePlacer::placeZones(const CMapGenOptions * mapGenOptions, CRandomGenera
|
|||||||
logGlobal->traceStream() << boost::format("New distance %f") % targetZone->getCenter().dist2d(distantZone->getCenter());
|
logGlobal->traceStream() << boost::format("New distance %f") % targetZone->getCenter().dist2d(distantZone->getCenter());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//save best solution
|
||||||
|
if (totalDistance < bestTotalDistance)
|
||||||
|
{
|
||||||
|
bestTotalDistance = totalDistance;
|
||||||
|
for (auto zone : zones)
|
||||||
|
bestSolution[zone.second] = zone.second->getCenter();
|
||||||
|
}
|
||||||
|
|
||||||
zoneScale *= inflateModifier; //increase size of zones so they
|
zoneScale *= inflateModifier; //increase size of zones so they
|
||||||
}
|
}
|
||||||
for (auto zone : zones) //finalize zone positions
|
for (auto zone : zones) //finalize zone positions
|
||||||
{
|
{
|
||||||
zone.second->setPos(cords(zone.second->getCenter()));
|
zone.second->setPos (cords (bestSolution[zone.second]));
|
||||||
logGlobal->traceStream() << boost::format ("Placed zone %d at relative position %s and coordinates %s") % zone.first % zone.second->getCenter() % zone.second->getPos();
|
logGlobal->traceStream() << boost::format ("Placed zone %d at relative position %s and coordinates %s") % zone.first % zone.second->getCenter() % zone.second->getPos();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user