2009. 8. 10. 08:06

sin 그래프 그리기



#include <stdio.h>
#include <math.h>

#define X 50
#define Y 79

void graphSine(void);    //sine 함수의 그래프를 그리는 함수
double PI(void);     //원주율을 반환하는 함수
void initializing(char graph[][X], double x[], double y[], int index[]); //초기화 함수
void settingStar(char graph[][X], int index[]);        //그래프모양을 '*'로 세팅
void plot(char graph[][X]);   //그래프를 plot

int main(void)
{
 graphSine();
 return 0;
}

void graphSine(void) {    //sine 함수의 그래프를 그리는 함수
 char graph[Y][X] = {' '};  //그래프 모양의 '*'를 저장할 배열
 double x[X];     //x축 값을 저장할 배열
 double y[X];     //y축 값을 저장할 배열
 int index[X];     //graph에서 '*'로 표시될 index를 저장하기 위한 배열

 initializing(graph, x, y, index);
 settingStar(graph, index);
 plot(graph);
}

double PI(void) {     //원주율을 반환하는 함수
 return acos(-1);
}

void initializing(char graph[][X], double x[], double y[], int index[]) {  //초기화 함수
 const double T = 2*PI();  //주기 2pi
 const double dx = T/(X-1);  //x축값들 사이의 간격
 int i, j;

 for(i=0 ; i<X ; i++) {   //x축을 나타내기 위한 세팅
  graph[(Y-1)/2][i] = '|';
 }

 for(i=0 ; i<X ; i++) {   //x 값을 0부터 2pi까지 등간격으로 나누어 초기화
  x[i] = i*dx;
 }

 for(i=0 ; i<X ; i++) {   //x 값에 대응하는 sin(x)값을 초기화후 0부터 Y-1 사이의 값으로 확대
  y[i] = sin(x[i]);
  y[i] = (Y-1)/2*(y[i]+1);
 }

 for(i=0 ; i<X ; i++) {   //y값을 0부터 Y-1 사이의 정수 값으로 이산화
  for(j=0 ; j<Y ; j++) {
   if(j-0.5 <= y[i] && y[i] < j+0.5) {
    index[i] = j;
    break;
   }
  }
 }
}

void settingStar(char graph[][X], int index[]) {  //그래프모양을 '*'로 세팅
 int i;

 for(i=0 ; i<X ; i++) {
  graph[index[i]][i] = '*';
 }
}

void plot(char graph[][X]) {  //그래프를 plot
 int i;
 int j;

 for(i=0 ; i<Y ; i++) {   //y축 그리기
  switch(i) {
   case 0:
    printf("-1");
    break;
   case (Y-1)/2-1:
    printf("0");
    break;
   case Y-1:
    printf("1\n");
    break;
   default:
    printf("-");
  }
 }

 for(j = 0 ; j<X ; j++) {  //'*'를 이용해 그래프를 출력
  for(i=0 ; i<Y ; i++) {
   printf("%c", graph[i][j]);
  } puts("\n");
 }
}


사용자 삽입 이미지