Xwindowシステムでのコッホ島

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
カイト

Xwindowシステムでのコッホ島

#1

投稿記事 by カイト » 13年前

XWindowシステムで、コッホ雪片(コッホ島)を描くプログラムを作りたいのですが、うまくいきません。
以下の「sample.c」を基本に作らなければならないので、いくつかサイトをググって参考にしてみようと思ったのですが、いかんせん、このプログラムは古くさいみたいでなかなか参考になるものがなかったのでここで質問させてください。

コード:

//sample.c

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
float xi, yi;
float alphai=0.0;
Display *d;
Window w;
GC gc;
unsigned long MyColor(Display *,char *);
void move(float), setp(float,float), setangle(float), turn(float);

int koch(float);

int main(int argc, char *argv[])
{

unsigned long green, red;
XSetWindowAttributes att;

d = XOpenDisplay(NULL);
w = XCreateSimpleWindow(d, RootWindow(d, 0), 150, 150, 900, 900, 2, BlackPixel(d, 0), WhitePixel(d, 0));
red = MyColor(d, "red");
green = MyColor(d, "green");
att.override_redirect = 1;
XChangeWindowAttributes(d, w, CWOverrideRedirect, &att);
XMapWindow(d, w);
gc = XCreateGC(d, w, 0, 0);
XSetForeground(d, gc, red);
fractal(argc, argv);
XFlush(d);
getchar();
XCloseDisplay(d);
return 0;
}

unsigned long MyColor(Display *display, char *color)
{
Colormap cmap;
XColor c0, c1;
cmap = DefaultColormap(display, 0);
XAllocNamedColor(display, cmap, color, &c1, &c0);
return(c1.pixel);
}

void turn(float alpha)
{
alphai += alpha;
}

void setangle(float alpha)
{
alphai = alpha;
}

void setp(float x, float y)
{
xi = x;
yi = y;
}

void move(float l)
{
float x,y;
 x = cos(alphai * 3.1415926) / 180;
 y =  yi + l * sin(alphai);
XDrawLine(d, w, gc, (int)xi, (int)yi, (int)x, (int)y);
xi = x; yi = y;
}

int koch(float leng){

if(leng <= 20) move(leng);
else{
leng /= 3;
koch(leng);
turn(90.0);
koch(leng);
turn(-45.0);
koch(leng);
turn(-90.0);
koch(leng);
turn(-45.0);
koch(leng);
turn(90.0);
koch(leng);
}
return 0;
}

int fractal(int argc,char *argv[])
{
int x, y, leng, i;
if(argc == 4){
x=atoi(argv[1]);
y=atoi(argv[2]);
leng=atoi(argv[3]);
} else {
x=350;y=500;leng=250;
}
setp((float)x,(float)y);
setangle(0.0);
for(i=0;i<3;i++){

koch((float)leng);
turn(-120.0);
}
return 0;
}


このプログラムを利用してコッホ雪片を描くプログラムを教えてください。
よろしくお願いします。

カイト

Re: Xwindowシステムでのコッホ島

#2

投稿記事 by カイト » 13年前

<補足>

環境:Linux

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: Xwindowシステムでのコッホ島

#3

投稿記事 by ISLe » 13年前

カイト さんが書きました:XWindowシステムで、コッホ雪片(コッホ島)を描くプログラムを作りたいのですが、うまくいきません。
何がうまくいかないのですか?
コンパイルできない?
動かない?
正しく描画されない?

あとLinuxのディストリビューションも明示してください。

(追記)
move関数の移動先座標x,yを求めるコードを修正すれば正しい結果を得られるようです。
xを求めるコードがyを求めるコードと比較して明らかにおかしいです。
angleiの度からラジアンを求める計算が半端に混じっていますしコピペミスですかね。

カイト

Re: Xwindowシステムでのコッホ島

#4

投稿記事 by カイト » 13年前

以下のようなヒントを見つけたのですが、これをどうやって先ほどの「sample.c」の中に組み込めばコッホ雪片を描けるのかがわかりません。
できれば、実際にプログラムをして教えてください<(_ _)>

コード:

double s = sin(PI/3); c = cos(PI/3);

