グラフィックエディタ



23.グラフィックエディタ
成績:10/割引:0.8
背景
グラフィックエディタ(graphical editor)は、よく使われるPhotoshopのようなビットマップ画像の変更をユーザーに許可します.この変更方法は、テキストエディタがドキュメントの変更を許可する方法と同じです.ビットマップ画像はMxNのピクセルマトリクスで表され、各ピクセルポイントに所定の色があります.
簡単なインタラクティブグラフィックエディタをシミュレートするためのプログラムを作成することです.
入力
入力は、編集コマンドシーケンスのセットで構成され、各シーケンスが1行を占めます.各コマンドは大文字で表され、各行のシーケンスの先頭文字の位置に配置されます.コマンドにパラメータが必要な場合は、与えられたパラメータはコマンドと同じ行に配置され、スペースで区切られます.画素点の座標は2つの整数で表され、列座標の範囲は1からM、座標の範囲は1からN(1グラフィックエディタで受信できるコマンドの内容を説明します.
I M N
新しいMxNサイズの画像が生成され、画像内のすべての画素点の初期色が白色(0)であることを示す.
C
すべてのピクセルポイントを白に設定することでテーブルをクリアすることを示します.マトリクスのサイズは変更されません.
L X Y C
座標が(X,Y)の画素点の色を色(C)に塗ることを表す.
V X Y1 Y2 C
色が(C)の垂直線分を描き、線分の列座標がXであり、行座標がY 1からY 2の間にあり、Y 1とY 2の2点を含むことを示す.
H X1 X2 Y C
色(C)の水平線分を描き、線分の行座標をY、列座標をX 1からX 2の間に、X 1とX 2の2点を含むことを示す.
K X1 Y1 X2 Y2 C
塗りつぶし色(C)の矩形を描き、座標(X 1,Y 1)は矩形の左上隅、座標(X 2,Y 2)は矩形の右下角を表す.
F X Y C
領域Rを色(C)で塗りつぶすことを表す.領域Rの定義は、画素点(X,Y)が領域Rに属する.画素点(X,Y)の色と同様に、領域R内の任意の画素点と共通のエッジを共有する他の任意の画素点も領域Rに属する.
S Name
MSDOS 8.3の形式でファイル名を書き、ファイル名の後に現在の画像の内容が続くことを示す.
X
今回の会話操作を終了することを示します.
しゅつりょく
各S NAMEコマンドを実行すると、NAME(70文字以下)で命名されたファイル名(行を占める)と、現在の画像の内容が印刷されます.画像の各行は、各ピクセルポイントの色の内容で表されます.出力サンプルを参照してください.
出力は、上記のアルファベット(I、C、L、V、H、K、F、S、X)で定義されていないコマンドラインを無視して、次のコマンドを実行し続けます.他のエラーが発生した場合、プログラムの実行は予測できません.
ソースhttp://acm.uva.es/p/v102/10267.html
 
#include<stdio.h>
#include<string.h>

char canvas[252][252],name[71],color;
int M,N;

void build();
void fill(int x,int y,char c);

int main()
{	char order,c,error[100];
	int x,y,x1,x2,y1,y2,t,i,j;
	
	do{
		scanf("%c",&order);
		getchar();
		switch(order)									/*I、C、L、V、H、K、F、S X*/
		{	
			case 'I' :	{	scanf("%d%d",&M,&N);
							getchar();
							build();
							break;
					}
			case 'C' :	{	build();
							break;
						}
			case 'L' :	{	scanf("%d%d",&x,&y);
							getchar();
							scanf("%c",&color);
							getchar();
							canvas[y][x]=color;
							break;
						}
			case 'V' :	{	scanf("%d%d%d",&x,&y1,&y2);
							getchar();
							scanf("%c",&color);
							getchar();
							if(y1>y2)
							{	t=y1;
								y1=y2;
								y2=t;
							}
							for(i=y1;i<=y2;i++)
								canvas[i][x]=color;
							break;
						}
			case 'H' :	{	scanf("%d%d%d",&x1,&x2,&y);
							getchar();
							scanf("%c",&color);
							getchar();
							if(x1>x2)
							{	t=x1;
								x1=x2;
								x2=t;
							}
							for(i=x1;i<=x2;i++)
								canvas[y][i]=color;
							break;
						}
			case 'K' :	{	scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
							getchar();
							scanf("%c",&color);
							getchar();
							if(x1>x2)
							{	t=x1;
								x1=x2;
								x2=t;
							}
							if(y1>y2)
							{	t=y1;
								y1=y2;
								y2=t;
							}
							for(i=y1;i<=y2;i++)
								for(j=x1;j<=x2;j++)
									canvas[i][j]=color;
							break;
					}
			case 'F' :	{	scanf("%d%d",&x,&y);
							getchar();
							scanf("%c",&color);
							getchar();
							c=canvas[y][x];
							fill(y,x,c);
							for(i=1;i<=N;i++)
								for(j=1;j<=M;j++)
								{	if(canvas[i][j]=='\0')
										canvas[i][j]=color;
								}
							break;
						}
			case 'S' :	{	gets(name);
							printf("%s
",name); for(i=1;i<=N;i++) printf("%s
",&canvas[i][1]); break; } default : { if(order!='X') gets(error);} } }while(order!='X'); return 0; } void build( ) { int i,j; for(i=1;i<=N;i++) { for(j=1;j<=M;j++) canvas[i][j]='0'; canvas[i][j]='\0'; } return; } void fill(int y,int x,char c) { if(canvas[y][x]==c||canvas[y][x]=='0') canvas[y][x]='\0'; else return; if(x!=1) fill(y,x-1,c); if(x!=M) fill(y,x+1,c); if(y!=1) fill(y-1,x,c); if(y!=N) fill(y+1,x,c); return ; }