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