我使用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
}
}