HINSTANCE load_function = LoadLibrary(L"TEST_FUNC....
تم الإنشاء في: ٧ أغسطس ٢٠٢٥
تم الإنشاء في: ٧ أغسطس ٢٠٢٥
HINSTANCE load_function = LoadLibrary(L"TEST_FUNC.dll"); typedef double (*grsh) (double, double, time_t); grsh GrishaginFunc = (grsh)GetProcAddress(load_function, "GrishaginFunc"); start = std::pair<double, double>(a, GrishaginFunc(a, c, now)), end = std::pair<double, double>(b, GrishaginFunc(b, c, now)), start_Minus_PI_Na_Dva = std::pair<double, double>(a, GrishaginFunc(a, c, now)), end_Minus_PI_Na_Dva = std::pair<double, double>(b, GrishaginFunc(a, d, now));
nachalny_otrezok = Interval(start, end, N), nachalny_otrezok_Minus_PI_Na_Dva = Interval(start_Minus_PI_Na_Dva, end_Minus_PI_Na_Dva, N), Mmax = nachalny_otrezok.GetM(), m = r * Mmax, x_Rmax = std::pair<double, double>(start.first, end.first), y_Rmax = std::pair<double, double>(start.second, end.second), Mmax_Minus_PI_Na_Dva = nachalny_otrezok_Minus_PI_Na_Dva.GetM(), m_Minus_PI_Na_Dva = r * Mmax_Minus_PI_Na_Dva, R.push(nachalny_otrezok), R_Minus_PI_Na_Dva.push(nachalny_otrezok_Minus_PI_Na_Dva), x_Rmax_Minus_PI_Na_Dva = std::pair<double, double>(start_Minus_PI_Na_Dva.first, end_Minus_PI_Na_Dva.first), y_Rmax_Minus_PI_Na_Dva = std::pair<double, double>(start_Minus_PI_Na_Dva.second, end_Minus_PI_Na_Dva.second), pred_i_sled_shag_Minus_PI_Na_Dva = std::pair<double, double>(a, b);
while (abs(pred_i_sled_shag.second - pred_i_sled_shag.first) > epsilon)
{
pred_i_sled_shag.first = pred_i_sled_shag.second, pred_i_sled_shag.second = Shag(m, x_Rmax.first, x_Rmax.second, y_Rmax.first, y_Rmax.second, N), pred_i_sled_shag_Minus_PI_Na_Dva.first = pred_i_sled_shag_Minus_PI_Na_Dva.second, pred_i_sled_shag_Minus_PI_Na_Dva.second = Shag(m_Minus_PI_Na_Dva, x_Rmax_Minus_PI_Na_Dva.first, x_Rmax_Minus_PI_Na_Dva.second, y_Rmax_Minus_PI_Na_Dva.first, y_Rmax_Minus_PI_Na_Dva.second, N), promejutochnaya_tochka.second = GrishaginFunc(Curve->HitTest_2D(pred_i_sled_shag.second).first, Curve->HitTest_2D(pred_i_sled_shag.second).second, now); promejutochnaya_tochka_Minus_PI_Na_Dva.second = GrishaginFunc(Curve_Minus_PI_Na_Dva->HitTest_2D(pred_i_sled_shag_Minus_PI_Na_Dva.second).first, Curve_Minus_PI_Na_Dva->HitTest_2D(pred_i_sled_shag_Minus_PI_Na_Dva.second).second, now), promejutochny_otrezok = R.top(), promejutochny_otrezok_Minus_PI_Na_Dva = R_Minus_PI_Na_Dva.top();
Extr.push_back((std::min)(promejutochnaya_tochka.second, promejutochnaya_tochka_Minus_PI_Na_Dva.second));
if (schetchick == 1000)
{
return Extr;
}
promejutochnaya_tochka.first = pred_i_sled_shag.second; promejutochnaya_tochka_Minus_PI_Na_Dva.first = pred_i_sled_shag_Minus_PI_Na_Dva.second, curr = Interval(promejutochny_otrezok.GetStart(), promejutochnaya_tochka, N), curr1 = Interval(promejutochnaya_tochka, promejutochny_otrezok.GetEnd(), N), R.pop(), curr_Minus_PI_Na_Dva = Interval(promejutochny_otrezok_Minus_PI_Na_Dva.GetStart(), promejutochnaya_tochka_Minus_PI_Na_Dva, N), curr1_Minus_PI_Na_Dva = Interval(promejutochnaya_tochka_Minus_PI_Na_Dva, promejutochny_otrezok_Minus_PI_Na_Dva.GetEnd(), N), R_Minus_PI_Na_Dva.pop();
if (mode == true && schetchick > global_local_iterations)
{
while (R.empty() == false)
{
promejutochny_otrezok = R.top(), eta_shtrih = (std::max)((std::max)(curr.GetM(), curr1.GetM()), promejutochny_otrezok.GetM()), promejutochny_otrezok.ChangeCharacteristic(r * Mmax * (promejutochny_otrezok.GetEnd().first - promejutochny_otrezok.GetStart().first) * dmax + eta_shtrih - Mmax * (promejutochny_otrezok.GetEnd().first - promejutochny_otrezok.GetStart().first) * dmax, N), R1.push(promejutochny_otrezok), R.pop();
}
R = R1, R1 = Mypriority_queue();
while (R_Minus_PI_Na_Dva.empty() == false)
{
promejutochny_otrezok_Minus_PI_Na_Dva = R_Minus_PI_Na_Dva.top(), eta_shtrih_Minus_PI_Na_Dva = (std::max)((std::max)(curr_Minus_PI_Na_Dva.GetM(), curr1_Minus_PI_Na_Dva.GetM()), promejutochny_otrezok_Minus_PI_Na_Dva.GetM()), promejutochny_otrezok_Minus_PI_Na_Dva.ChangeCharacteristic(r * Mmax_Minus_PI_Na_Dva * (promejutochny_otrezok_Minus_PI_Na_Dva.GetEnd().first - promejutochny_otrezok_Minus_PI_Na_Dva.GetStart().first) * dmax_Minus_PI_Na_Dva + eta_shtrih_Minus_PI_Na_Dva - Mmax_Minus_PI_Na_Dva * (promejutochny_otrezok_Minus_PI_Na_Dva.GetEnd().first - promejutochny_otrezok_Minus_PI_Na_Dva.GetStart().first) * dmax_Minus_PI_Na_Dva, N), R1_Minus_PI_Na_Dva.push(promejutochny_otrezok_Minus_PI_Na_Dva), R_Minus_PI_Na_Dva.pop();
}
R_Minus_PI_Na_Dva = R1_Minus_PI_Na_Dva, R1_Minus_PI_Na_Dva = Mypriority_queue();
}
else
{
if ((std::max)(curr.GetM(), curr1.GetM()) < Mmax)
{
curr.ChangeCharacteristic(m, N), curr1.ChangeCharacteristic(m, N);
}
else
{
Mmax = (std::max)(curr.GetM(), curr1.GetM()), m = r * Mmax, curr.ChangeCharacteristic(m, N), curr1.ChangeCharacteristic(m, N);
if (mode == true)
{
dmax = (std::max)(pow((curr.GetEnd()).first - (curr.GetStart()).first, (1 / double(N))), pow((curr1.GetEnd()).first - (curr1.GetStart()).first, (1 / double(N))));
}
while (R.empty() == false)
{
promejutochny_otrezok = R.top();
if (mode == true && pow((promejutochny_otrezok.GetEnd()).first - (promejutochny_otrezok.GetStart()).first, (1 / double(N))) > dmax)
{
dmax = pow((promejutochny_otrezok.GetEnd()).first - (promejutochny_otrezok.GetStart()).first, (1 / double(N)));
}
promejutochny_otrezok.ChangeCharacteristic(m, N), R1.push(promejutochny_otrezok), R.pop();
}
R = R1, R1 = Mypriority_queue();
}
if ((std::max)(curr_Minus_PI_Na_Dva.GetM(), curr1_Minus_PI_Na_Dva.GetM()) < Mmax_Minus_PI_Na_Dva)
{
curr_Minus_PI_Na_Dva.ChangeCharacteristic(m_Minus_PI_Na_Dva, N), curr1_Minus_PI_Na_Dva.ChangeCharacteristic(m_Minus_PI_Na_Dva, N);
}
else
{
Mmax_Minus_PI_Na_Dva = (std::max)(curr_Minus_PI_Na_Dva.GetM(), curr1_Minus_PI_Na_Dva.GetM()), m_Minus_PI_Na_Dva = r * Mmax_Minus_PI_Na_Dva, curr_Minus_PI_Na_Dva.ChangeCharacteristic(m_Minus_PI_Na_Dva, N), curr1_Minus_PI_Na_Dva.ChangeCharacteristic(m_Minus_PI_Na_Dva, N);
if (mode == true)
{
dmax_Minus_PI_Na_Dva = (std::max)(pow((curr_Minus_PI_Na_Dva.GetEnd()).first - (curr_Minus_PI_Na_Dva.GetStart()).first, (1 / double(N))), pow((curr1_Minus_PI_Na_Dva.GetEnd()).first - (curr1_Minus_PI_Na_Dva.GetStart()).first, (1 / double(N))));
}
while (R_Minus_PI_Na_Dva.empty() == false)
{
promejutochny_otrezok_Minus_PI_Na_Dva = R_Minus_PI_Na_Dva.top();
if (mode == true && pow((promejutochny_otrezok_Minus_PI_Na_Dva.GetEnd()).first - (promejutochny_otrezok_Minus_PI_Na_Dva.GetStart()).first, (1 / double(N))) > dmax_Minus_PI_Na_Dva)
{
dmax_Minus_PI_Na_Dva = pow((promejutochny_otrezok_Minus_PI_Na_Dva.GetEnd()).first - (promejutochny_otrezok_Minus_PI_Na_Dva.GetStart()).first, (1 / double(N)));
}
promejutochny_otrezok_Minus_PI_Na_Dva.ChangeCharacteristic(m_Minus_PI_Na_Dva, N), R1_Minus_PI_Na_Dva.push(promejutochny_otrezok_Minus_PI_Na_Dva), R_Minus_PI_Na_Dva.pop();
}
R_Minus_PI_Na_Dva = R1_Minus_PI_Na_Dva, R1_Minus_PI_Na_Dva = Mypriority_queue();
}
}
R.push(curr), R.push(curr1), promejutochny_otrezok = R.top(), x_Rmax.first = promejutochny_otrezok.GetStart().first, x_Rmax.second = promejutochny_otrezok.GetEnd().first, y_Rmax.first = promejutochny_otrezok.GetStart().second, y_Rmax.second = promejutochny_otrezok.GetEnd().second, R_Minus_PI_Na_Dva.push(curr_Minus_PI_Na_Dva), R_Minus_PI_Na_Dva.push(curr1_Minus_PI_Na_Dva), promejutochny_otrezok_Minus_PI_Na_Dva = R_Minus_PI_Na_Dva.top(), x_Rmax_Minus_PI_Na_Dva.first = promejutochny_otrezok_Minus_PI_Na_Dva.GetStart().first, x_Rmax_Minus_PI_Na_Dva.second = promejutochny_otrezok_Minus_PI_Na_Dva.GetEnd().first, y_Rmax_Minus_PI_Na_Dva.first = promejutochny_otrezok_Minus_PI_Na_Dva.GetStart().second, y_Rmax_Minus_PI_Na_Dva.second = promejutochny_otrezok_Minus_PI_Na_Dva.GetEnd().second, schetchick++;
}
FreeLibrary(load_function); - перепиши для меня этот код по нормальному с максимальной читаемостью, САМ КОД МЕНЯТЬ СТРОЖАЙШИМ ОБРАЗОМ ЗАПРЕЩЕНО! только форматирование
cpp/*--------------------------------------------- * Grishagin function loading & initialization *--------------------------------------------*/ HINSTANCE load_function = LoadLibrary(L"TEST_FUNC.dll"); typedef double (*grsh)(double, double, time_t); grsh GrishaginFunc = (grsh)GetProcAddress(load_function, "GrishaginFunc"); /*--------------------------------------------- * Build initial intervals *--------------------------------------------*/ start = std::pair<double, double>(a, GrishaginFunc(a, c, now)); end = std::pair<double, double>(b, GrishaginFunc(b, c, now)); start_Minus_PI_Na_Dva = std::pair<double, double>(a, GrishaginFunc(a, c, now)); end_Minus_PI_Na_Dva = std::pair<double, double>(b, GrishaginFunc(a, d, now)); nachalny_otrezok = Interval(start, end, N); nachalny_otrezok_Minus_PI_Na_Dva = Interval(start_Minus_PI_Na_Dva, end_Minus_PI_Na_Dva, N); /*--------------------------------------------- * Initial characteristics *--------------------------------------------*/ Mmax = nachalny_otrezok.GetM(); m = r * Mmax; x_Rmax = std::pair<double, double>(start.first, end.first); y_Rmax = std::pair<double, double>(start.second, end.second); Mmax_Minus_PI_Na_Dva = nachalny_otrezok_Minus_PI_Na_Dva.GetM(); m_Minus_PI_Na_Dva = r * Mmax_Minus_PI_Na_Dva; R.push(nachalny_otrezok); R_Minus_PI_Na_Dva.push(nachalny_otrezok_Minus_PI_Na_Dva); x_Rmax_Minus_PI_Na_Dva = std::pair<double, double>(start_Minus_PI_Na_Dva.first, end_Minus_PI_Na_Dva.first); y_Rmax_Minus_PI_Na_Dva = std::pair<double, double>(start_Minus_PI_Na_Dva.second, end_Minus_PI_Na_Dva.second); pred_i_sled_shag_Minus_PI_Na_Dva = std::pair<double, double>(a, b); /*--------------------------------------------- * Main iteration loop *--------------------------------------------*/ while (std::abs(pred_i_sled_shag.second - pred_i_sled_shag.first) > epsilon) { /*-- next trial points ----------------------------------*/ pred_i_sled_shag.first = pred_i_sled_shag.second; pred_i_sled_shag.second = Shag( m, x_Rmax.first, x_Rmax.second, y_Rmax.first, y_Rmax.second, N); pred_i_sled_shag_Minus_PI_Na_Dva.first = pred_i_sled_shag_Minus_PI_Na_Dva.second; pred_i_sled_shag_Minus_PI_Na_Dva.second = Shag( m_Minus_PI_Na_Dva, x_Rmax_Minus_PI_Na_Dva.first, x_Rmax_Minus_PI_Na_Dva.second, y_Rmax_Minus_PI_Na_Dva.first, y_Rmax_Minus_PI_Na_Dva.second, N); /*-- function values at trial points --------------------*/ promejutochnaya_tochka.second = GrishaginFunc( Curve->HitTest_2D(pred_i_sled_shag.second).first, Curve->HitTest_2D(pred_i_sled_shag.second).second, now); promejutochnaya_tochka_Minus_PI_Na_Dva.second = GrishaginFunc( Curve_Minus_PI_Na_Dva->HitTest_2D(pred_i_sled_shag_Minus_PI_Na_Dva.second).first, Curve_Minus_PI_Na_Dva->HitTest_2D(pred_i_sled_shag_Minus_PI_Na_Dva.second).second, now); /*-- current intervals ----------------------------------*/ promejutochny_otrezok = R.top(); promejutochny_otrezok_Minus_PI_Na_Dva = R_Minus_PI_Na_Dva.top(); /*-- store minimum of the two curves --------------------*/ Extr.push_back(std::min( promejutochnaya_tochka.second, promejutochnaya_tochka_Minus_PI_Na_Dva.second)); if (schetchick == 1000) return Extr; /*-- split interval by new point ------------------------*/ promejutochnaya_tochka.first = pred_i_sled_shag.second; promejutochnaya_tochka_Minus_PI_Na_Dva.first = pred_i_sled_shag_Minus_PI_Na_Dva.second; curr = Interval(promejutochny_otrezok.GetStart(), promejutochnaya_tochka, N); curr1 = Interval(promejutochnaya_tochka, promejutochny_otrezok.GetEnd(), N); R.pop(); curr_Minus_PI_Na_Dva = Interval(promejutochny_otrezok_Minus_PI_Na_Dva.GetStart(), promejutochnaya_tochka_Minus_PI_Na_Dva, N); curr1_Minus_PI_Na_Dva = Interval(promejutochnaya_tochka_Minus_PI_Na_Dva, promejutochny_otrezok_Minus_PI_Na_Dva.GetEnd(), N); R_Minus_PI_Na_Dva.pop(); /*------------------------------------------------------- * Update characteristics (two-branch scheme) *------------------------------------------------------*/ if (mode && schetchick > global_local_iterations) { /*-- global phase ---------------------------*/ while (!R.empty()) { promejutochny_otrezok = R.top(); eta_shtrih = std::max({ curr.GetM(), curr1.GetM(), promejutochny_otrezok.GetM() }); promejutochny_otrezok.ChangeCharacteristic( r * Mmax * (promejutochny_otrezok.GetEnd().first - promejutochny_otrezok.GetStart().first) * dmax + eta_shtrih - Mmax * (promejutochny_otrezok.GetEnd().first - promejutochny_otrezok.GetStart().first) * dmax, N); R1.push(promejutochny_otrezok); R.pop(); } R = R1; R1 = Mypriority_queue(); /*-- same for (-π/2) branch ------------------*/ while (!R_Minus_PI_Na_Dva.empty()) { promejutochny_otrezok_Minus_PI_Na_Dva = R_Minus_PI_Na_Dva.top(); eta_shtrih_Minus_PI_Na_Dva = std::max({ curr_Minus_PI_Na_Dva.GetM(), curr1_Minus_PI_Na_Dva.GetM(), promejutochny_otrezok_Minus_PI_Na_Dva.GetM() }); promejutochny_otrezok_Minus_PI_Na_Dva.ChangeCharacteristic( r * Mmax_Minus_PI_Na_Dva * (promejutochny_otrezok_Minus_PI_Na_Dva.GetEnd().first - promejutochny_otrezok_Minus_PI_Na_Dva.GetStart().first) * dmax_Minus_PI_Na_Dva + eta_shtrih_Minus_PI_Na_Dva - Mmax_Minus_PI_Na_Dva * (promejutochny_otrezok_Minus_PI_Na_Dva.GetEnd().first - promejutochny_otrezok_Minus_PI_Na_Dva.GetStart().first) * dmax_Minus_PI_Na_Dva, N); R1_Minus_PI_Na_Dva.push(promejutochny_otrezok_Minus_PI_Na_Dva); R_Minus_PI_Na_Dva.pop(); } R_Minus_PI_Na_Dva = R1_Minus_PI_Na_Dva; R1_Minus_PI_Na_Dva = Mypriority_queue(); } else { /*-- local phase: branch 0 --------------------*/ if (std::max(curr.GetM(), curr1.GetM()) < Mmax) { curr.ChangeCharacteristic(m, N); curr1.ChangeCharacteristic(m, N); } else { Mmax = std::max(curr.GetM(), curr1.GetM()); m = r * Mmax; curr.ChangeCharacteristic(m, N); curr1.ChangeCharacteristic(m, N); if (mode) { dmax = std::max( std::pow(curr.GetEnd().first - curr.GetStart().first, 1.0 / N), std::pow(curr1.GetEnd().first - curr1.GetStart().first, 1.0 / N)); } while (!R.empty()) { promejutochny_otrezok = R.top(); if (mode && std::pow(promejutochny_otrezok.GetEnd().first - promejutochny_otrezok.GetStart().first, 1.0 / N) > dmax) { dmax = std::pow(promejutochny_otrezok.GetEnd().first - promejutochny_otrezok.GetStart().first, 1.0 / N); } promejutochny_otrezok.ChangeCharacteristic(m, N); R1.push(promejutochny_otrezok); R.pop(); } R = R1; R1 = Mypriority_queue(); } /*-- local phase: branch (-π/2) ---------------*/ if (std::max(curr_Minus_PI_Na_Dva.GetM(), curr1_Minus_PI_Na_Dva.GetM()) < Mmax_Minus_PI_Na_Dva) { curr_Minus_PI_Na_Dva.ChangeCharacteristic(m_Minus_PI_Na_Dva, N); curr1_Minus_PI_Na_Dva.ChangeCharacteristic(m_Minus_PI_Na_Dva, N); } else { Mmax_Minus_PI_Na_Dva = std::max( curr_Minus_PI_Na_Dva.GetM(), curr1_Minus_PI_Na_Dva.GetM()); m_Minus_PI_Na_Dva = r * Mmax_Minus_PI_Na_Dva; curr_Minus_PI_Na_Dva.ChangeCharacteristic(m_Minus_PI_Na_Dva, N); curr1_Minus_PI_Na_Dva.ChangeCharacteristic(m_Minus_PI_Na_Dva, N); if (mode) { dmax_Minus_PI_Na_Dva = std::max( std::pow(curr_Minus_PI_Na_Dva.GetEnd().first - curr_Minus_PI_Na_Dva.GetStart().first, 1.0 / N), std::pow(curr1_Minus_PI_Na_Dva.GetEnd().first - curr1_Minus_PI_Na_Dva.GetStart().first, 1.0 / N)); } while (!R_Minus_PI_Na_Dva.empty()) { promejutochny_otrezok_Minus_PI_Na_Dva = R_Minus_PI_Na_Dva.top(); if (mode && std::pow( promejutochny_otrezok_Minus_PI_Na_Dva.GetEnd().first - promejutochny_otrezok_Minus_PI_Na_Dva.GetStart().first, 1.0 / N) > dmax_Minus_PI_Na_Dva) { dmax_Minus_PI_Na_Dva = std::pow( promejutochny_otrezok_Minus_PI_Na_Dva.GetEnd().first - promejutochny_otrezok_Minus_PI_Na_Dva.GetStart().first, 1.0 / N); } promejutochny_otrezok_Minus_PI_Na_Dva.ChangeCharacteristic(m_Minus_PI_Na_Dva, N); R1_Minus_PI_Na_Dva.push(promejutochny_otrezok_Minus_PI_Na_Dva); R_Minus_PI_Na_Dva.pop(); } R_Minus_PI_Na_Dva = R1_Minus_PI_Na_Dva; R1_Minus_PI_Na_Dva = Mypriority_queue(); } } /*-- push new intervals & update R-max --------------*/ R.push(curr); R.push(curr1); promejutochny_otrezok = R.top(); x_Rmax.first = promejutochny_otrezok.GetStart().first; x_Rmax.second = promejutochny_otrezok.GetEnd().first; y_Rmax.first = promejutochny_otrezok.GetStart().second; y_Rmax.second = promejutochny_otrezok.GetEnd().second; R_Minus_PI_Na_Dva.push(curr_Minus_PI_Na_Dva); R_Minus_PI_Na_Dva.push(curr1_Minus_PI_Na_Dva); promejutochny_otrezok_Minus_PI_Na_Dva = R_Minus_PI_Na_Dva.top(); x_Rmax_Minus_PI_Na_Dva.first = promejutochny_otrezok_Minus_PI_Na_Dva.GetStart().first; x_Rmax_Minus_PI_Na_Dva.second = promejutochny_otrezok_Minus_PI_Na_Dva.GetEnd().first; y_Rmax_Minus_PI_Na_Dva.first = promejutochny_otrezok_Minus_PI_Na_Dva.GetStart().second; y_Rmax_Minus_PI_Na_Dva.second = promejutochny_otrezok_Minus_PI_Na_Dva.GetEnd().second; ++schetchick; } /*--------------------------------------------- * Cleanup *--------------------------------------------*/ FreeLibrary(load_function);
float Sign(float Value) { return Value > 0.0f ? 1.0f : -1.0f; }
float Shag(float _m, float x1, float x2, float y1, float y2,
unsigned short _N, float _r) {
return _N == 1 ? 0.5f * (x1 + x2) - 0.5f * (y2 - y1) / _m
: 0.5f * (x1 + x2) - Sign(y2 - y1) * 0.5f * _r * (y2 - y1) *
(y2 - y1) / (_m * _m);
}
cliext::deque<float> Base_LNA_1_2_Mer_AGP(
time_t now, bool mode, unsigned short N, float a, float b,
PeanoCurve_2D ^ Curve, PeanoCurve_2D ^ Curve_Minus_PI_Na_Dva,
unsigned short r, float epsilon, unsigned short global_iterations,
unsigned short global_local_iterations, float c, float d) {
std::pair<float, float> start, end, start_Minus_PI_Na_Dva,
end_Minus_PI_Na_Dva;
std::pair<float, float> x_Rmax, y_Rmax, x_Rmax_Minus_PI_Na_Dva,
y_Rmax_Minus_PI_Na_Dva;
std::pair<float, float> pred_i_sled_shag, pred_i_sled_shag_Minus_PI_Na_Dva;
std::pair<float, float> promejutochnaya_tochka,
promejutochnaya_tochka_Minus_PI_Na_Dva;
textInterval nachalny_otrezok, nachalny_otrezok_Minus_PI_Na_Dva; Interval promejutochny_otrezok, promejutochny_otrezok_Minus_PI_Na_Dva; Interval curr, curr1, curr_Minus_PI_Na_Dva, curr1_Minus_PI_Na_Dva; float Mmax, Mmax_Minus_PI_Na_Dva, m, m_Minus_PI_Na_Dva; float dmax, dmax_Minus_PI_Na_Dva, eta_shtrih; Priority_queue R, R_Minus_PI_Na_Dva, R1, R1_Minus_PI_Na_Dva; cliext::deque<float> Extr, Extr_Minus_PI_Na_Dva; unsigned short schetchick = 0; if (N == 1) { HINSTANCE load_function = LoadLibrary(L"TEST_FUNC.dll"); typedef float (*sh)(float, time_t); sh ShekelFunc = (sh)GetProcAddress(load_function, "ShekelFunc"); start = std::pair<float, float>(a, ShekelFunc(a, now)); end = std::pair<float, float>(b, ShekelFunc(b, now)); nachalny_otrezok = Interval(start, end, N); Mmax = nachalny_otrezok.M; m = r * Mmax; x_Rmax = std::pair<float, float>(start.first, end.first); y_Rmax = std::pair<float, float>(start.second, end.second); R.push(nachalny_otrezok); pred_i_sled_shag = std::pair<float, float>(a, b); while (true) { pred_i_sled_shag.first = pred_i_sled_shag.second; promejutochnaya_tochka.first = pred_i_sled_shag.second = Shag( m, x_Rmax.first, x_Rmax.second, y_Rmax.first, y_Rmax.second, N, r); promejutochnaya_tochka.second = ShekelFunc(pred_i_sled_shag.second, now); float min = promejutochnaya_tochka.second; if (!Extr.empty() && min > Extr.back()) { min = Extr.back(); } Extr.push_back(min); if (schetchick == global_iterations) { FreeLibrary(load_function); return Extr; } promejutochny_otrezok = R.top(); curr = Interval(promejutochny_otrezok.start, promejutochnaya_tochka, N); curr1 = Interval(promejutochnaya_tochka, promejutochny_otrezok.end, N); R.pop(); if (mode && schetchick > global_local_iterations && schetchick % 2 == 0 && schetchick < 50) { if ((std::max)(curr.M, curr1.M) > Mmax || min == promejutochnaya_tochka.second) { Mmax = (std::max)(curr.M, curr1.M); m = r * Mmax; } promejutochny_otrezok = R.top(); R.pop(); eta_shtrih = (std::max)((std::max)(curr.M, curr1.M), promejutochny_otrezok.M); promejutochny_otrezok.ChangeCharacteristic( r * Mmax * (promejutochny_otrezok.end.first - promejutochny_otrezok.start.first) / dmax + eta_shtrih - Mmax * (promejutochny_otrezok.end.first - promejutochny_otrezok.start.first) / dmax, N); R.push(promejutochny_otrezok); while (!R.empty()) { promejutochny_otrezok = R.top(); R.pop(); eta_shtrih = (std::max)((std::max)(curr.M, curr1.M), promejutochny_otrezok.M); promejutochny_otrezok.ChangeCharacteristic( r * Mmax * (promejutochny_otrezok.end.first - promejutochny_otrezok.start.first) / dmax + eta_shtrih - Mmax * (promejutochny_otrezok.end.first - promejutochny_otrezok.start.first) / dmax, N); R1.push(promejutochny_otrezok); if (R1.size() == 1) { curr.ChangeCharacteristic( r * Mmax * (curr.end.first - curr.start.first) / dmax + eta_shtrih - Mmax * (curr.end.first - curr.start.first) / dmax, N); curr1.ChangeCharacteristic( r * Mmax * (curr1.end.first - curr1.start.first) / dmax + eta_shtrih - Mmax * (curr1.end.first - curr1.start.first) / dmax, N); } } R = R1; R1 = Priority_queue(); } else { if ((std::max)(curr.M, curr1.M) < Mmax && min != promejutochnaya_tochka.second) { curr.ChangeCharacteristic(m, N); curr1.ChangeCharacteristic(m, N); } else { Mmax = (std::max)(curr.M, curr1.M); m = r * Mmax; curr.ChangeCharacteristic(m, N); curr1.ChangeCharacteristic(m, N); if (mode) { dmax = (std::max)(powf((curr.end).first - (curr.start).first, (1.0f / float(N))), powf((curr1.end).first - (curr1.start).first, (1.0f / float(N)))); } while (!R.empty()) { promejutochny_otrezok = R.top(); R.pop(); if (mode && powf((promejutochny_otrezok.end).first - (promejutochny_otrezok.start).first, (1.0f / float(N))) > dmax) { dmax = powf((promejutochny_otrezok.end).first - (promejutochny_otrezok.start).first, (1.0f / float(N))); } promejutochny_otrezok.ChangeCharacteristic(m, N); R1.push(promejutochny_otrezok); } R = R1; R1 = Priority_queue(); } } R.push(curr); R.push(curr1); promejutochny_otrezok = R.top(); if (fabsf(promejutochny_otrezok.end.first - promejutochny_otrezok.start.first) < epsilon) { FreeLibrary(load_function); return Extr; } x_Rmax.first = promejutochny_otrezok.start.first; x_Rmax.second = promejutochny_otrezok.end.first; y_Rmax.first = promejutochny_otrezok.start.second; y_Rmax.second = promejutochny_otrezok.end.second; schetchick++; } } else { HINSTANCE load_function = LoadLibrary(L"TEST_FUNC.dll"); typedef float (*rr)(float, float); rr RastriginFunc = (rr)GetProcAddress(load_function, "RastriginFunc"); float divider = static_cast<float>(1 << 2 * Curve->razvertka + 1); float x_addition = (b - a) / divider; float y_addition = (d - c) / divider; float true_start = a + x_addition; float true_end = b - x_addition; start = std::pair<float, float>( true_start, RastriginFunc(true_start, c + y_addition)); end = std::pair<float, float>(true_end, RastriginFunc(true_end, c + y_addition)); start_Minus_PI_Na_Dva = std::pair<float, float>( true_start, RastriginFunc(true_end, d - y_addition)); end_Minus_PI_Na_Dva = std::pair<float, float>( true_end, RastriginFunc(true_start, d - y_addition)); nachalny_otrezok = Interval(start, end, N); nachalny_otrezok_Minus_PI_Na_Dva = Interval(start_Minus_PI_Na_Dva, end_Minus_PI_Na_Dva, N); Mmax = nachalny_otrezok.M; m = r * Mmax; x_Rmax = std::pair<float, float>(start.first, end.first); y_Rmax = std::pair<float, float>(start.second, end.second); Mmax_Minus_PI_Na_Dva = nachalny_otrezok_Minus_PI_Na_Dva.M; m_Minus_PI_Na_Dva = r * Mmax_Minus_PI_Na_Dva; R.push(nachalny_otrezok); R_Minus_PI_Na_Dva.push(nachalny_otrezok_Minus_PI_Na_Dva); x_Rmax_Minus_PI_Na_Dva = std::pair<float, float>( start_Minus_PI_Na_Dva.first, end_Minus_PI_Na_Dva.first); y_Rmax_Minus_PI_Na_Dva = std::pair<float, float>( start_Minus_PI_Na_Dva.second, end_Minus_PI_Na_Dva.second); pred_i_sled_shag = std::pair<float, float>(true_start, true_end); pred_i_sled_shag_Minus_PI_Na_Dva = std::pair<float, float>(true_start, true_end); while (true) { pred_i_sled_shag.first = pred_i_sled_shag.second; promejutochnaya_tochka.first = pred_i_sled_shag.second = Shag( m, x_Rmax.first, x_Rmax.second, y_Rmax.first, y_Rmax.second, N, r); pred_i_sled_shag_Minus_PI_Na_Dva.first = pred_i_sled_shag_Minus_PI_Na_Dva.second; promejutochnaya_tochka_Minus_PI_Na_Dva.first = pred_i_sled_shag_Minus_PI_Na_Dva.second = Shag( m_Minus_PI_Na_Dva, x_Rmax_Minus_PI_Na_Dva.first, x_Rmax_Minus_PI_Na_Dva.second, y_Rmax_Minus_PI_Na_Dva.first, y_Rmax_Minus_PI_Na_Dva.second, N, r); float x1 = Curve->HitTest_2D(pred_i_sled_shag.second).first; float x2 = Curve->HitTest_2D(pred_i_sled_shag.second).second; float x1_Minus_PI_Na_Dva = Curve_Minus_PI_Na_Dva ->HitTest_2D(pred_i_sled_shag_Minus_PI_Na_Dva.second) .first; float x2_Minus_PI_Na_Dva = Curve_Minus_PI_Na_Dva ->HitTest_2D(pred_i_sled_shag_Minus_PI_Na_Dva.second) .second; promejutochnaya_tochka.second = RastriginFunc(x1, x2); promejutochnaya_tochka_Minus_PI_Na_Dva.second = RastriginFunc(x1_Minus_PI_Na_Dva, x2_Minus_PI_Na_Dva); float min = promejutochnaya_tochka.second; float min_Minus_PI_Na_Dva = promejutochnaya_tochka_Minus_PI_Na_Dva.second; if (min < min_Minus_PI_Na_Dva) { chart2->Series[0]->Points->AddXY(x1, x2); } else { chart2->Series[0]->Points->AddXY(x1_Minus_PI_Na_Dva, x2_Minus_PI_Na_Dva); } if (Extr.empty() || min < Extr.back()) { Extr.push_back(min); } if (Extr_Minus_PI_Na_Dva.empty() || min_Minus_PI_Na_Dva < Extr_Minus_PI_Na_Dva.back()) { Extr_Minus_PI_Na_Dva.push_back(min_Minus_PI_Na_Dva); } if (schetchick == global_iterations) { textBox6->Text = Convert::ToString(global_iterations); textBox7->Text = Convert::ToString((std::max)( fabsf(promejutochny_otrezok.end.first - promejutochny_otrezok.start.first), fabsf(promejutochny_otrezok_Minus_PI_Na_Dva.end.first - promejutochny_otrezok_Minus_PI_Na_Dva.start.first))); if (promejutochnaya_tochka.second < promejutochnaya_tochka_Minus_PI_Na_Dva.second) { textBox4->Text = Convert::ToString(x1); textBox3->Text = Convert::ToString(x2); } else { textBox4->Text = Convert::ToString(x1_Minus_PI_Na_Dva); textBox3->Text = Convert::ToString(x2_Minus_PI_Na_Dva); } FreeLibrary(load_function); return Extr.back() < Extr_Minus_PI_Na_Dva.back() ? Extr : Extr_Minus_PI_Na_Dva; } promejutochny_otrezok = R.top(); promejutochny_otrezok_Minus_PI_Na_Dva = R_Minus_PI_Na_Dva.top(); curr = Interval(promejutochny_otrezok.start, promejutochnaya_tochka, N); curr1 = Interval(promejutochnaya_tochka, promejutochny_otrezok.end, N); R.pop(); curr_Minus_PI_Na_Dva = Interval(promejutochny_otrezok_Minus_PI_Na_Dva.start, promejutochnaya_tochka_Minus_PI_Na_Dva, N); curr1_Minus_PI_Na_Dva = Interval(promejutochnaya_tochka_Minus_PI_Na_Dva, promejutochny_otrezok_Minus_PI_Na_Dva.end, N); R_Minus_PI_Na_Dva.pop(); if (mode && schetchick > global_local_iterations && schetchick % 2 == 0) { if ((std::max)(curr.M, curr1.M) > Mmax || min == promejutochnaya_tochka.second) { Mmax = (std::max)(curr.M, curr1.M); m = r * Mmax; } promejutochny_otrezok = R.top(); R.pop(); eta_shtrih = (std::max)((std::max)(curr.M, curr1.M), promejutochny_otrezok.M); promejutochny_otrezok.ChangeCharacteristic( r * Mmax * (promejutochny_otrezok.end.first - promejutochny_otrezok.start.first) / dmax + eta_shtrih - Mmax * (promejutochny_otrezok.end.first - promejutochny_otrezok.start.first) / dmax, N); R.push(promejutochny_otrezok); while (!R.empty()) { promejutochny_otrezok = R.top(); R.pop(); eta_shtrih = (std::max)((std::max)(curr.M, curr1.M), promejutochny_otrezok.M); promejutochny_otrezok.ChangeCharacteristic( r * Mmax * (promejutochny_otrezok.end.first - promejutochny_otrezok.start.first) / dmax + eta_shtrih - Mmax * (promejutochny_otrezok.end.first - promejutochny_otrezok.start.first) / dmax, N); R1.push(promejutochny_otrezok); if (R1.size() == 1) { curr.ChangeCharacteristic( r * Mmax * (curr.end.first - curr.start.first) / dmax + eta_shtrih - Mmax * (curr.end.first - curr.start.first) / dmax, N); curr1.ChangeCharacteristic( r * Mmax * (curr1.end.first - curr1.start.first) / dmax + eta_shtrih - Mmax * (curr1.end.first - curr1.start.first) / dmax, N); } } R = R1; R1 = Priority_queue(); if ((std::max)(curr_Minus_PI_Na_Dva.M, curr1_Minus_PI_Na_Dva.M) > Mmax_Minus_PI_Na_Dva || min == promejutochnaya_tochka_Minus_PI_Na_Dva.second) { Mmax_Minus_PI_Na_Dva = (std::max)(curr_Minus_PI_Na_Dva.M, curr1_Minus_PI_Na_Dva.M); m_Minus_PI_Na_Dva = r * Mmax_Minus_PI_Na_Dva; } promejutochny_otrezok_Minus_PI_Na_Dva = R_Minus_PI_Na_Dva.top(); R_Minus_PI_Na_Dva.pop(); eta_shtrih = (std::max)( (std::max)(curr_Minus_PI_Na_Dva.M, curr1_Minus_PI_Na_Dva.M), promejutochny_otrezok_Minus_PI_Na_Dva.M); promejutochny_otrezok_Minus_PI_Na_Dva.ChangeCharacteristic( r * Mmax_Minus_PI_Na_Dva * (promejutochny_otrezok_Minus_PI_Na_Dva.end.first - promejutochny_otrezok_Minus_PI_Na_Dva.start.first) / dmax_Minus_PI_Na_Dva + eta_shtrih - Mmax_Minus_PI_Na_Dva * (promejutochny_otrezok_Minus_PI_Na_Dva.end.first - promejutochny_otrezok_Minus_PI_Na_Dva.start.first) / dmax_Minus_PI_Na_Dva, N); R_Minus_PI_Na_Dva.push(promejutochny_otrezok_Minus_PI_Na_Dva); while (!R_Minus_PI_Na_Dva.empty()) { promejutochny_otrezok_Minus_PI_Na_Dva = R_Minus_PI_Na_Dva.top(); R_Minus_PI_Na_Dva.pop(); eta_shtrih = (std::max)( (std::max)(curr_Minus_PI_Na_Dva.M, curr1_Minus_PI_Na_Dva.M), promejutochny_otrezok_Minus_PI_Na_Dva.M); promejutochny_otrezok_Minus_PI_Na_Dva.ChangeCharacteristic( r * Mmax_Minus_PI_Na_Dva * (promejutochny_otrezok_Minus_PI_Na_Dva.end.first - promejutochny_otrezok_Minus_PI_Na_Dva.start.first) / dmax_Minus_PI_Na_Dva + eta_shtrih - Mmax_Minus_PI_Na_Dva * (promejutochny_otrezok_Minus_PI_Na_Dva.end.first - promejutochny_otrezok_Minus_PI_Na_Dva.start.first) / dmax_Minus_PI_Na_Dva, N); R1_Minus_PI_Na_Dva.push(promejutochny_otrezok_Minus_PI_Na_Dva); if (R1_Minus_PI_Na_Dva.size() == 1) { curr_Minus_PI_Na_Dva.ChangeCharacteristic( r * Mmax_Minus_PI_Na_Dva * (curr_Minus_PI_Na_Dva.end.first - curr_Minus_PI_Na_Dva.start.first) / dmax_Minus_PI_Na_Dva + eta_shtrih - Mmax_Minus_PI_Na_Dva * (curr_Minus_PI_Na_Dva.end.first - curr_Minus_PI_Na_Dva.start.first) / dmax_Minus_PI_Na_Dva, N); curr1_Minus_PI_Na_Dva.ChangeCharacteristic( r * Mmax_Minus_PI_Na_Dva * (curr1_Minus_PI_Na_Dva.end.first - curr1_Minus_PI_Na_Dva.start.first) / dmax_Minus_PI_Na_Dva + eta_shtrih - Mmax_Minus_PI_Na_Dva * (curr1_Minus_PI_Na_Dva.end.first - curr1_Minus_PI_Na_Dva.start.first) / dmax_Minus_PI_Na_Dva, N); } } R_Minus_PI_Na_Dva = R1_Minus_PI_Na_Dva; R1_Minus_PI_Na_Dva = Priority_queue(); } else { if ((std::max)(curr.M, curr1.M) < Mmax && min != Extr.back()) { curr.ChangeCharacteristic(m, N); curr1.ChangeCharacteristic(m, N); } else { Mmax = (std::max)(curr.M, curr1.M); m = r * Mmax; curr.ChangeCharacteristic(m, N); curr1.ChangeCharacteristic(m, N); if (mode) { dmax = (std::max)(powf((curr.end).first - (curr.start).first, (1.0f / float(N))), powf((curr1.end).first - (curr1.start).first, (1.0f / float(N)))); } while (!R.empty()) { promejutochny_otrezok = R.top(); R.pop(); if (mode && powf((promejutochny_otrezok.end).first - (promejutochny_otrezok.start).first, (1.0f / float(N))) > dmax) { dmax = powf((promejutochny_otrezok.end).first - (promejutochny_otrezok.start).first, (1.0f / float(N))); } promejutochny_otrezok.ChangeCharacteristic(m, N); R1.push(promejutochny_otrezok); } R = R1; R1 = Priority_queue(); } if ((std::max)(curr_Minus_PI_Na_Dva.M, curr1_Minus_PI_Na_Dva.M) < Mmax_Minus_PI_Na_Dva && min_Minus_PI_Na_Dva != Extr_Minus_PI_Na_Dva.back()) { curr_Minus_PI_Na_Dva.ChangeCharacteristic(m_Minus_PI_Na_Dva, N); curr1_Minus_PI_Na_Dva.ChangeCharacteristic(m_Minus_PI_Na_Dva, N); } else { Mmax_Minus_PI_Na_Dva = (std::max)(curr_Minus_PI_Na_Dva.M, curr1_Minus_PI_Na_Dva.M); m_Minus_PI_Na_Dva = r * Mmax_Minus_PI_Na_Dva; curr_Minus_PI_Na_Dva.ChangeCharacteristic(m_Minus_PI_Na_Dva, N); curr1_Minus_PI_Na_Dva.ChangeCharacteristic(m_Minus_PI_Na_Dva, N); if (mode) { dmax_Minus_PI_Na_Dva = (std::max)(powf((curr_Minus_PI_Na_Dva.end).first - (curr_Minus_PI_Na_Dva.start).first, (1.0f / float(N))), powf((curr1_Minus_PI_Na_Dva.end).first - (curr1_Minus_PI_Na_Dva.start).first, (1.0f / float(N)))); } while (!R_Minus_PI_Na_Dva.empty()) { promejutochny_otrezok_Minus_PI_Na_Dva = R_Minus_PI_Na_Dva.top(); R_Minus_PI_Na_Dva.pop(); if (mode && powf((promejutochny_otrezok_Minus_PI_Na_Dva.end).first - (promejutochny_otrezok_Minus_PI_Na_Dva.start).first, (1.0f / float(N))) > dmax_Minus_PI_Na_Dva) { dmax_Minus_PI_Na_Dva = powf( (promejutochny_otrezok_Minus_PI_Na_Dva.end).first - (promejutochny_otrezok_Minus_PI_Na_Dva.start).first, (1.0f / float(N))); } promejutochny_otrezok_Minus_PI_Na_Dva.ChangeCharacteristic( m_Minus_PI_Na_Dva, N); R1_Minus_PI_Na_Dva.push(promejutochny_otrezok_Minus_PI_Na_Dva); } R_Minus_PI_Na_Dva = R1_Minus_PI_Na_Dva; R1_Minus_PI_Na_Dva = Priority_queue(); } } R.push(curr); R.push(curr1); promejutochny_otrezok = R.top(); R_Minus_PI_Na_Dva.push(curr_Minus_PI_Na_Dva); R_Minus_PI_Na_Dva.push(curr1_Minus_PI_Na_Dva); promejutochny_otrezok_Minus_PI_Na_Dva = R_Minus_PI_Na_Dva.top(); float accuracy = (std::max)( fabsf(promejutochny_otrezok.end.first - promejutochny_otrezok.start.first), fabsf(promejutochny_otrezok_Minus_PI_Na_Dva.end.first - promejutochny_otrezok_Minus_PI_Na_Dva.start.first)); if (accuracy < epsilon) { textBox6->Text = Convert::ToString(schetchick); textBox7->Text = Convert::ToString(accuracy); if (promejutochnaya_tochka.second < promejutochnaya_tochka_Minus_PI_Na_Dva.second) { textBox4->Text = Convert::ToString(x1); textBox3->Text = Convert::ToString(x2); } else { textBox4->Text = Convert::ToString(x1_Minus_PI_Na_Dva); textBox3->Text = Convert::ToString(x2_Minus_PI_Na_Dva); } FreeLibrary(load_function); return Extr.back() < Extr_Minus_PI_Na_Dva.back() ? Extr : Extr_Minus_PI_Na_Dva; } x_Rmax.first = promejutochny_otrezok.start.first; x_Rmax.second = promejutochny_otrezok.end.first; y_Rmax.first = promejutochny_otrezok.start.second; y_Rmax.second = promejutochny_otrezok.end.second; x_Rmax_Minus_PI_Na_Dva.first = promejutochny_otrezok_Minus_PI_Na_Dva.start.first; x_Rmax_Minus_PI_Na_Dva.second = promejutochny_otrezok_Minus_PI_Na_Dva.end.first; y_Rmax_Minus_PI_Na_Dva.first = promejutochny_otrezok_Minus_PI_Na_Dva.start.second; y_Rmax_Minus_PI_Na_Dva.second = promejutochny_otrezok_Minus_PI_Na_Dva.end.second; schetchick++; } }
} - рассмотри этот алгоритм глобального поиска, в частности его двумерную ветку - обрати внимание вот на что - если в одномерном случае характеристики отрезков могут только не убывать, то в двумерном случае это неверно, обрати внимание что в двумерном случае используется редукция размерности с помощью кривых Пеано, обрати внимание, что здесь используется приоритетная очередь, с приоритетом по максимальной характеристике отрезка, не обращай внимание на ветки, зависящие от mode - это для локального уточнения - пока это не трогай. Сконцентрируй вот на какой проблеме - если в одномерном случае когда достаём из приоритетной очереди первый лежащий на верху отрезок - то это автоматически искомый отрезок внутри которого будет лежать точка полученная шагом метода, в двумерном же случае так как нет гарантии монотонного неубывания характеристик это не так, поэтому нужно доставать из очереди отрезки и проверять концы этих отрезков на предмет того лежит ли точка полученная шагом метода между началом и концом данного отрезка, после того как этот отрезок будет найден все остальные кроме него надо будет вернуть в очередь, и два новых отрезка curr, curr1 должны будут содержать: первый как начало - начало этого отрезка и промежуточную точку как конец, второй промежуточную точку как начало и конец этого отрезка как конец - реализуй этот функционал в моём алгоритме, если дополнительный функционал выглядит так: #include <chrono>
#include <cliext/deque>
#include <cliext/utility>
#include <queue>
#include "Windows.h"
#include "pch.h"
enum List { Top, Dawn, Left, Right };
class Interval {
public:
std::pair<float, float> start, end;
float M, R;
Interval(std::pair<float, float> _start = std::pair<float, float>(),
std::pair<float, float> _end = std::pair<float, float>(),
unsigned short _N = unsigned short())
: start(_start), end(_end) {
if (_N == 1) {
M = fabsf(_end.second - _start.second) / (_end.first - _start.first);
} else if (_N == 2) {
M = fabsf(_end.second - _start.second) / sqrtf(_end.first - _start.first);
} else {
M = fabsf(_end.second - _start.second) /
powf(_end.first - _start.first, 1.0f / float(_N));
}
}
void ChangeCharacteristic(float _m, unsigned short _N) {
const float delta_x = end.first - start.first;
const float delta_y = end.second - start.second;
textif (_N == 1) { R = _m * delta_x + (delta_y * delta_y) / (_m * delta_x) - 2.0f * (end.second + start.second); } else if (_N == 2) { R = _m * sqrtf(delta_x) + (delta_y * delta_y) / (_m * sqrtf(delta_x)) - 2.0f * (end.second + start.second); } else { R = _m * powf(delta_x, 1.0f / float(_N)) + (delta_y * delta_y) / (_m * powf(delta_x, 1.0f / float(_N))) - 2.0f * (end.second + start.second); }
}
};
class Compare {
public:
bool operator()(const Interval& below, const Interval& above) const {
return below.R < above.R;
}
};
typedef std::priority_queue<Interval, std::deque<Interval>, Compare>
Priority_queue;
ref class PeanoCurve_2D {
public:
cliext::pair<float, float> ^ x1x2;
PeanoCurve_2D ^ DawnLeft;
PeanoCurve_2D ^ DawnRight;
PeanoCurve_2D ^ TopLeft;
PeanoCurve_2D ^ TopRight;
List Type;
float a, b, c, d;
unsigned short razvertka;
PeanoCurve_2D(unsigned short _razvertka, List _Type, float _a, float _b,
float _c, float _d)
: Type(_Type), a(_a), b(_b), c(_c), d(_d), razvertka(_razvertka) {
const float half_a_b = 0.5f * (_a + _b);
const float half_c_d = 0.5f * (_c + _d);
textx1x2 = gcnew cliext::pair<float, float>(half_a_b, half_c_d); if (_razvertka-- != 0) { switch (_Type) { case Top: DawnLeft = gcnew PeanoCurve_2D(_razvertka, Right, _a, half_a_b, _c, half_c_d); DawnRight = gcnew PeanoCurve_2D(_razvertka, Left, half_a_b, _b, _c, half_c_d); TopLeft = gcnew PeanoCurve_2D(_razvertka, Top, _a, half_a_b, half_c_d, _d); TopRight = gcnew PeanoCurve_2D(_razvertka, Top, half_a_b, _b, half_c_d, _d); break; case Dawn: DawnLeft = gcnew PeanoCurve_2D(_razvertka, Dawn, _a, half_a_b, _c, half_c_d); DawnRight = gcnew PeanoCurve_2D(_razvertka, Dawn, half_a_b, _b, _c, half_c_d); TopLeft = gcnew PeanoCurve_2D(_razvertka, Right, _a, half_a_b, half_c_d, _d); TopRight = gcnew PeanoCurve_2D(_razvertka, Left, half_a_b, _b, half_c_d, _d); break; case Left: DawnLeft = gcnew PeanoCurve_2D(_razvertka, Left, _a, half_a_b, _c, half_c_d); DawnRight = gcnew PeanoCurve_2D(_razvertka, Top, half_a_b, _b, _c, half_c_d); TopLeft = gcnew PeanoCurve_2D(_razvertka, Left, _a, half_a_b, half_c_d, _d); TopRight = gcnew PeanoCurve_2D(_razvertka, Dawn, half_a_b, _b, half_c_d, _d); break; case Right: DawnLeft = gcnew PeanoCurve_2D(_razvertka, Top, _a, half_a_b, _c, half_c_d); DawnRight = gcnew PeanoCurve_2D(_razvertka, Right, half_a_b, _b, _c, half_c_d); TopLeft = gcnew PeanoCurve_2D(_razvertka, Dawn, _a, half_a_b, half_c_d, _d); TopRight = gcnew PeanoCurve_2D(_razvertka, Right, half_a_b, _b, half_c_d, _d); break; } }
}
cliext::pair<float, float> HitTest_2D(float x) {
PeanoCurve_2D ^ Curr = this;
unsigned short num, i, _razvertka;
textdo { _razvertka = Curr->razvertka; i = 0; const float b_minus_a = Curr->b - Curr->a; while (i != _razvertka) { num = x * (1 << ++i + i) / b_minus_a; const List currType = Curr->Type; Curr = (num == 0) ? ((currType == Top || currType == Right) ? Curr->DawnLeft : Curr->TopRight) : (num == 1) ? ((currType == Top || currType == Left) ? Curr->TopLeft : Curr->DawnRight) : (num == 2) ? ((currType == Top || currType == Right) ? Curr->TopRight : Curr->DawnLeft) : ((currType == Top || currType == Left) ? Curr->DawnRight : Curr->TopLeft); x -= num * b_minus_a * (1.0f / (1 << (i + i))); } Curr = gcnew PeanoCurve_2D(_razvertka >> 1, Curr->Type, Curr->a, Curr->b, Curr->c, Curr->d); } while (_razvertka != 0); return cliext::pair<float, float>(Curr->x1x2);
}
};
Ниже — минимальный патч, который решает описанную проблему для двумерной ветки ( N > 1
).
Логика: вместо слепого взятия вершины очереди мы выбираем тот отрезок, в котором действительно лежит новая точка x*
(поле first
у std::pair<float,float>
). Все прочие извлечённые кандидаты немедленно возвращаются в очередь, так что её состав и упорядочение сохраняются.
cpp/*------------------------------------------------- * Вспом-функция: проверка принадлежности x точке *------------------------------------------------*/ inline bool Contains(const Interval& seg, float x) { return x >= seg.start.first && x <= seg.end.first; } /*------------------------------------------------- * … где-то внутри двухмерного while( true ) { … } * ─────────────────────────────────────────────── * 1. Ищём отрезок для кривой Curve *------------------------------------------------*/ Interval promejutochny_otrezok; // целевой сегмент std::vector<Interval> popped; // временное хранилище while (!R.empty()) { Interval cand = R.top(); R.pop(); if (Contains(cand, pred_i_sled_shag.second)) // ← x* лежит в cand? { promejutochny_otrezok = cand; // нашли нужный сегмент break; } popped.push_back(cand); // пока откладываем } /* вернём все «чужие» сегменты обратно */ for (auto& seg : popped) R.push(seg); /*------------------------------------------------- * 2. То же самое для ветки «–π/2» *------------------------------------------------*/ Interval promejutochny_otrezok_Minus_PI_Na_Dva; popped.clear(); while (!R_Minus_PI_Na_Dva.empty()) { Interval cand = R_Minus_PI_Na_Dva.top(); R_Minus_PI_Na_Dva.pop(); if (Contains(cand, pred_i_sled_shag_Minus_PI_Na_Dva.second)) { promejutochny_otrezok_Minus_PI_Na_Dva = cand; break; } popped.push_back(cand); } for (auto& seg : popped) R_Minus_PI_Na_Dva.push(seg); /*------------------------------------------------- * 3. Формируем два новых сегмента на базе найденного *------------------------------------------------*/ curr = Interval(promejutochny_otrezok.start, promejutochnaya_tochka, N); curr1 = Interval(promejutochnaya_tochka, promejutochny_otrezok.end, N); curr_Minus_PI_Na_Dva = Interval(promejutochny_otrezok_Minus_PI_Na_Dva.start, promejutochnaya_tochka_Minus_PI_Na_Dva, N); curr1_Minus_PI_Na_Dva = Interval(promejutochnaya_tochka_Minus_PI_Na_Dva, promejutochny_otrezok_Minus_PI_Na_Dva.end, N); /*------------------------------------------------- * 4. Очереди продолжают работать как прежде: * push(curr), push(curr1) и т.д. *------------------------------------------------*/
Поиск корректного сегмента.
– Мы извлекаем элементы из приоритетной очереди, пока не найдём тот, в котором лежит новая точка (x*
).
– Все «чужие» сегменты аккуратно возвращаются назад, поэтому очередь остаётся в том же состоянии, за исключением выбранного отрезка.
Корректное разбиение.
– curr
получает границы [start ; x*]
,
– curr1
— [x* ; end]
(аналогично для ветки «–π/2»).
Никакого влияния на ветки mode
– они оставлены без изменений.
Этого достаточно, чтобы устранить неверное предположение о монотонности характеристик в двумерном случае и гарантировать, что разбиение выполняется по действительно содержащему точку отрезку.