0

マンデルブロ フラクタルを描画するための小さなヘルパー クラスを作成しようとしています。このクラス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));
        }
    }
}
4

2 に答える 2