sin波 描画プログラム | RDIのブログ(自作無線機 FreeBSD 超漢字等)

RDIのブログ(自作無線機 FreeBSD 超漢字等)

アマチュア無線(自作、移動運用) プログラム など
最近は、50MHzSSBトランシーバーを制作中

sin波の図が必要になったので、プログラムを作って見ました。

x-window 用のプログラムです。

 

sinwave,c

 

/*  sinwave.c  sin波を描画するプログラム  */

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/*  sin波をウィンドウに描画する  */
int DrawSinwave(Display *d, Window w, GC gc)
{
    XGCValues gv;
    int pxa, pya, pxb, pyb, i;

    gv.line_width = 2;  /*  線の太さを2に設定  */
    XChangeGC(d, gc, GCLineWidth, &gv);  /*  グラフィックコンテクストの設定を変更  */

    for(i = -20;i <= 380; i ++){  /*  -20°から380°までsin波を描いている  */
        pxb = i + 50;
        pyb = 200 - (int)(sin(3.14159/180*i) * 150);
        if(i == -20){
            pxa = pxb; pya = pyb;
        }
        XDrawLine(d, w, gc, pxa, pya, pxb, pyb);  /*  (pxa,pya)から(pxb,pyb)まで線を引いている  */
        pxa = pxb; pya = pyb;
    }
    return(0);
}

int main (int argc, char **argv)
{
    Display *d;
    Window w;
    GC gc;
    XGCValues gv;
    XEvent event;

    unsigned long black, white;

    d = XOpenDisplay (NULL);  /*  Display構造体のポインタを取得  */
    black = BlackPixel(d, DefaultScreen(d));  /*  黒のピクセル値を取得  */
    white = WhitePixel(d, DefaultScreen(d));  /*  白のピクセル値を取得  */

    w = XCreateSimpleWindow (d, RootWindow (d, 0), 20, 20,
                                      500, 400, 1, black, white);
         /*  ウィンドウを生成  */

    XSelectInput(d, w, KeyPressMask|ExposureMask);
         /*  イベントマスクを設定(ここでは、キーを押されたとき(KeyPressMask)と
        ウィンドウを表示したとき(ExposureMask)のみイベントが発生するように設定  */

    XMapWindow (d, w);  /*  ウィンドウを描く  */
    XFlush (d);  /*  リクエストバッファの送り出し  */

    gv.line_width = 3;  /*  線の太さを3に設定  */
    gc = XCreateGC (d, w, GCLineWidth, &gv);  /*  グラフィックコンテクストを生成  */
    XSetForeground (d, gc, black);  /*  グラフィック属性foregroundに値をセット  */

    while(1){
        XNextEvent(d, &event);  /*  イベントキューの先頭イベントを取得  */
        switch(event.type){
        case Expose:  /*  イベントが Expose の場合  */
            XDrawLine (d, w, gc, 30, 200, 470, 200);  /*  線を引く  */
            XDrawLine (d, w, gc, 50, 50, 50, 350);
            DrawSinwave(d, w, gc);
            break;
        case KeyPress: /*  イベントが KeyPress の場合  */
            XDestroyWindow(d, w);
            exit(0);  /*  何かキーを押されたらウィンドウを消滅する  */
            break;
        default:
            ;
        }
    }

    return 0;
}

Makefie

 

CFLAGS = -I/usr/X11R6/include
LFLAGS = -L/usr/X11R6/lib
LIBS = -lX11 -lm
CC = gcc
OBJS = sinwave.o
PROGRAM = sinwave

.c.o:
    $(CC) -Wall -g -c $(CFLAGS) $< -o $@

$(PROGRAM) : $(OBJS)
    $(CC) $(OBJS) -o $(PROGRAM) $(LFLAGS) $(LIBS)

$(OBJS) : Makefile


こんな図が出ます。