From 7068bc90af1f452359a1fcfe20fa01fc88f3d70a Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Sun, 16 Jan 2011 19:32:14 +0200 Subject: Initial commit of mapgen v.2. Lacks configuration and saving to disk. --- src/utility.cpp | 226 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 226 insertions(+) (limited to 'src/utility.cpp') diff --git a/src/utility.cpp b/src/utility.cpp index 924324b90..d6ca48153 100644 --- a/src/utility.cpp +++ b/src/utility.cpp @@ -102,4 +102,230 @@ void mysrand(unsigned seed) next = seed; } +// Float with distance +struct DFloat +{ + float v; + u32 d; +}; + +float PointAttributeList::getInterpolatedFloat(v3s16 p) +{ + const u32 near_wanted_count = 5; + // Last is nearest, first is farthest + core::list near; + + for(core::list::Iterator + i = m_points.begin(); + i != m_points.end(); i++) + { + PointWithAttr &pwa = *i; + u32 d = pwa.p.getDistanceFrom(p); + + DFloat df; + df.v = pwa.attr.getFloat(); + df.d = d; + + // If near list is empty, add directly and continue + if(near.size() == 0) + { + near.push_back(df); + continue; + } + + // Get distance of farthest in near list + u32 near_d = 100000; + if(near.size() > 0) + { + core::list::Iterator i = near.begin(); + near_d = i->d; + } + + /* + If point is closer than the farthest in the near list or + there are not yet enough points on the list + */ + if(d < near_d || near.size() < near_wanted_count) + { + // Find the right place in the near list and put it there + + // Go from farthest to near in the near list + core::list::Iterator i = near.begin(); + for(; i != near.end(); i++) + { + // Stop when i is at the first nearer node + if(i->d < d) + break; + } + // Add df to before i + if(i == near.end()) + near.push_back(df); + else + near.insert_before(i, df); + + // Keep near list at right size + if(near.size() > near_wanted_count) + { + core::list::Iterator j = near.begin(); + near.erase(j); + } + } + } + + // Return if no values found + if(near.size() == 0) + return 0.0; + + /* +20:58:29 < tejeez> joka pisteelle a += arvo / etäisyys^6; b += 1 / etäisyys^6; ja +lopuks sit otetaan a/b + */ + + float a = 0; + float b = 0; + for(core::list::Iterator i = near.begin(); + i != near.end(); i++) + { + if(i->d == 0) + return i->v; + + //float dd = pow((float)i->d, 6); + float dd = pow((float)i->d, 5); + float v = i->v; + //dstream<<"dd="<d="<d<<" nearest_d_sum="<