double find() { for(int j = 0; j < 3; ++j) root.current.k[j] = 0.5*(root.max.k[j] - root.min.k[j]) + root.min.k[j]; root.value = checker.check2(root.current); best = root.value; return root.find(); }
double find_near(Checker &checker, double step, Params ¶ms) { double best_value = checker.check2(params); Params best_params = params; while(true) { bool found = false; for(int i = 0; i < 3; ++i) { for(int j = -1; j <= 1; j += 2) { Params p = params; p.k[i] += j*step; double v = checker.check2(p); if (v < best_value) { best_value = v; best_params = p; } } } if (found) params = best_params; else break; } return best_value; }
void graph(Checker &checker, const Params ¶ms) { int ri = roundf(checker.radius); if (fabs(checker.radius - ri) > 1e-5) return; bool is_power_of_two = false; for(int i = 1; i <= 4096; i *= 2) if (ri == i) is_power_of_two = true; if (!is_power_of_two && ri%16 != 0) return; checker.check2(params); checker.graph(strprintf("iir_%04d.tga", ri)); }