/* Minetest-c55 Copyright (C) 2010 celeron55, Perttu Ahola This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* (c) 2010 Perttu Ahola */ #include "utility.h" #include "irrlichtwrapper.h" #include "gettime.h" TimeTaker::TimeTaker(const char *name, u32 *result) { m_name = name; m_result = result; m_running = true; m_time1 = getTimeMs(); } u32 TimeTaker::stop(bool quiet) { if(m_running) { u32 time2 = getTimeMs(); u32 dtime = time2 - m_time1; if(m_result != NULL) { (*m_result) += dtime; } else { if(quiet == false) std::cout< near_list; 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_list.size() == 0) { near_list.push_back(df); continue; } // Get distance of farthest in near list u32 near_d = 100000; if(near_list.size() > 0) { core::list::Iterator i = near_list.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_list.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_list.begin(); for(; i != near_list.end(); i++) { // Stop when i is at the first nearer node if(i->d < d) break; } // Add df to before i if(i == near_list.end()) near_list.push_back(df); else near_list.insert_before(i, df); // Keep near list at right size if(near_list.size() > near_wanted_count) { core::list::Iterator j = near_list.begin(); near_list.erase(j); } } } // Return if no values found if(near_list.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_list.begin(); i != near_list.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="<