4

SDL C++ ライブラリを使用して、指定された 2 点間に 2D 線を引く方法を教えてください。SDL_draw や SDL_gfx などの他の外部ライブラリは使用したくありません。

4

3 に答える 3

8

同じ問題に苦しんでいるコーダーのための最新の回答。

SDL2 では、SDL_Render.h にいくつかの関数があり、独自の線描画エンジンを実装したり、外部ライブラリを使用したりせずにこれを実現できます。

あなたはおそらく使用したいでしょう:

 int SDL_RenderDrawLine( SDL_Renderer* renderer, int x1, int y1, int x2, int y2 );

renderer は前に作成したレンダラーで、x1 & y1 は開始用、x2 & y2 は終了用です。

上記の関数を数回呼び出す代わりに、複数のポイントを持つ線をすぐに描画できる代替関数もあります。

 int SDL_RenderDrawPoints( SDL_Renderer* renderer, const SDL_Point* points, int count );

rendererは前に作成したレンダラーで、points既知のポイントの固定配列であり、その固定配列内のポイントの量をカウントします。

上記のすべての関数は、エラーの場合は -1 を返し、成功の場合は 0 を返します。

于 2014-10-23T16:53:23.883 に答える
2

任意の線描画アルゴリズムを使用できます。

一般的で簡単なものは次のとおりです。

デジタル微分アナライザ (DDA)

Bresenham の直線アルゴリズム

Xiaolin Wu の直線アルゴリズム

于 2012-07-31T10:29:54.907 に答える
2

Rosetta コードにはいくつかの例があります。

void Line( float x1, float y1, float x2, float y2, const Color& color )
{
    // Bresenham's line algorithm
    const bool steep = (fabs(y2 - y1) > fabs(x2 - x1));
    if(steep)
    {
        std::swap(x1, y1);
        std::swap(x2, y2);
    }

    if(x1 > x2)
    {
        std::swap(x1, x2);
        std::swap(y1, y2);
    }

    const float dx = x2 - x1;
    const float dy = fabs(y2 - y1);

    float error = dx / 2.0f;
    const int ystep = (y1 < y2) ? 1 : -1;
    int y = (int)y1;

    const int maxX = (int)x2;

    for(int x=(int)x1; x<maxX; x++)
    {
        if(steep)
        {
            SetPixel(y,x, color);
        }
        else
        {
            SetPixel(x,y, color);
        }

        error -= dy;
        if(error < 0)
        {
            y += ystep;
            error += dx;
        }
    }
}
于 2012-07-31T16:27:40.963 に答える