• 締切済み

Bresenhamのアルゴリズムを用いた円描画

一つ下の質問をした後に、いろいろ考えて作ったプログラムなのですが、コンパイルが通りません。 頭がこんがらがってしまったので、教えていただけるとうれしいです。 main(){    int x, y, r, d;    printf("Enter coordinates of radius of circle. R = ");    scanf("%d\n", &r);    x = 0;    y = r;    d = 3 - 2 * r;    while(y > x){      plotcircle(x, y, r);      if(d < 0){ /* select U */         d = d + 4 * x + 6;      }else{ /* select D */         d = d + 4 * (x - y) + 10;         y = y - 1;      }      x = x + 1;    }    if(x == y){      plotcircle(x, y, r);    } } plotcircle(int x, int y, int r){    putpixel( x, y, r);    putpixel( y, x, r);    putpixel( y, -x, r);    putpixel( x, -y, r);    putpixel(-x, -y, r);    putpixel(-y, -x, r);    putpixel(-y, x, r);    putpixel(-x, y, r); }

みんなの回答

回答No.4

計算は間違ってないようですので、描画をなんとかすれば動くと思います。 参考まで。(画面を50*50サイズで、円の中心を25,25に固定しています) #include <stdlib.h> #include <stdio.h> char disp[50][50]; // 画面領域の定義(50*50固定) void plotini(void); // 画面を消す void plotcircle(int, int, int, int, int); // 画面に点を打つ void plotdisp(void); // 画面を表示する int main(){  int x, y, r, d;  printf("Enter coordinates of radius of circle. R = ");  scanf("%d", &r);  plotini();  x = 0;  y = r;  d = 3 - 2 * r;  while(y > x){   plotcircle(x, y, 25, 25, 'X');   if(d < 0){ /* select up */    d = d + 4 * x + 6;   }else{ /* select bottom */    d = d + 4 * (x - y) + 10;    y = y - 1;   }   x = x + 1;  }  if(x == y){   plotcircle(x, y, 25, 25, 'X');  }  plotdisp();  return 0; } void plotini(void) {  int i,j;  for (i=0; i<50; i++) for (j=0; j<50; j++) disp[i][j]=' '; } void plotcircle(int x, int y, int xc, int yc, int c) {  int xx,yy;  xx = xc+x; yy = yc+y; if (xx>=0 && x<50 && yy>=0 && yy<50) disp[yy][xx]=c;  xx = xc+y; yy = yc+x; if (xx>=0 && x<50 && yy>=0 && yy<50) disp[yy][xx]=c;  xx = xc+y; yy = yc-x; if (xx>=0 && x<50 && yy>=0 && yy<50) disp[yy][xx]=c;  xx = xc+x; yy = yc-y; if (xx>=0 && x<50 && yy>=0 && yy<50) disp[yy][xx]=c;  xx = xc-x; yy = yc-y; if (xx>=0 && x<50 && yy>=0 && yy<50) disp[yy][xx]=c;  xx = xc-y; yy = yc-x; if (xx>=0 && x<50 && yy>=0 && yy<50) disp[yy][xx]=c;  xx = xc-y; yy = yc+x; if (xx>=0 && x<50 && yy>=0 && yy<50) disp[yy][xx]=c;  xx = xc-x; yy = yc+y; if (xx>=0 && x<50 && yy>=0 && yy<50) disp[yy][xx]=c; } void plotdisp(void) {  int i,j;  for (i=0; i<50; i++) {   for (j=0; j<50; j++) {    printf("%c",disp[i][j]);   }   printf("\n");  } }

pooh_bear
質問者

お礼

実は、JaritenCatさんの投稿の前に似たようなプログラムができていました。 報告が遅くなってしまってすみません。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

> graphic.hを利用して書かせようと思ったのですが、そこまでする必要が無いことに気づき、ファイルに.とXを用いて円描画をするようにしてみました。が、やはりうまく行きません。以下のソースで間違いを指摘していただきたいです。 まともにデバッグする気はありませんが、一つアドバイスさせていただくと、最初のソースにあったputpixelを、二次元配列にプロットする関数として自作し、最後にその配列の内容を出力する方が簡単です。 それから、scanfに渡している文字列の'\n'は不要です。

全文を見る
すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

