是否有一个高效的Xiaolin Wu的线路功能与SDL(或添加)?

时间:2018-01-03 21:11:29

标签: c++ sdl-2 line-drawing

我使用SDL2在C ++中创建了一个程序,它通过将它们与行链接从点列表中绘制曲线。我假设我正在使用基于Bresenham算法的SDL_RenderDrawLine函数。

然后我根据Xiaolin Wu的算法做了另一个函数来替换SDL算法(因为它更平滑)。它运行良好,但它比SDL函数慢很多(多!)。事实上,我很难每秒绘制超过十几行,我可以使用SDL函数每秒绘制数千行,没有任何问题。

所以我正在寻找一个SDL库,其中Xiaolin Wu的算法已经实现,因为计算机科学家当然比我好。这个图书馆存在吗?或者我必须自己做吗?

如果我必须自己做,你有提示改善我的功能吗?这是基于维基百科的伪代码:

void drawXWLine(SDL_Renderer *renderer, double x1, double y1, double x2, double y2, SDL_Color color, uint8_t a)
{
    double dx = x2 - x1;
    double dy = y2 - y1;

    if (abs(dx) > abs(dy)) // horizontal lines
    {
        if (x2 < x1)
        {
            // swap the two points
        }

        double gradient = dy / dx;

        // draw the extreme points of the line
        int xend, xpxl1, xpxl2, ypxl1, ypxl2;
        double yend, xgap, intery;
        xend = round(x1);
        yend = y1 + gradient * (xend - x1);
        xgap = 1.0 - mod(x1 + 0.5, 1.0);
        xpxl1 = xend;
        ypxl1 = int(yend);
        SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, uint8_t((1.0 - mod(yend, 1.0)) * xgap * a));
        SDL_RenderDrawPoint(renderer, xpxl1, ypxl1);
        SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, uint8_t(mod(yend, 1.0) * xgap * a));
        SDL_RenderDrawPoint(renderer, xpxl1, ypxl1+1);
        intery = yend + gradient;

        xend = round(x2);
        yend = y2 + gradient * (xend - x2);
        xgap = 1.0 - mod(x2 + 0.5, 1.0);
        xpxl2 = xend;
        ypxl2 = int(yend);
        SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, uint8_t((1.0 - mod(yend, 1.0)) * xgap * a));
        SDL_RenderDrawPoint(renderer, xpxl2, ypxl2);
        SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, uint8_t(mod(yend, 1.0) * xgap * a));
        SDL_RenderDrawPoint(renderer, xpxl2, ypxl2+1);

        // draw the whole line
        for(int x = xpxl1 + 1 ; x < xpxl2 ; x++)
        {
            SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, uint8_t((1.0 - mod(intery, 1.0)) * xgap * a));
            SDL_RenderDrawPoint(renderer, x, int(intery));
            SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, uint8_t(mod(intery, 1.0) * xgap * a));
            SDL_RenderDrawPoint(renderer, x, int(intery)+1);

            intery += gradient;
        }
    }
    else
    {
        // do the same with vertical lines
    }
}

0 个答案:

没有答案