- ベストアンサー
プログラムの改良。
うまく改良できなくて困っています。 このプログラムを #include <stdio.h> #include <stdlib.h> /* データ用変数 */ struct xy { int x; int y; } *hil; int idx; /* ヒルベルトスキャン */ void hilbert(int n, int p, int x, int y) { if (n>1) { hilbert(n/2, (p+4)%8, x+(p&1)*(n/2), y+((p>>1)&1)*(n/2)); hilbert(n/2, p, x+((((p>>1)^(p>>2)))&1)*(n/2), y+(~(p^(p>>2))&1)*(n/2)); hilbert(n/2, p, x+(~p&1)*(n/2), y+(~(p>>1)&1)*(n/2)); hilbert(n/2, 7-p, x+(~((p>>1)^(p>>2))&1)*(n/2), y+((p^(p>>2))&1)*(n/2)); } else { hil[idx].x=x; hil[idx].y=y; idx++; } } int main(void) { int i,n; /* nの入力と領域確保 */ printf("n? "); scanf("%d",&n); if((hil=(struct xy*)malloc(sizeof(struct xy)*(1<<n)*(1<<n)))==NULL) { printf("malloc error\n"); return -1; } /* ヒルベルトスキャン */ idx=0; hilbert((1<<n),4,0,0); /* データ表示 */ for (i=0; i<idx; i++) { printf("%d ([d %d]\n",i,hil[i].x,hil[i].y); } /* 領域開放 */ free(hil); return 0; } 実行結果はn?8 0 [0 0] 1 [0 1] ・ ・ 65534 [0 254] 65535 [0 255] と表示されます。これを buf[0]=img[hil[0].x][hil[0].y][0] buf[1]=img[hil[0].x][hil[1].y][0] ・ ・ buf[65534]=img[hil[0].x][hil[254].y][0] buf[65535]=img[hil[0].x][hil[255].y][0] と表示させたいのですがうまくできません。どこを改良すればいいでしょうか?お願い致します。 buf[]の中身は0から256*256-1を表しています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>というようにあって、これと質問したようなプログラムをくっつけて改良すればうまくいくと思うんですが。 改良時の注意・・・ WSIZEとHSIZEは、画像ファイルから取得したlpInfo.biWidth と lpInfo.biHeight を使わないとデータがずれると思います。 上のプログラムでは、img[x座標][y座標][色]ですが、下のファイルから読み込むプログラムは、img[y座標][x座標][色]になっているみたいです。座標の並びを合わせた方がいいでしょう。 こんな感じ。 for (i=0; i<idx; i++) { buf[i] = img[hil[i].y][hil[i].x][0]; } 準備する画像ファイルは、256*256サイズの24ビットカラーで保存しておきましょう。
その他の回答 (2)
- na_kirajp
- ベストアンサー率43% (33/76)
> printf("%d ([d %d]\n",i,hil[i].x,hil[i].y); の行を printf("buf[%d]=img[hil[%d].x][hil[%d].y][0]\n",i,hil[i].x,hil[i].y); に変えれば良いかと・・・最後の0は何を表示なのか回答いただけていないので固定0で ちなみに > printf("%d ([d %d]\n",i,hil[i].x,hil[i].y); は printf("%d ([%d %d]\n",i,hil[i].x,hil[i].y); ですよね(%が抜けています)
補足
うまく表示ができました。 私がやりたい事はあるビットマップ画像(img)というものをヒルベルトスキャンを用いて画像の座標の画素値をとるようなプログラムを書きたいんです。ファイルの読み込みをするプログラムは #include <stdio.h> #define FNAME "imgsmp.bmp" #define WSIZE 320 #define HSIZE 240 #define BSIZE 1024 int main(void) { struct BMPFILEHEADER { unsigned short bfType; unsigned int bfSize; unsigned short bfReserved1; unsigned short bfReserved2; unsigned int bf0ffBits; }; struct BMPINFOHEADER { unsigned int biSize; unsigned biWidth; unsigned biHeight; unsigned short biPlanes; unsigned short biBitCount; unsigned int biCompression; unsigned int biSizeImage; unsigned int biXPelsPerMeter; unsigned int biYPelsPerMeter; unsigned int biClrUsed; unsigned int biClrImportant; }; unsigned char img[HSIZE][WSIZE][3]; unsigned char buf[BSIZE]; struct BMPFILEHEADER lpHead; struct BMPINFOHEADER lpInfo; FILE *fp; int i; int j; int k; fp = fopen(FNAME,"rb"); if (fp==NULL) { printf("$B%U%!%$%k$r%*!<%W%s$G$-$^$;$s$G$7$?!#(B\n"); return 0; } fread(&lpHead.bfType, sizeof(unsigned short),1,fp); fread(&lpHead.bfSize, sizeof(unsigned int),1,fp); fread(&lpHead.bfReserved1, sizeof(unsigned short),1,fp); fread(&lpHead.bfReserved2, sizeof(unsigned short),1,fp); fread(&lpHead.bf0ffBits, sizeof(unsigned int),1,fp); fread(&lpInfo, sizeof(struct BMPINFOHEADER),1,fp); for(i=0;i<HSIZE;i++) { fread(buf,sizeof(unsigned char),WSIZE*3,fp); for(j=0;j<WSIZE;j++) { for(k=0;k<3;k++) { img[HSIZE-1-i][j][k]=buf[j*3+k]; } } } fclose(fp); return 0; } というようにあって、これと質問したようなプログラムをくっつけて改良すればうまくいくと思うんですが。
- na_kirajp
- ベストアンサー率43% (33/76)
>65535 [0 255] を >buf[65535]=img[hil[0].x][hil[255].y][0] と表示を変えたいとの事ですか? (単にprintfの書式の問題なのか?違うのか分かりません) その場合、 > printf("%d ([d %d]\n",i,hil[i].x,hil[i].y); なので、65535はi/hil[0].xの0はhil[i]/hil[255].yの255はhil[i].y/[0]は?
補足
はい表示を変えたいのです。新たにbuf[]やimgの宣言を増やせばいいのですがうまくコンパイルできません。
補足
ピクセルデータの読み込みがうまくできません。 ヒルベルトした順番の座標値のピクセルの値を読み込んでいきたいのですがうまく書けません。