【问题标题】:SDL2 How to draw dotted lineSDL2如何画虚线
【发布时间】:2022-05-02 21:28:12
【问题描述】:

只是可以使用 SDL2(或使用 gfx)绘制一条简单的虚线,如

int drawDottedLine(SDL_Renderer *renderer,Sint16 x1,Sint16 y1, Sint16 x2, Sint16 y2, int r, int g, int b, int a);

在网上一无所获 wtf 有这么难吗?

【问题讨论】:

  • 我认为 SDL 没有内置该功能,您必须自己实现它

标签: c sdl-2


【解决方案1】:

这是一个使用 Bresenham 算法的工作函数:

void DrawDottedLine(SDL_Renderer* renderer, int x0, int y0, int x1, int y1) {
    int dx =  abs(x1-x0), sx = x0<x1 ? 1 : -1;
    int dy = -abs(y1-y0), sy = y0<y1 ? 1 : -1;
    int err = dx+dy, e2;
    int count = 0;
    while (1) {
        if (count < 10) {SDL_RenderDrawPoint(renderer,x0,y0);}
        if (x0==x1 && y0==y1) break;
        e2 = 2*err;
        if (e2 > dy) { err += dy; x0 += sx; }
        if (e2 < dx) { err += dx; y0 += sy; }
        count = (count + 1) % 20;
    }
}

你必须考虑到这个函数的性能很糟糕,因为虚线的每个点都会调用SDL_RenderDrawPoint()才能被渲染。

【讨论】:

  • 嗯,你可以通过SDL_RenderDrawPoints() 将这些点缓冲起来并一次性绘制出来,应该不那么慢:)
【解决方案2】:

这是我在乒乓球比赛中使用的代码:

SDL_SetRenderDrawColor(renderer, 155, 155, 155, 255);
for (line.y = 0; line.y < WINDOW_HEIGHT; line.y += 10)
{
    SDL_RenderFillRect(renderer, &line);
}

在代码的前面我初始化了这一行:

SDL_Rect line;
line.w = 2;
line.h = 8;
line.x = WINDOW_WIDTH / 2;

【讨论】:

    【解决方案3】:

    您可以简单地自己实现它... 检查“Bresenham 算法”画一条线。

    对于虚线,它只是许多实线,所以用三角函数的铅笔和纸应该可以解决:)

    编辑:对于虚线,您甚至没有使用“布雷森汉姆算法”,您只需要三角函数。

    顺便说一下,对于那些投反对票的人,请解释一下?

    【讨论】:

    • 我认为自定义 Bresenham 算法比 trig 方法更合适,因为 trig 需要浮点数学,而 Bresenham 不需要。在设置像素颜色的位置向 Bresenham 算法添加一个计数器。对于路径上的每个新坐标,计数器都会增加,如果计数器是(比如说)5,则切换一个布尔标志并重置计数器。仅在标志为真时绘制像素。
    • 如果你想要一个优化的函数,是的,一个自定义的 Bresenham 是一种方式,如果你只想要一条虚线,一个“cos”,一个“sin”,函数就快完成了。跨度>
    猜你喜欢
    • 1970-01-01
    • 2019-11-04
    • 2016-05-08
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多