ページ 1 / 1
画像処理についての課題がでました。
Posted: 2006年10月26日(木) 09:57
by ふわりん
pixelを用いて図形を描く問題です。初めて習う分野なので戸惑ってます。
① 15×15の画面に(3,3),(3,10),(10,10),(10,3)のBOXを描きなさ
い。
② 15×15の画面に(3,3)-(10,8)の直線を描きなさい。
また、(3,3)-(8,10)の直線も加えなさい。
授業で習った例題を応用して書くプログラムだと思うのですが、イマイチわかりません。下に授業で扱った例題プログラムを示しておきます。
#define XSIZE 15
#define YSIZE 15
#include <stdio.h>
main(){
char pixel[XSIZE][YSIZE];
int x,y;
for(y=0;y<YSIZE;y++) for(x=0;x<XSIZE;x++)pixel[x][y]='.';
for(x=0;x<XSIZE;x++) pixel[x][x]='*';
for(y=0;y<YSIZE;y++){
for(x=0;x<XSIZE;x++) printf("%c",pixel[x][y]);
printf("\n");
}
}
このプログラムをもとに上記の課題プログラムを作るんだと思います。
2題ありますが、できれば両方解説していただきたいです。
よろしくお願いします。
期限は来週の火曜日までなので、今週中にはお願いしたいです。
何度も無理を言ってしまってスミマセン。
Re:画像処理についての課題がでました。
Posted: 2006年10月26日(木) 12:37
by keichan
とりあえず①の回答例だけ。
/*********************************************************/
/** ①の回答例
/** ベタに書くとこんな感じになります。
/*********************************************************/
#define XSIZE (15)
#define YSIZE (15)
#include <stdio.h>
int main()
{
char pixel[YSIZE][XSIZE];
int x,y;
/* pixel配列の初期化(全て'.'で初期化) */
for( y=0; y<YSIZE; y++ ) {
for( x=0; x<XSIZE; x++ ) {
pixel[y][x] = '.';
}
}
/* Boxの左上から右上(3,3)->(10,3)を描く準備をする */
for( x=3; x<=10; x++ ) {
pixel[3][x] = '*';
}
/* Boxの右上から右下(10,3)->(10,10)を描く準備をする */
for( y=3; y<=10; y++ ) {
pixel[y][10] = '*';
}
/* Boxの右下から左下(10,10)->(3,10)を描く準備をする */
for( x=10; x>=3; x-- ) {
pixel[10][x] = '*';
}
/* Boxの左下から左上(3,10)->(3,3)を描く準備をする */
for( y=10; y>=3; y-- ) {
pixel[y][3] = '*';
}
/* 描画処理 */
for( y=0; y<YSIZE; y++ ) {
for( x=0; x<XSIZE; x++ ) {
printf("%c", pixel[y][x]);
}
printf("\n");
}
return 0;
}
あと、関数や構造体についての勉強は既にされていますか?
Re:画像処理についての課題がでました。
Posted: 2006年10月26日(木) 13:03
by ふわりん
①の解答ありがとうございました。
関数と構造体に関してはまだやってないと思います。
Re:画像処理についての課題がでました。
Posted: 2006年10月26日(木) 14:42
by バグ
②の回答例です。結構、ひねりの入った問題ですね。ちょっと悩みましたよ(^_^;)
#define XSIZE 15
#define YSIZE 15
#include <stdio.h>
void main()
{
char pixel[XSIZE][YSIZE];
int x , y , a , i;
double xx , yy , move_x , move_y;
// 画面全体を'.'で埋める
for( y = 0 ; y < YSIZE ; y++ )
{
for( x = 0 ; x < XSIZE ; x++ )
{
pixel[x][y] = '.';
}
}
///////////////////////////////////////////////////////////////////////////
// (3,3)-(10,8)の直線
///////////////////////////////////////////////////////////////////////////
// 計算用のX座標の初期化
xx = 3.0;
// 計算用のY座標の初期化
yy = 3.0;
// Y座標が1つ動く毎にX座標がどれだけ動くかを計算する
// 今回の場合はYが5移動する間にXが7移動するので、下記のようになる
move_x = 7.0 / 5.0;
// X座標の初期化
x = 3;
for( y = 3 ; y <= 8 ; y++ ) // Yの移動量を基準にしているため、Yの移動量は必ず1になる
{
// 計算用のX座標に移動量を足す
xx += move_x;
// 現在の座標から、X座標が何マス移動したかを計算する
a = ( int )xx - x;
// もし、一度に1以上移動していた場合は現在の場所から、移動先座標まで'*'にする
for( i = 0 ; i < a ; i++ )
{
pixel[x + i][y] = '*';
}
// 実際のX座標に移動量を足す
x += a;
}
///////////////////////////////////////////////////////////////////////////
// (3,3)-(8,10)の直線
///////////////////////////////////////////////////////////////////////////
// 計算用のX座標の初期化
xx = 3.0;
// 計算用のY座標の初期化
yy = 3.0;
// X座標が1つ動く毎にY座標がどれだけ動くかを計算する
// 今回の場合はXが5移動する間にYが7移動するので、下記のようになる
move_y = 7.0 / 5.0;
// 実際のY座標の初期化
y = 3;
for( x = 3 ; x <= 8 ; x++ ) // Xの移動量を基準にしているため、Xの移動量は必ず1になる
{
// 計算用のY座標に移動量を足す
yy += move_y;
// 現在の座標から、Y座標が何マス移動したかを計算する
a = ( int )yy - y;
// もし、一度に1以上移動していた場合は現在の場所から、移動先座標まで'*'にする
for( i = 0 ; i < a ; i++ )
{
pixel[x][y + i] = '*';
}
// 実際のY座標に移動量を足す
y += a;
}
///////////////////////////////////////////////////////////////////////////
// 画面全体を表示する
///////////////////////////////////////////////////////////////////////////
for( y = 0 ; y < YSIZE ; y++ )
{
for( x = 0 ; x < XSIZE ; x++ )
{
printf( "%c" , pixel[x][y] );
}
printf("\n");
}
}
Re:画像処理についての課題がでました。
Posted: 2006年10月26日(木) 18:05
by keichan
バグさんが②についての回答例を挙げてらっしゃいますので、
私のほうでは回答例を挙げません。
補足というかもうちょっと突っ込んだ話を。。。
②では "傾きのある直線" をどうやって描画するか?
が一番の難所になっているでしょう。
"傾きのある直線" といえば、中学校の数学の時間に習った [一次関数](y = ax + b) が理解できていればご自分でも図を書けると思います。
まずは、自分の手で紙に図を書いてみてはいかがでしょうか?
プログラムを組むのは自分の頭でどういう手順を踏む必要があるのか。を理解していないと組めません。
日本人が日本語で説明できないものを英語で説明しようとしても無理でしょう?
それと同じことです。
まずは、どういう処理を行う必要があるのかを理解してから回答例と睨めっこしてください。
また、回答例に書かれている事を理解するだけではなく、オリジナル(できれば違う処理で)を書いてみることを強くお勧めします。
Re:画像処理についての課題がでました。
Posted: 2006年10月26日(木) 23:13
by ふわりん
>バグさん
>keichanさん
解答&助言ありがとうございます。
そうですよね。
実際にどのような意味を持っているのか頭の中で整理できていないとプログラムは書けないですよね。
まだまだ、私は初心者で右も左もわからないことばかりなので、少しずつ理解を深めていきたいと思います。