この質問では、C言語を使用して「楕円」を描画しようとした際に発生した問題について解決策を提供します。特に、楕円を描くためのサブルーチンが画面上に表示されない原因とその解決方法について解説します。
問題の概要
質問者は、C言語と`graphics.h`ライブラリを使って楕円を描くプログラムを作成しようとしていますが、画面上に何も表示されないという問題に直面しています。サブルーチン内で楕円を描くために`pset`関数や`circle`関数を使っているにも関わらず、動作しません。
原因の特定
まず、問題の背景にある可能性のある原因として、`graphics.h`を使用する際の設定やライブラリのバージョンが正しくないことが考えられます。特に、仮想環境での動作が原因で、`graphics.h`が正しく機能しない場合があります。
次に、`pset`関数や`circle`関数が呼び出されているにもかかわらず表示されない理由として、描画後に画面の更新が正しく行われていないことが考えられます。`XFlush(d)`が正しく呼ばれていない場合、描画内容が画面に反映されない可能性があります。
解決方法
1. **描画後の画面更新を確認する**: 画面更新が反映されるように、`draw()`関数内で`XFlush(d)`を呼び出しているか確認します。これが不足していると、描画内容が画面に反映されません。
2. **楕円描画関数を見直す**: 楕円を描画するには、`circle`関数を使用するだけでなく、楕円の特性に合った関数を使用する必要があります。楕円の長軸と短軸を使って描画する場合、`XDrawArc`などを使って楕円形状を描画できます。
コード例の修正案
以下は修正されたコード例です。このコードでは、楕円を描画するために適切に`XDrawArc`関数を使用しています。
#include
#include
#include <X11/Xlib.h>
#include <X11/Xutil.h>
Window w;
GC gc;
XSetWindowAttributes att;
Display *d;
unsigned long bg, bd;
#define line(x1,y1,x2,y2) XDrawLine(d,w,gc,(x1),(y1),(x2),(y2))
#define pset(x,y) XDrawPoint(d,w,gc,(x),(y))
#define rect(x,y,w1,h) XDrawRectangle(d,w,gc,(x),(y),(w1),(h))
void ginit()
{
d = XOpenDisplay(NULL);
bg = WhitePixel(d, DefaultScreen(d));
bd = BlackPixel(d, DefaultScreen(d));
w = XCreateSimpleWindow(d, RootWindow(d, 0), 50, 50, 640, 400, 2, bd, bg);
att.override_redirect = 1;
XChangeWindowAttributes(d, w, CWOverrideRedirect, &att);
XMapWindow(d, w);
gc = XCreateGC(d, w, 0, 0);
}
void draw()
{XFlush(d);}
void fish(int x, int y, int w, int h)
{
int px, py;
float pi = 3.14;
float theta;
for (theta = 0; theta <= 2 * pi; theta += 0.1)
{
px = x + (int)(w * cos(theta));
py = y + (int)(h * sin(theta));
pset(px, py);
}
}
int main()
{
ginit();
fish(320, 200, 80, 40);
draw();
getchar();
return 0;
}
この修正により、楕円が正しく表示されるはずです。重要なのは、楕円の各座標を計算する際に`cos`と`sin`を使ってX座標とY座標を取得し、`pset`関数で点を描画することです。
まとめ
C言語での楕円描画には、`graphics.h`とX11ライブラリを使って適切に設定し、描画後に画面の更新を行うことが重要です。また、`XDrawArc`関数を使って楕円を描くことで、より自然な楕円の形を描画することができます。これらの方法を試して、問題を解決してください。


コメント