No.1253337でも回答しましたが、環境を特定しない限り、適切な回答はできません。 提示されているソースは、こちらで見る限りコンパイルできましたが、putpixelがないのでリンク時にエラーになりました。 結局、グラフィック周りを解決しない限り、動かすことはできません。

pooh_bear
質問者

補足

そうですね。環境特定は必要ですね。 現在Unix上で動かしています。 graphic.hを利用して書かせようと思ったのですが、そこまでする必要が無いことに気づき、ファイルに.とXを用いて円描画をするようにしてみました。が、やはりうまく行きません。以下のソースで間違いを指摘していただきたいです。 #include <stdlib.h> #include <stdio.h> int main(){   int x, y, r, d;   printf("Enter coordinates of radius of circle. R = ");   scanf("%d\n", &r);   x = 0;   y = r;   d = 3 - 2 * r;   while(y > x){     plotcircle(x, y, r);     if(d < 0){ /* select up */       d = d + 4 * x + 6;     }else{ /* select bottom */       d = d + 4 * (x - y) + 10;       y = y - 1;     }     x = x + 1;   }   if(x == y){     plotcircle(x, y, r);   } } int plotcircle(int x, int y, int r){   int xx, yy;   int i, j, k;   char output;   FILE *fp;   xx = -1 * (r + 2);   yy = r + 1;   if((fp = fopen("output.txt", "w")) == NULL){     return(-1);   }   for(i = 0; i <= 2 * r; i++){     for(j = 0; j <= 2 * r; j++){       yy--;       xx++;       if(xx == x && yy == y){         output = 'X';       }else if(xx == y && yy == x){         output = 'X';       }else if(xx == y && yy == -x){         output = 'X';       }else if(xx == x && yy == -y){         output = 'X';       }else if(xx == -x && yy == -y){         output = 'X';       }else if(xx == -y && yy == -x){         output = 'X';       }else if(xx == -y && yy == x){         output = 'X';       }else if(xx == -x && yy == y){         output = 'X';       }else{         output = '.';       }         fputc(output, fp);         putchar(output);     }     output = '\n';     fputc(output, fp);     putchar(output);   }    fclose(fp); }

全文を見る
すると、全ての回答が全文表示されます。
  • keikan
  • ベストアンサー率42% (75/176)
回答No.1

(Windows環境を前提にした話ですが違ったらごめんなさい。) mainがあることからコマンドラインベースのグラフィックを使用されようとされていますが、現在graphics.h(graphics.lib)が標準で入っていないため 上記のputpixel関数も定義されていないため利用できません。 下記にたのLibをもちいたサイトがありますのでそちらを参考にしてみてください 「コンピュータ・グラフィックス(CG)の初歩」 http://flow.dse.ibaraki.ac.jp/~lecture/CProg/graphics/graphics.html また、現在Windows上でグラフィックスを行えるようにライブラリが用意されていますのでWinAPIのプログラムへの変更もいいと思います。

pooh_bear
質問者

補足

