Week 10-1. (응용프로그램작성) 수학문제, 그래픽스 기초 [Download]

Download Report

Transcript Week 10-1. (응용프로그램작성) 수학문제, 그래픽스 기초 [Download]

응용프로그램
- 수학계산
- 그래픽스
2003. 5. 6.
수학문제 풀기
- 방정식 근 구하기
N차 방정식 근 구하기

f(x) = 0을 만족하는 x값 ?
– 공식 이용: 2차, 3차 함수에서는
가능하지만,
– 공식이 없는 4차이상의 고차함수, 지수,
로그함수를 포함한 초월함수라면 ?

수치해석 이용
– 수치해석 = 수학 + 컴퓨터
– 근사값을 구하자!
3
방정식 근 구하기

중간값 정리
– 함수 f:[a,b]->R 이 연속이고,
– f(a)*f(b) < 0 이면
– f(c)=0 인 c가 (a,b) 안에 적어도 하나
존재한다.
f(b) < 0
f(x)
f(a) < 0
a
c=?
b
4
방정식 근 구하기

함수의 그래프가 연결되어 있다면
반드시 a와 b 사이에서 x축을 지나야
한다.
– x=c에서 x축을 지난다면 이 점 c는 f(x) =
0을 만족하는
– 즉, 방정식 f(x) = 0의 근은 x = c
5
구간법 (Bracketing)
f(a) < 0
a
a+0.0001 a+0.0002 a+0.0003
6
#include<stdio.h>
#include<conio.h>
#define Y(x) (2*(x)-50)*(3*(x)-50)*(2*(x)-1)
#define START -100
#define END +100
#define ERROR 0.0001
void main(void)
{
float a, b;
float x= START;
float root[3];
int root_count=0;
int i;
clrscr();
while(x<=END){
a = Y(x);
b = Y((x+ERROR));
}
}
if(a*b<=0){
printf("x=%.4f, a=%.4f, b=%.4f, a*b=%.4f\n", x, a, b, a*b); getch();
root[root_count] = x+ERROR;
root_count++;
}
x+=ERROR;
for(i=0;i<3;i++)
printf("\n\t%dth root is %.4f",(i+1),root[i]);
7
이분법 (Bisection method)
오차범위
f(b) < 0
m1=(a+b)/2
f(a) < 0
a
b
m2=(m1+b)/2
8
그래픽스 (Graphics)
- 기초
- 수학 함수 그리기
기초

모드 전환
– 텍스트 모드: 하나의 문자  하나의 셀
– 그래픽 모드: 하나의 점  픽셀 (pixel)

픽셀
– 화면을 구성하는 가장 작은 점
– 픽셀의 수가 많을수록 화면에서 이미지가
정교하게 표현됨
• VGA의 표준은 640 x 480 픽셀
• SVGA의 표준은 800 x 600 픽셀
10
기초

void far initgraph(graphdrive,graphmode,
pathtodriver);
– 그래픽 모드로 변환
– int far *graphdrive
• 인수 그래픽 드라이버의 종류
• 그래픽 카드의 종류를 가리키는 정수형 포인터이다. graphdriver에 자동
검출을 세트하면 de graphmode를 호출하여 하드웨어의 구성을 조사해서
적당한 드라이버가 선택되고, 그 드라이버의 모드 중 가장 고해상도인 것이
선택됨
– int far *graphmode
• 초기 그래픽 모드를 가리키는 정수형 포인터이다. 자동 검출인 겨우는
검출된 드라이버에 대한 가장 고해상도의 모드로 설정
– char far *pathtodriver
• BGI파일이 있는 디렉토리 경로를 뜻하는 문자열을 가리키는 문자형
포인터이다. 주로 사용하는 BGI파일은 EGAVGA.BGI
• 만약 EGAVGA그래픽 프로그램의 실행파일과 같은 디렉토리에 있다면 널
문자열인 ""을 씀
• 만약, VGI 파일이발견되지 않으면 발견되지 않으면 실행시에 "BGI Error:
Graphics not initialized"라는 에러 메시지를 출력
11
기초

cleardevice
– 화면상의 모든 내용을 지움.

closegraph
– 그래픽 시스템이 내부적으로 사용하고 있던 메모리를
해제하면서 initgraph가 호출되기 전의 화면모드로
귀환.
– closegraph()를 하지 않고 프로그램을 종료할 경우
그래픽모드로 계속 남아 있게 됨.
12
기초 - 그리기함수

line(x1,y1,x2,y2)
– 시작점(x1,y1) 끝점(x2,y2)을 직선으로 긋는다.

lineto(x,y)
– 현재의 위치에서 좌표(x,y)로 직선을 긋는다. 현재의 위치는
(x,y)가 된다.

linerel(x,y)
– 현재의 위치에서 (dx,dy) 만큼 떨어진 점으로 직선을
긋고,현재의 위치를 직선의 끝점으로 이동한다.

moveto(x,y)
– 현재의 위치를 좌표(x,y)로 이동시킨다. 그림은 그리지 않는다.

