Skip to content
Snippets Groups Projects
Select Git revision
  • 97bf32a8b84b7a9ef40b9406802f293e0280814f
  • master default protected
  • blender-v3.6-release
  • main
  • blender-v4.1-release
  • blender-v4.0-release
  • blender-v3.3-release
  • asset-shelf
  • blender-v3.5-release
  • brush-assets-project
  • blender-v2.93-release
  • blender-v3.4-release
  • xr-dev
  • bholodeck-v3.3
  • blender-v3.2-release
  • temp-xr-tracker
  • blender-v3.1-release
  • screenshots-manual
  • gltf_vtree
  • blender-v2.83-release
  • blender-v3.0-release
  • v3.6.18
  • v3.6.19
  • v3.6.20
  • v3.6.21
  • v3.6.22
  • v3.6.23
  • v4.1.1
  • v4.1.0
  • v3.6.10
  • v3.6.11
  • v3.6.12
  • v3.6.13
  • v3.6.14
  • v3.6.15
  • v3.6.16
  • v3.6.17
  • v3.6.9
  • v3.3.16
  • v3.6.8
  • v3.3.15
41 results

add_mesh_aggregate.py

Blame
  • help.cpp 8.16 KiB
    #pragma once
    #include "stdafx.h"
    
    #include "help.h"
    #include "dataParser.h"
    #include <bitset>
    #include <cmath>
    #include <limits>
    #include <random>
    
    using namespace std;
    
    #undef min
    
    void help::trimLeft(string &s, string const &delimiters)
    {
    	const size_t startpos = s.find_first_not_of(delimiters);
    	if (string::npos != startpos)
    	{
    		//s = s.substr(startpos, s.end);
    		s.erase(s.begin(), s.begin() + startpos);
    	}
    }
    
    void help::trimRight(string &s, string const &delimiters)
    {
    	const size_t endpos = s.find_last_not_of(delimiters);
    	if (string::npos != endpos)
    	{
    		//s = s.substr(0, endpos + 1);
    		s.erase(s.begin() + endpos + 1, s.end());
    	}
    }
    
    void help::trim(string &s, string const &delimiters)
    {
    	trimLeft(s, delimiters);
    	trimRight(s, delimiters);
    }
    
    vector<string> help::split(string const& s, char const *d)
    {
    	vector<string> output;
    
    	bitset<255> delims;
    	while (*d)
    	{
    		unsigned char code = *d++;
    		delims[code] = true;
    	}
    
    	string::const_iterator beg;
    	bool in_token = false;
    	for (string::const_iterator it = s.begin(), end = s.end(); it != end; ++it)
    	{
    		if (delims[*it])
    		{
    			if (in_token)
    			{
    				//output.push_back(beg, it);
    				output.push_back(vector<string>::value_type(beg, it));
    				in_token = false;
    			}
    		}
    		else if (!in_token)
    		{
    			beg = it;
    			in_token = true;
    		}
    	}
    	if (in_token)
    		output.push_back(vector<string>::value_type(beg, s.end()));
    
    	return output;
    }
    
    vector<string> help::split1(const string &str, const string &delimiter)
    {
    	vector<string> tokens;
    	size_t prev = 0, pos = 0;
    	do
    	{
    		pos = str.find(delimiter, prev);
    		if (pos == string::npos) pos = str.length();
    		string token = str.substr(prev, pos - prev);
    		if (!token.empty()) tokens.push_back(token);
    		prev = pos + delimiter.length();
    	} while (pos < str.length() && prev < str.length());
    
    	return tokens;
    }
    
    vector<string> help::split2(string const &s, string const &delimiters)
    {
    	vtr<std::string> result;
    	std::string::size_type pos = 0;
    	while (std::string::npos != (pos = s.find_first_not_of(delimiters, pos))) {
    		auto pos2 = s.find_first_of(delimiters, pos);
    		result.emplace_back(s.substr(pos, std::string::npos == pos2 ? pos2 : pos2 - pos));
    		pos = pos2;
    	}
    
    	return result;
    }
    
    vtr2<double> help::convertToDouble(vtr2<string> const &strInput)
    {
    	vtr2<double> dd;
    
    	for (size_t i = 0; i < strInput.size(); i++)
    	{
    		vector<double> d = convertToDouble(strInput[i]);
    		dd.push_back(d);
    	}
    
    	return dd;
    }
    
    vector<double> help::convertToDouble(vector<string> const &strInput)
    {
    	vector<double> d;
    
    	for (size_t i = 0; i < strInput.size(); i++)
    	{
    		d.push_back(stod(strInput[i]));
    	}
    
    	return d;
    }
    
    void help::correctBomLine(string &s)
    {
    	if (s.compare(0, 3, "\xEF\xBB\xBF") == 0)  // Is the file marked as UTF-8?
    	{
    		s.erase(0, 3);                  // Now get rid of the BOM.
    	}
    	else if (s.compare(0, 2, "\xFE\xFF") == 0)  // Is the file marked as UTF-16 BE?
    	{
    		s.erase(0, 2);                  // Now get rid of the BOM.
    	}
    	else if (s.compare(0, 2, "\xFF\xFE") == 0)  // Is the file marked as UTF-16 LE
    	{
    		s.erase(0, 2);                  // Now get rid of the BOM.
    	}
    	else if (s.compare(0, 4, "\x00\x00\xFE\xFF") == 0)  // Is the file marked as UTF-32 BE?
    	{
    		s.erase(0, 4);                  // Now get rid of the BOM.
    	}
    	else if (s.compare(0, 4, "\xFF\xFE\x00\x00") == 0)  // Is the file marked as UTF-32 LE?
    	{
    		s.erase(0, 4);                  // Now get rid of the BOM.
    	}
    }
    
    void help::interpolate(vtr3<double> &input)
    {
    	int maxLen = -1;
    
    	for (auto const &s : input)
    	{
    		if ((int)s.size() > maxLen)
    			maxLen = (int)s.size();
    	}
    
    	for (size_t i = 0; i < input.size(); i++)
    	{
    		int diff = maxLen - (int)input[i].size();
    		//int half = maxLen / 2;
    		
    		while (diff > 0)
    		{
    			int c = 0;
    			vtr2<double> row;
    			for(size_t k = 0; k < input[i].size() - 1 && diff > 0; k++)
    			{
    				vector<double> el;
    				
    				if (k % 2 == 1) 
    				{
    					for (size_t j = 0; j < input[i][k].size(); j++)
    					{
    						double tmp = (input[i][c - 1][j] + input[i][c][j]) / 2.0;
    						el.push_back(tmp);
    					}
    					
    					row.push_back(el);
    					diff--;
    				}
    				else
    				{
    					row.push_back(input[i][c]);                
    					c++;
    				}
    
    			}
    			row.insert(row.end(), input[i].begin() + c, input[i].end());
    			input[i] = row;
    		}
    	}
    }
    
    void help::normalizeMany(vtr3<double> &input)
    {
    	for (size_t i = 0; i < input.size(); i++) //dims
    	{
    		normalize(input[i]);
    	}
    }
    
    void help::normalize(vtr2<double> &input)
    {
    	for (size_t i = 0; i < input[0].size(); i++) //dims
    	{
    		double mean = 0;
    		for (size_t j = 0; j < input.size(); j++) //lenght of sequence
    		{
    			mean += input[j][i];
    		}
    		mean = abs(mean / (double)input.size());
    		//mean = abs(mean);
    				
    		for (size_t j = 0; j < input.size(); j++) //lenght of sequence
    		{
    			input[j][i] = input[j][i] / mean;
    		}
    	}
    }
    
    void help::normalizeZeroOne(vtr3<double> &input, double max)
    {
    	for (size_t i = 0; i < input.size(); i++)
    	{
    		for (size_t j = 0; j < input[i].size(); j++)
    		{
    			for (size_t k = 0; k < input[i][j].size(); k++)
    			{
    				input[i][j][k] /= max;
    			}
    		}
    	}
    }
    
    vtr3<double> help::separateSequence(vtr3<double> const &input, int size)
    {
    	vtr3<double> output;
    
    	for (int i = 0; i < size; i++)
    	{
    		auto tmp = separateSequenceOne(input[i]);
    		output.insert(output.end(), tmp.begin(), tmp.end());
    	}
    
    	return output;
    }
    
    vtr3<double> help::separateSequenceOne(vtr2<double> const &input)
    {
    	vtr3<double> output;
    
    	const size_t dims = input[0].size();
    
    	for (size_t i = 0; i < dims; i++)
    	{
    		vtr2<double> sequence;
    		sequence.reserve(input.size());
    		for (size_t j = 0; j < input.size(); j++)
    		{
    			vector<double> el(1);
    			el[0] = input[j][i];
    			sequence.push_back(el);
    		}
    		output.push_back(sequence);
    	}
    
    	return output;
    }
    
    void help::reduce(vtr3<double> &input, int skip)
    {
    	for (size_t i = 0; i < input.size(); i++)
    	{
    		vtr2<double> row;
    		for (size_t j = skip - 1; j < input[i].size(); j += skip)
    		{
    			row.push_back(input[i][j]);
    		}
    		input[i] = row;
    	}
    }
    
    vtr3<double> help::paa(vtr3<double> const &input, int ratio)
    {
    	vtr3<double> output(input.size());
    
    	for (size_t i = 0; i < input.size(); i++)
    	{
    		vtr2<double> s;
    		for (size_t j = 0; j < input[i].size(); j+= ratio)// sequence
    		{
    			vector<double> dim(input[i][j].size());
    	
    			const size_t end = j + ratio >= input[i].size() ? input[i].size() : j + ratio;
    			for (size_t k = 0; k < input[i][j].size(); k++) //all dims
    			{
    				double sum = 0;
    				int merged = 0;
    				for (size_t l = j; l < end; l++) //sum individual groups of dims 
    				{
    					sum += input[i][l][k];
    					merged++;
    				}
    				dim[k] = sum / merged;
    			}
    			s.push_back(dim);
    		}
    		output[i] = s;
    	}    
    
    	return output;
    }
    
    vtr3<double> help::smooth(vtr3<double> const & input, int width)
    {
    	vtr3<double> output(input.size());
    
    	for (size_t i = 0; i < input.size(); i++)
    	{
    		const int dims = (int)input[0][0].size();
    
    		vtr2<double> s;
    		for (int j = 0; j < width - 1; j++)
    		{
    			s.push_back(input[i][j]);
    		}
    
    		for (size_t j = 0; j < input[i].size() - width + 1; j++)// sequence
    		{   
    			vtr<double> sums(dims);
    			for (int k = 0; k < width; k++) //all dims
    			{
    				for (int l = 0; l < dims; l++)
    				{
    					sums[l] += input[i][j + k][l] / width;
    				}
    			}
    			s.push_back(sums);
    		}
    		output[i] = s;
    	}
    
    	return output;
    }
    
    std::string help::stripFileNameFromPath(std::string path)
    {
    	string folder = path.substr(0, path.find_last_of("\\/"));
    
    	return folder;
    }
    
    double help::getRandom(int min, int max)
    {
    	std::random_device rd;
    	std::mt19937 gen(rd());
    	std::uniform_real_distribution<> dis(min, max);
    
    	return dis(gen);
    }
    
    //static double searchMax(vtr2<double> const &A, int idxStart, int idxEnd)
    //{
    //	double max = numeric_limits<double>::min();
    //
    //	for (size_t i = 0; i < A.size(); i++)
    //	{
    //		double sum = 0;
    //		for (size_t j = 0; j < A[i].size(); j++)
    //		{
    //			sum += A[i][j];
    //		}
    //
    //		if (minA > sum)
    //			minA = sum;
    //	}
    //}
    //
    //
    //static double searchMin(int idxStart, int idxEnd)
    
    //template<class T>
    //void help::mark(node<T>** const &m, size_t row, size_t col)
    //{
    //    for (size_t i = 1; i < row; i++)
    //    {
    //        for (size_t j = 1; j < col; j++)
    //        {
    //            if (m[i][j].size > m[i + 1][j].size && m[i][j].size > m[i][j + 1].size) {
    //                if (m[i + 1][j].size == m[i][j + 1].size)
    //                    m[i][j].size++;
    //            }                
    //        }
    //    }
    //}