void KochCurve(double x1, double y1, double x2, double y2, int dim)
{
double x3, y3, x4, y4, x5, y5;

if( dim <= 0 ){
DrawLine( x1, y1, x2, y2 );
return;
}
x3 = ( 2*x1 + x2 ) / 3;
y3 = ( 2*y1 + y2 ) / 3;
x5 = ( x1 + 2*x2 ) / 3;
y5 = ( y1 + 2*y2 ) / 3;
x4 = x3 + (x5-x3)*c + (y5-y3)*s;
y4 = y3 - (x5-x3)*s + (y5-y3)*c;
KochCurve( x1, y1, x3, y3, dim-1 );
KochCurve( x3, y3, x4, y4, dim-1 );
KochCurve( x4, y4, x5, y5, dim-1 );
KochCurve( x5, y5, x2, y2, dim-1 );
}


>あとLinuxのディストリビューションも明示してください。
ディストリビュージョンに関しては、初心者なもので調べ方が解らないのです。すみません。

69 y = sin(alphai * 3.1415926) / 180;

ですね?

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: Xwindowシステムでのコッホ島

#5

投稿記事 by ISLe » 13年前

こちらの質問にお答えいただいていないので、『コッホ雪片を描けない』以外の条件はクリアしているものとして回答させていただきます。
というわけで、ズバリご希望のプログラムは下記のようになるかと思います。

コード:

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

Display *d;
Window w;
GC gc;

void KochCurve(double x1, double y1, double x2, double y2, int dim)
{
	double x3, y3, x4, y4, x5, y5;
	double s = sin(M_PI/3), c = cos(M_PI/3);

	if( dim <= 0 ){
		XDrawLine( d, w, gc, x1, y1, x2, y2 );
		return;
	}
	x3 = ( 2*x1 + x2 ) / 3;
	y3 = ( 2*y1 + y2 ) / 3;
	x5 = ( x1 + 2*x2 ) / 3;
	y5 = ( y1 + 2*y2 ) / 3;
	x4 = x3 + (x5-x3)*c + (y5-y3)*s;
	y4 = y3 - (x5-x3)*s + (y5-y3)*c;
	KochCurve( x1, y1, x3, y3, dim-1 );
	KochCurve( x3, y3, x4, y4, dim-1 );
	KochCurve( x4, y4, x5, y5, dim-1 );
	KochCurve( x5, y5, x2, y2, dim-1 );
}

int main(int argc, char *argv[])
{
	int s;
	double x1,y1,x2,y2,x3,y3;

	d = XOpenDisplay(NULL);
	s = DefaultScreen(d);
	w = XCreateSimpleWindow(d, RootWindow(d, s), 0, 0, 360, 360, 0, WhitePixel(d, s), BlackPixel(d, s));
	XSelectInput(d, w, ExposureMask);
	XMapWindow(d, w);
	gc = XCreateGC(d, w, 0, 0);
	XSetForeground(d, gc, WhitePixel(d, 0));

	x1=60;
	y1=100;
	x2=x1 + 240;
	y2=y1;
	x3=x1 + 240 * cos(M_PI/3);
	y3=y1 + 240 * sin(M_PI/3);

	for (;;) {
		XEvent e;
		XNextEvent(d, &e);
		switch (e.type) {
		case Expose:

			KochCurve(x1,y1,x2,y2,10);
			KochCurve(x2,y2,x3,y3,10);
			KochCurve(x3,y3,x1,y1,10);
			XFlush(d);

			break;
		}
	}
	return 0;
}
添付ファイル
kochsnow.png
Ubuntuで実行した結果
kochsnow.png (8.81 KiB) 閲覧数: 2335 回

アバター
あたっしゅ
記事: 667
登録日時: 14年前
住所: 東京23区
連絡を取る:

Re: Xwindowシステムでのコッホ島

#6

投稿記事 by あたっしゅ » 13年前

>>あとLinuxのディストリビューションも明示してください。
>ディストリビュージョンに関しては、初心者なもので調べ方が解らないのです。すみません。

Linux のディストリビュージョンというのは、Ubuntu とか Fedora とか Vine とかのことです。
Linux が立ち上がるときに表示されませんか ?
また、Linux を自分で PC に入れたのなら、CD-ROM 等を見れば、わかると思いますが。

学校の PC に入ってました、という感じなのかな ?


あたっしゅ
VTuber:
[香車]東上☆Aho(暎帆)☆海美
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

閉鎖

“C言語何でも質問掲示板” へ戻る