moverel(x,y)
– 현재위치를 (dx,dy)만큼 떨어진 점으로 이동시킨다. 그림은
그리지 않는다.
13
기초 - 그리기함수

ellipse(x,y, stangle, endangle, xradius,
yradius)
– 좌표(x,y)를 중심으로 수평방향의 반지름 xradius, 수직
방향의 반지름 yradius인 타원 원호를 그린다. 원호의
개시각을 0으로 하여, 종료각을 360으로 하면 완전한 타원이
된다.

circle(x,y,rradius)
– 좌표 (x,y)를 중심으로 반지름 radius인 원을 그린다.

rectangle(x,y,x1,y1)
– 현행 색 형태, 폭을 사용하여 좌표 (x,y)을 upper left
좌표, (x1, y1)을 lower right 좌표로 하여 직사각형을
그린다.

fillellipse(x,y, xradius,yradius)
– 좌표 (x,y)를 중심으로 수평방향의 반지름 xradius, 수직
방향의 반지름 yradius인 타원을 그리고 현재 채색 패턴과
색상에 따라 내부를 칠한다.
14
기초 – 텍스트 출력

outtext (int x, int y, char *str)
– (x,y)좌표에 문자열 str의 내용을 출력
15
기초 – 컬러제어, 상태조회

컬러제어
– 출력할 도형의 색깔을 지정
• setcolor()
– 현재 배경색, 팔레트 드의 정보 조회
• getbkcolor(), getpallete()

상태조회
– 현재의 cursor position, 뷰포트, 화면의 좌우 시각
비율 등의 정보 조회
• getx(); getcolor(); getfillpattern()
• getmaxx();, getmaxy();

기타
– sprintf ( ): 문자열에 대해 출력
• Cf) printf ( ): 표준출력 함수
16
원 그리기
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
int main(void)
{
/* request auto detection */
int gdriver = DETECT, gmode, errorcode;
/* initialize graphics and local variables */
initgraph(&gdriver, &gmode, "");
/* read result of initialization */
errorcode = graphresult();
if (errorcode != grOk) /* an error occurred */
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1); /* terminate with an error code */
}
for(int i=0;i<10;i++){
setcolor(i);
circle(getmaxx()/2,getmaxy()/2,20*i);
}
closegraph();
}
17
SIN(x) 함수 그리기
1.
2.
3.
그래픽 모드로 전환
그래프를 그리기 위한 영역(직사각형) 확보하여
x, y축 그리기
X축 눈금 그리기
•
4.
그래프 출력
•
5.
6.
sprintf와 outtext 함수 이용
putpixel (x, y, color) 함수 이용
최대, 최소값 출력
주의사항
•
•
스케일에 일정한 수(30정도)을 곱해줌.
픽셀 출력시 수학함수(sin함수 등)값 float형을
int형으로 변환해줌.
18
SIN(x) 함수 그리기
#include<graphics.h>
#include<stdio.h>
#include<conio.h>
#include<math.h>
#define f(x)
sin(x*M_PI/180)
void main(void)
{
int gdriver = DETECT, gmode, errorcode;
float x, y;
int i, j, midx, midy;
float fmaxx, fmaxy, fminx, fminy;
char *str;
//그래프모드로 전환
initgraph(&gdriver, &gmode, "");
cleardevice();
//setbkcolor(WHITE);
midx=getmaxx()/2;
midy=getmaxy()/2;
19
SIN(x) 함수 그리기
//X축, Y축
setcolor(GREEN);
rectangle(0,0,getmaxx(),getmaxy());
moveto(0,midy); lineto(getmaxx(),midy);
moveto(midx,0); lineto(midx,getmaxy());
moveto(getmaxx()-10,midy+20); outtext("X");
moveto(midx+10,10);
outtext("Y");
//X축 눈금 표시
for(x=midx-30*10,i=-10;x<=midx+30*10;x+=30,i++){
moveto(midx-30*i,midy-5);
lineto(midx-30*i,midy+5);
sprintf(str,"%d",-i);
outtextxy(midx-30*i,midy+10,str);
}
20
SIN(x) 함수 그리기
//그래프 및 최대값, 최소값 표시
setcolor(LIGHTBLUE);
fmaxx=fminx=-180+midx;
fmaxy=fmaxy=90*f(-180);
for(x=-180; x<180; x++){
y = 90*f(x);
putpixel((int)(midx+x),(int)(midy+y),LIGHTRED);
if(y>fmaxy)
{ fmaxy=y; fmaxx=x; }
if(y<fminy)
{ fminy=y; fminx=x; }
}
sprintf(str, "min: f(%4.2f)=%4.2f", fmaxx*M_PI/180,fmaxy/90);
outtextxy(midx+fmaxx,midy+fmaxy,str);
sprintf(str, "max: f(%4.2f)=%4.2f", fminx*M_PI/180,fminy/90);
outtextxy(midx+fminx,midy+fminy-10,str);
getch();
closegraph();
}
21