SDL2 で直線を描画する

 SDL2 のレンダラを使い、簡単な図形を描画することができます。

 直線を一つだけ描画するには、SDL_RanderDrawLine() 関数を使います。引数には、レンダラ、始点の xy 座標、終点の座標です。ただし、座標系はスクリーン座標です。

直交座標とスクリーン座標

 直交座標

 下図のように x 軸 と y 軸が垂直に交わり、交わった点を原点として、右に行くと x が増加して、上に行くと y が増加します。おなじみの座標系です。

直交座標

 移動、回転など一般的な座標変換をする場合、この直交座標系で考えることが多いです。

スクリーン座標

 コンピュータになにか描画をする場合の座標は、ほとんどスクリーン座標で指定します。スクリーンの左上が原点となり、右に行くと x が増加し、下に行くと y が増加します。つまり y 軸の向きが直交座標系と逆になります。また、基本的に負数はスクリーン外になります。

スクリーン座標

 例えば、円の方程式を使って円を描画する時、計算した値は直交座標の値になるので、それを表示する場合には、スクリーン座標への座標変換が必要になります。

 スクリーン座標の単位は画素となるので、320 x 240 の画像では、x が 0 〜 319、y が 0 〜 239 が画像内の座標になります。

(2021.09.29 追記)
 Unity などではスクリーン座標として別な座標系をスクリーン座標と言っています。あくまで、Unity のみのローカルな座標系なので、他のシステムでは使えません。一般的なスクリーン座標はここで説明している内容になります。
(追記ここまで)

直線を描く

 320 x 240 のサイズでウィンドウを作成して、左上から右下の対角線に赤い直線を描くには次のようにします。

    SDL_SetRenderDrawColor(renderer, 0xff, 0, 0, SDL_ALPHA_OPAQUE);
    SDL_RenderDrawLine(renderer, 0, 0, 319, 239);

 前回の記事のソースに追加します。

#include <stdio.h>
#include <SDL.h>

int main(int argc, char* argv[]){
    SDL_Event event;
    SDL_Window *window;
    SDL_Renderer *renderer;
    int quit_flg = 1;

    /* 初期化 */
    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        fprintf(stderr, "SDL_Init(): %s\n", SDL_GetError());
        exit(1);
    }

    /* ウィンドウ作成 */
    window = SDL_CreateWindow("SDL Test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 320, 240, SDL_WINDOW_OPENGL);
    if( window == NULL ) {
        printf("Can not create window\n");
        exit(1);
    }
    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    if( renderer == NULL ) {
        printf("Can not create renderer\n");
        exit(1);
    }

    /* 描画 */
    SDL_SetRenderDrawColor(renderer, 0xdf, 0xff, 0xdf, SDL_ALPHA_OPAQUE);
    SDL_RenderClear(renderer);
    /* 線の描画 */
    SDL_SetRenderDrawColor(renderer, 0xff, 0, 0, SDL_ALPHA_OPAQUE);
    SDL_RenderDrawLine(renderer, 0, 0, 319, 239);
    SDL_RenderPresent(renderer);

    /* イベントループ */
    while(quit_flg) {
        while( SDL_PollEvent(&event) ) {
            switch (event.type) {
            case SDL_KEYDOWN:
            case SDL_QUIT:
                quit_flg = 0;
                break;
            }
        }
    }
    if (renderer) SDL_DestroyRenderer(renderer);
    if (window) SDL_DestroyWindow(window);

    SDL_Quit();

    return 0;
}
対角線を描く

 コンパイルの方法は、前回の記事を見てください。なにかキーを押せば終了します。

SDL2

Posted by sirius