マンデルブロ フラクタルを描画するための小さなヘルパー クラスを作成しようとしています。このクラスCanvas
には 2 つの 2 次元配列があり、1 つは複素平面の座標を格納するためのもので、もう 1 つは|z|
2 を超えるために必要な反復回数のためのものです。
テンプレート引数は、キャンバスの幅と高さをピクセル単位で指定します。面白いことに、 への引数を使用するとすべてが正常に機能しますが
<500, 500>
、たとえば選択すると<600, 600>
、セグメンテーション違反が発生します。array.at()
代わりに使用して、範囲外エラーを既にチェックしましたarray[]
が、まだ何も使用していません。
template <std::size_t W, std::size_t H>
class Canvas
{
public:
Canvas(std::complex<double> _origin, std::complex<double> _end);
...
private:
std::complex<double> origin;
std::complex<double> end;
std::array<std::array<std::complex<double>, H>, W> field;
std::array<std::array<std::pair<bool, int>, H>, W> results;
};
template <std::size_t W, std::size_t H>
Canvas<W, H>::Canvas(std::complex<double> _origin,
std::complex<double> _end)
: origin{_origin}, end{_end}
{
double delta_x {end.real() - origin.real()};
double delta_y {end.imag() - origin.imag()};
double step_x {delta_x / static_cast<double>(W-1)};
double step_y {delta_y / static_cast<double>(H-1)};
for (std::size_t w = 0; w < W; ++w)
{
for (std::size_t h = 0; h < H; ++h)
{
field[w][h].real(origin.real() + (step_x*w));
field[w][h].imag(origin.imag() + (step_y*h));
}
}
}