巡回路プログラムの描画

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

巡回路プログラムの描画

#1

投稿記事 by ft-86 » 13年前

tour.datを読み込んで表示する描画画面に書く関数ですが、、、
(User関数のみですので他のXMARGIN等の文字は汲み取ってください。)

void draw(char *outfile,int x[MAX_N],int y[MAX_N],int n){
int i;
gdImagePtr im;
FILE *fp,*fpr;
int white,black,red,yellow;
char number[5];
char number2[7];
int tour[MAX_N];
int px,py,qx,qy;
int city_a,city_b;

if ((fp=fopen(outfile,"wb")) == NULL) {
fprintf(stderr,"Error: File %s open failed.\n",outfile);
exit(0);
}

im = gdImageCreate (700, 700); /* 700x700 のイメージを作成する */

/* 変数 yellow に黄色を割り当てる. 黄色が背景色になる */
yellow = gdImageColorAllocate (im,255,255,0);

/* 変数 black に黒色を, 変数 red に赤色を割り当てる */
black = gdImageColorAllocate(im, 0, 0, 0);
red = gdImageColorAllocate(im, 255, 0, 0);

// 描画画面に点 i を半径7pxの黒丸でプロットし, さらに, 番号iを黒字で添える.
for(i=1;i<=n;i++) {
gdImageArc(im, x+XMARGIN,y+YMARGIN, 7, 7, 0, 360, black);
sprintf(number,"%2d",i);
gdImageString(im, gdFontSmall, x+XMARGIN,y+YMARGIN+5,number,black);
}
// 巡回路データ tour.dat を開く
if( (fpr=fopen(TOUR_DATA,"rt")) == NULL ){
fprintf(stderr,"File(tour.dat) open error");
exit(1);
}
// 巡回路の読み込み
for(i=1; i<=n; i++) fscanf(fpr,"%d",&tour);
fclose(fpr);

for(i=1; tour[i+1] != 0 && i<n;i++) {
city_a=tour; city_b=tour[i+1];
px= x[city_a]+XMARGIN; py= y[city_a]+YMARGIN;
qx= x[city_b]+XMARGIN; qy= y[city_b]+YMARGIN;
gdImageLine(im, px,py, qx,qy, black);
} // 訪問順に従い、描画画面に都市aから都市bへの枝を黒で描く
if( i == n ){ // 経路が巡回路であれば
city_a=tour[n]; city_b=tour[1];
px= x[city_a]+XMARGIN; py= y[city_a]+YMARGIN;
qx= x[city_b]+XMARGIN; qy= y[city_b]+YMARGIN;
gdImageLine(im, px,py, qx,qy, black);
// n番目の訪問都市まで枝を描いたらならばn番目から1番目の訪問都市へ枝を描く
}


// 描画画面に巡回路の総距離を印字する
sprintf(number2,"%5.1lf",tour_length(x,y,n,tour)); // 巡回路tourの総距離
gdImageString(im, gdFontSmall, 500, 0,"total_length = ",black);
gdImageString(im, gdFontSmall, 600, 0,number2,black);

/* 標準出力にイメージを png フォーマットで出力する */
gdImagePng(im,fp);

fclose(fp);

/* 作成したイメージを破棄する */
gdImageDestroy(im);
}

他のプログラムからなんですが、この関数を含むプログラムを2回呼び出し、
前の点の配置と変更後の点の配置に応じて2つの画像ができあがります。
ここで、上記の内容を更に、変更した点から点への「枝」だけをを"赤色"に変更
しようと以下の部分に変えたのですが、

// 巡回路データ tour_a.dat を開く
if( (fpr=fopen(TOUR_DATA_A,"rt")) == NULL ){
fprintf(stderr,"File(tour.dat) open error");
exit(1);
}
// 巡回路の読み込み
for(j=1; j<=n; j++) fscanf(fpr,"%d",&tour[j]);
fclose(fpr);

for(i=1; tour[i+1] != 0 && i<n;i++) {
for(j=1; tour[j+1] !=0 && j<n;j++) {
city_a=tour; city_b=tour[i+1];
px= x[city_a]+XMARGIN; py= y[city_a]+YMARGIN;
qx= x[city_b]+XMARGIN; qy= y[city_b]+YMARGIN;
if(tour == tour[j] && tour[i+1] == tour[j+1])
{gdImageLine(im, px,py, qx,qy, black);}
else{gdImageLine(im, px,py, qx,qy, red);}
}
}

if( ....

このプログラムに変更すると
点の配置を変更した後の点が変更されていない状態で、
赤の枝もうまく変更した点だけの場所になっていません。
どこがおかしいのでしょうか?

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