如何在SDL 2.0绘制点,线或矩形中指定"宽度"或"点大小"

Zhe*_* Hu 5 c sdl-2

我正在尝试使用SDL 2.0功能SDL_RenderDrawPoints()在屏幕上绘制数据点.

在"processing.org"中,我可以strokeWeight()用来改变我的"点数"的大小.如何在SDL 2.0中执行此操作

Mah*_*sod 6

SDL本身不支持它,使用SDL_gfx库.

有一个函数thicklineRGBA,允许您指定行宽.

int thickLineRGBA (SDL_Renderer *rd, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 width, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
Run Code Online (Sandbox Code Playgroud)


ole*_*ard 5

SDL_RenderSetScale

int SDL_RenderSetScale(SDL_Renderer* renderer,
                   float         scaleX,
                   float         scaleY)
Run Code Online (Sandbox Code Playgroud)

笔记

绘图坐标在被渲染器使用之前按 x/y 缩放因子进行缩放。这允许使用单个坐标系进行与分辨率无关的绘图。

如果这导致渲染后端进行缩放或子像素绘制,则将使用适当的质量提示进行处理。为了获得最佳结果,请使用整数缩放因子。

摘自SDL Wiki

示例

#include <SDL2/SDL.h>

#include <iostream>

int main()
{
    SDL_Renderer* renderer;
    SDL_Window* window;
    SDL_Point points[4];
    SDL_Point  startingPoint;
    startingPoint.x = 50;
    startingPoint.y = 50;
    float scale = 1.0;

    if ( SDL_Init( SDL_INIT_EVERYTHING ) != 0 )
        std::cout << "Failed to init SDL : " << SDL_GetError();

    window = SDL_CreateWindow( "Client", 50, 50, 500, 500, 0 );

    if ( window == nullptr )
        std::cout << "Failed to apply video mode : " << SDL_GetError();

    renderer = SDL_CreateRenderer( window, -1, SDL_RENDERER_ACCELERATED );

    if ( renderer == nullptr )
        std::cout << "Could not create renderer!";

    SDL_RenderSetLogicalSize( renderer, 500, 500 );

    // Clear background
    SDL_SetRenderDrawColor( renderer, 0, 0, 0, 255 );
    SDL_RenderClear( renderer );
    SDL_SetRenderDrawColor( renderer, 255, 255, 255, 255 );

    // Create first 4 points
    points[0].x = startingPoint.x;
    points[0].y = startingPoint.y;

    points[1].x = startingPoint.x + 50;
    points[1].y = startingPoint.y;

    points[2].x = startingPoint.x;
    points[2].y = startingPoint.y + 50;

    points[3].x = startingPoint.x + 50;
    points[3].y = startingPoint.y + 50;

    SDL_RenderDrawPoints( renderer, points, 4 );

    // Create seconds 4 points
    startingPoint.x = 125;
    scale = 2.0;

    points[0].x = startingPoint.x;
    points[0].y = startingPoint.y;

    points[1].x = startingPoint.x + 50;
    points[1].y = startingPoint.y;

    points[2].x = startingPoint.x;
    points[2].y = startingPoint.y + 50;

    points[3].x = startingPoint.x + 50;
    points[3].y = startingPoint.y + 50;

    // Apply scale
    for ( int i = 0; i < 4 ; ++i )
    {
        points[i].x /= scale;
        points[i].y /= scale;
    }

    SDL_RenderSetScale( renderer, scale, scale );
    SDL_RenderDrawPoints( renderer, points, 4 );

    // Create third 4 points
    startingPoint.x = 200;
    scale = 3.0;

    points[0].x = startingPoint.x;
    points[0].y = startingPoint.y;

    points[1].x = startingPoint.x + 50;
    points[1].y = startingPoint.y;

    points[2].x = startingPoint.x;
    points[2].y = startingPoint.y + 50;

    points[3].x = startingPoint.x + 50;
    points[3].y = startingPoint.y + 50;

    // Apply scale
    for ( int i = 0; i < 4 ; ++i )
    {
        points[i].x /= scale;
        points[i].y /= scale;
    }

    SDL_RenderSetScale( renderer, scale, scale );
    SDL_RenderDrawPoints( renderer, points, 4 );

    SDL_RenderPresent( renderer );

    std::cin.ignore();
}
Run Code Online (Sandbox Code Playgroud)

此示例将以方形图案绘制三个系列,每组四个点:

  • 1.0 刻度为 50、50 至 100、100
  • 2.0 等级为 125、50 至 175、100
  • 3.0 刻度为 200、50 至 250、100

  • 这会缩放渲染器的整个内容,因此它不会仅影响 OP 请求的线条粗细。 (5认同)