From f19aafa88cc652570cf03045f35df0af8bf321b6 Mon Sep 17 00:00:00 2001 From: Nel-S <75831544+Nel-S@users.noreply.github.com> Date: Wed, 15 Feb 2023 18:59:14 -0800 Subject: [PATCH] Refactor findFittest as nested for loop The functions perform the same instructions either way, but this makes it far clearer (to me, at least) how rad and ang relate to each other, and what the runtime complexity of findFittest is (O(n^2) instead of the O(n) it might appear to be at first glance). --- finders.c | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/finders.c b/finders.c index bf8d398..5aee02e 100644 --- a/finders.c +++ b/finders.c @@ -727,29 +727,26 @@ uint64_t getSpawnDist(const Generator *g, int x, int z) static void findFittest(const Generator *g, Pos *pos, uint64_t *fitness, double maxrad, double step) { - double rad = step, ang = 0; Pos p = *pos; - while (rad <= maxrad) + for (double rad = step; rad <= maxrad; rad += step) { - int x = p.x + (int)(sin(ang) * rad); - int z = p.z + (int)(cos(ang) * rad); - // calc fitness - double d = ((double)x*x + (double)z*z) / (2500*2500); - uint64_t fit = (uint64_t)(d*d * 1e8); - // calculate the distance to the noise points for spawn - fit += getSpawnDist(g, x, z); - if (fit < *fitness) + for (double ang = 0; ang <= PI*2; ang += step/rad) { - pos->x = x; - pos->z = z; - *fitness = fit; + int x = p.x + (int)(sin(ang) * rad); + int z = p.z + (int)(cos(ang) * rad); + // Calcuate portion of fitness dependent on distance from origin + double d = ((double)x*x + (double)z*z) / (2500*2500); + uint64_t fit = (uint64_t)(d*d * 1e8); + // Calculate portion of fitness dependent on climate values + fit += getSpawnDist(g, x, z); + // Then updates pos and fitness if combined total is lower ( = better) than previous best fitness + if (fit < *fitness) + { + pos->x = x; + pos->z = z; + *fitness = fit; + } } - - ang += step / rad; - if (ang <= PI*2) - continue; - ang = 0; - rad += step; } }