すみません。環境について触れていませんでした。 Unix上で動かしていました。 また、graphics.hを利用することなしに描画する方法で行くことにしました。 お手数をおかけしました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 再帰呼び出し

    アッカーマン関数の値を出力するプログラム #include void main(void); int ack(int,int); void main(void) { int x,y,i; printf(" data(x) = "); scanf("%d",&x); printf(" data(y) = "); scanf("%d",&y); i = ack(x,y); printf("Ackerman = %d\n",i); } int ack(int a,int b) { int k; if (a == 0) k = b+1; else if (b == 0) k = ack(a-1,1); else k = ack(a-1,ack(a,b-1)); return (k); } この関数を呼び出した回数も出力するようにしたいのですが、どうしたらいいのでしょうか?

  • ifについて

    C言語を最近学び始めました。 以下をコンパイルし、実行しても予期せぬ結果になってしまい、困っています。 #include <stdio.h> #include <time.h> #include <stdlib.h> void retry(int); int main(void); int main(void) { int x,y,yn; srand(time(NULL)); x = rand()%6 +1; //Player y = rand()%6 +1; //CPU printf("Player:%d\n",x); printf("CPU:%d\n",y); if(y<<x){printf("Player > CPU\n");} else if(x<<y){printf("Player < CPU\n");} else {printf("Player = CPU\n");} retry(yn); return 0; } void retry(int yn) { printf("\nRetry ?(Yes=1/No=0)>"); scanf("%d",&yn); if (yn==1){printf("\n\n");getchar();main ();} else if(yn==0){printf("\n\nend");exit(0);} else {retry(yn);}; } サイコロを2人が振り、目が大きいほうが勝ちというものなのですが、 「Player:3 CPU:6 Plyaer>CPU」 といった具合にx,yの値に関わらず「Plyaer>CPU」と表示されます。 何が原因なのでしょうか。 よろしくお願いします。

  • C言語の問題がわからないです。

    C言語のプログラムで、列数を自分で決めて、 (例)3列         ●(この行を最後として)   □● ●□● 上記のプログラムを作りたいのですが、 上手くいきません。途中まで作ったのですが、なかなか思うようにいかないです。どうすれば上記のようになりますでしょうか? #include <stdio.h> void disp(int x, int y); main() { int i,n; printf("表示する列:"); scanf("%d",&n); disp(3,3); for(i=1;i<=n;i++){ if(i%2==0){ disp(n-i,4); disp(i,2); } else{ disp(n-i,4); disp(i,1); } disp(1,3); } } void disp(int x, int y) { int i; for(i=0;i<x;i++){ if(y==1){ printf("●"); } else if(y==2){ printf("□"); } else if(y==3){ printf("\n"); } else{ printf("\0"); } } }

  • (C言語)西暦年月日を入力して、その日の曜日を表示させるプログラムを試したのですが…

    西暦年月日を入力して、その日の曜日を表示させるプログラムを作りたいのですが、とりあえず、やってみましたが… int main(void) { int i,y,m,d,dy,dw; int D[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; printf("Year?"); scanf("%d",&y); printf("Month?"); scanf("%d",&m); printf("Day?"); scanf("%d",&d); for(i=0;i<=m-1;i++){ dy = d + D[i] ; } if(m>=3){ if(y % 4 == 0){ if(y % 400 == 0){ dy = dy + 1 ; } else if(y % 100 ==0){ dy = dy ; } else{ dy = dy + 1 ; } } else if(y % 4 == 1 || y % 4 == 2 || y % 4 == 3 ){ dy = dy ; } } dw = (dy -1 + ( y + ( y - 1 )/4 - ( y - 1 )/100 + ( y - 1 )/400))%7 ; if (dw == 0) printf("Sunday\n"); else if (dw == 1) printf("Monday\n"); else if (dw == 2) printf("Tuesday\n"); else if (dw == 3) printf("Wednesday\n"); else if (dw == 4) printf("Thursday\n"); else if (dw == 5) printf("Friday\n"); else if (dw == 6) printf("Saturday\n"); return 0 ; } このプログラムを各年の1月1日~2月28日で試してみると、うまくいくのですが、3月1日に入るとなぜかうまく働いてくれません。(ちなみに2005年の11月では偶然うまくいっています。)その理由が分からないのでどなたか教えてください。ちなみに、この一連のプログラムを行うにはもっと簡単に行える関数というかコマンド?みたいなものがあるようですが、基本的に各年の1月1日を、 (y+(y-1)/4-(y-1)/100+(y-1)/400)%7で(0:Sunday~)、同年の○月○日は1月1日から△日経過しているという考え方で、曜日を割り出すプログラムにしなければならないといけないので、注文が多いですがよろしくお願いします。

  • このプログラミングで。

    #include <stdio.h> int main(void) { int x; printf("長い河はどれ?\n 1天の川 2三途の川 3谷川\n"); scanf("%d",&x); if(x == 1){ printf("なるほど"); } else if(x == 2){ printf("フーン"); } else if(x == 3){ printf("やっぱり?"); } else if(x != 1){ printf("ハァ?"); } else if(x != 2){ printf("ハァ?"); } else if(x != 3){ printf("ハァ?"); } return 0; } これを実行して 等しくないときハァ?と表示させて、ふたたび、入力をさせる方法を教えてください。何度でも入力を求める方法もありましたら教えていただきたいです。 とても理解に苦しむような質問ですがよろしくおねがいします。

  • C言語のプログラムについて質問

    明解C言語という書籍に 大きい方を表示するプログラム #include <stdio.h> int maxof(int x, int y) {  if (x > y)   return (x);  else   return (y); } int main(void) {  int na, nb;  puts("二つの整数を入力してください。");  printf("整数1:"); scanf("%d", &na);  printf("整数1:"); scanf("%d", &na);  printf("大きいほうの値は%dです。\n", maxof(na, nb));  return (0); } の関数maxofを利用し、 int max4(int w, int x, int y, int z) {  return (maxof(maxof(w, x), maxof(y, z))); } を挿入して変えれば四つの整数から最大値を求められるとのことですが、 コンパイルがうまくいきません。 関数maxofのwとx,yとzをそれぞれ比較し最大値を求めてさらにmaxof(w, x)とmaxof(y, z)を比較して最大値を求めるということですよね?ですので、 maxof(w, x) {  if (w > x)   return (w);  else   return (x); } maxof(y, z) {  if(y > z)   return (y);  else   return (z); を挿入しようとしたらmaxofはすでにありますというようなことが表示されてだめでした。 また、 int maxof(maxof(int w, int x), maxof(int y, int z)) { if (w > x)   return (w); if (w < x)   return (x); if (y > z)   return (y); if (y < z)   return (z); if (maxof(w, x) > maxof(y, z))   return (maxof(w, x)); if (maxof(w, x) < maxof(y, z))   return (maxof(y, z)); } としてみましたがやはりだめでした。 前のページの説明を読み返したりネットで調べてもわかりませんでした。 何がわからないのかがわからないのでもうお手上げです。 長くなってすいません プログラム例と説明をお願いします。

  • scanf が無視されます

    例えば下のようなプログラムを実行するとmain関数の scanf が無視 されてしまいますが何故なのでしょうか。コンパイラはLSI C-86試食版です。 ----------------------------- #include <stdio.h> int main ( ) ; void aa ( ) ; int main ( ) { int i ; aa ( ) ; printf ( " input i. \n " ) ; scanf ( " %d ", &i ) ; printf ( " i = %d\n ", i ) ; } void aa ( ) { int x, y ; while ( scanf ( " %d ", &x ) ! = EOF ) { y = x ; printf ( " y= %d\n ", y ) ; } } --------------------------------

  • 長方形、円、三角形の計算するプログラムでエラーがでます

    タイトルの通りなんですがエラーがでます>< コンパイラはできたのですが、実行して二つ目の入力するとこで、入力したあと止まります。 どこがおかしいのでしょうか? #include <stdio.h> int sikaku(void); int en(void); int main(void) { char ch; int a,b; printf("円(A) 長方形(B) 三角形(C)\n"); printf("入力してください:"); ch = getche(); if(ch == 'C'){ printf("\n底辺を入力してください:"); scanf("%d ",a); printf("高さを入力してください:\n"); scanf("%d",b); printf("%dです",a * b); } else if(ch == 'B') sikaku(); else if(ch == 'A') en(); return 0; } int en(void) { int a; float f; printf("\n半径を入力してください:"); scanf("%d",a); printf("円周率を入力してください:"); scanf("%f",f); printf("%fです",a * a * f); return 0; } int sikaku(void) { int a,b; printf("\n縦を入力してください:"); scanf("%d",a); printf("横を入力してくさい:\n"); scanf("%d",b); printf("dです",a * b); return 0; }

  • ファイル分割について

    今本をみながら練習中なのですが、ファイル分割がうまくいきません。以下のような3つのプログラムをかいたのですが実行できません。 (一つ目:myfunc.h) int max(int x,int y); (二つ目:myfunc.c) int max(int x,int y){ if(x > y) return x; else return y;} (三つ目:sample.c) #include <stdio.h> #include "myfunc.h" int main(void){ int x,y,c; printf("1番目の整数\n"); scanf("%d",&x); printf("2番目の整数\n"); scanf("%d",&y); c = max(x,y); printf("最大値は%d\n",c); return 0;} すべてコンパイルしてsample.cを実行してもだめでした。ご指導お願いします><

  • 3つの整数が等しいかどうか調べるプログラム

    3つの整数が等しいかどうか調べるプログラムがよくわからないので、どなたか教えていただけないでしょうか?ちなみに、わからないながらに作ってみました。 #include <stdio.h> int main(void) { int x, y, z; puts("3つの整数を入力してください。"); printf("整数1:"); scanf("%d",&x); printf("整数2:"); scanf("%d",&y); printf("整数3:"); scanf("%d",&z); if (x==y==z) puts("3つの整数の値は同じです。"); else puts("3つの整数の値は違います。"); return (0); }