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;
}

コンパイルの方法は、前回の記事を見てください。なにかキーを押せば終了します。
ディスカッション
コメント一覧
まだ、コメントがありません