void DistributeByLong(SplinePath<FPoint> &path) { //1. Сохраняем предыдущий сплайн SplinePath<FPoint> prev_path = path; path.Clear(); //2. Считаем общую длинну (используем мелкий шаг для большей точности) float fullLenght = 0.f; FPoint prev = prev_path.getGlobalFrame(0.f); int count = prev_path.keys.size()*10.f; for(int i = 1; i <= count; ++i) { float t = float(i)/count; FPoint p = prev_path.getGlobalFrame(t); fullLenght += prev.GetDistanceTo(p); prev = p; } //3. Проходя мелким шагом заносим ключевую точку после каждого преодоления крупного(нужного нам) шага prev = FPoint(prev_path.getGlobalFrame(0.f).x, prev_path.getGlobalFrame(0.f).y); path.addKey(prev); float current_L = 0.f; float dist = 0.f; float dist_limmit = 0.f; const float step = fullLenght/prev_path.keys.size(); const float d_L = step/10.f; //Мелкий шаг на порядок меньше большого while(dist < fullLenght - step) { current_L += d_L; FPoint p = prev_path.getGlobalFrame(current_L/fullLenght); dist += p.GetDistanceTo(prev); dist_limmit += p.GetDistanceTo(prev); if(dist_limmit >= step) { path.addKey(p); dist_limmit = 0.f; } prev = p; } path.addKey(prev_path.getGlobalFrame(1.f)); path.CalculateGradient(); }