You are on page 1of 13

Bo Co Ha My Tnh

Bi 1: Khi qut h thng ha

Vit chng trnh v th hm s y=sin(x) vi - x bng cch:


a) Cho x chy t - n , mi bc tnh gi tr y ri lm trn v bng lnh
putpixel(x,y,c).
b) Chia min xc nh thnh n on bng nhau, tnh gi tr y li cc u mt ca cc
on ri dng lnh lineto(x,y) v. Thay i gi tr n theo di kt qu.
Thut ton v hm sin(x):
- Thit lp cc cu hnh n gin: ch tilex, tiley thay i di, rng
cho th
- V h trc ta ( chia mn hnh thnh 4 phn bng nhau)
- V th:
+ lp i=-100 n 100 (- n ).
x= getmaxx()/2+ int(PI*i*tilex/100).
y= getmaxy()/2-int(sin(i*PI/100)*tiley).
putpixel(x,y,RED) ( i vi cu a).
lineto(x,y) ( i vi cu b).
Code:
#include<conio.h>
#include<stdlib.h>
#include<math.h>
#include<graphics.h>
#include<dos.h>
#define PI 3.1415
#define tilex 20
#define tiley 60
void main() {
int gd=0,gm,x,y,i;
initgraph(&gd,&gm,"F:\\learn\\TC\\BGI");
setcolor(GREEN);
// ve he truc toa do
line(0,getmaxy()/2,getmaxx(),getmaxy()/2);//ve truc x
line(getmaxx()/2,0,getmaxx()/2,getmaxy());// ve truc y
setcolor(YELLOW);
outtextxy(getmaxx()/2-30,getmaxy()/2+5,"(0)");// ve goc toa do o
/* Ve Do Thi*/
for(i=-100;i<=100;i++){
x=getmaxx()/2+int(PI*i*tilex/100);
y=getmaxy()/2-int(sin(i*PI/100)*tiley);
putpixel(x,y,RED);
}
getch();
L Hu Hong Linh

Nhm 6B

Trang 2

Bo Co Ha My Tnh

closegraph();
}
Demo cu a:

Demo cu b ( dng lineto(x,y)) : hnh nh mn hn

L Hu Hong Linh

Nhm 6B

Trang 3

Bo Co Ha My Tnh
Bi tp 2. Cc thut ton c bn :

1. Vit chng trnh nhp to nguyn ca hai im u mt ca on thng AB.


Dng thut ton Bresenham v on thng AB.
Cn nhp cho tt c cc trng hp.
2. Vit chng trnh nhp to ca tm I v bn knh R ca ng trn C(I,R).
Dng thut ton Michener v ng trn C.
Thut ton:
Cu 1:
1.Nhp cc thng s cn thit v tnh x, y, m.
2.Xt nu:
m>1 v m<-1 c im chung l thay x, y cho nhau.
m<0 y=-y.
3. Tnh e(Ti), e(Si), e1.
4. Xt nu:
+ m>1 hoc m<-1 lp iu kin yA!=yB (y tng chm hn).
Putpixel(x,y,c).
Nu e<0 (ban u l e1) th e+= e(Ti).
Ngc li e+=e(Si) v tng x ln 1 n v
Nu m>1 th tng y ln 1 v ngc li gim y 1 n v.
+ Else lp iu kin xA!=xB (x tng chm hn y).
Putpixel(x,y,c).
Nu e<0 e+=e(Ti).
Ngc li e+=e(Si).
m>0 tng y
m<0 gim y
Tng x ln 1 n v
Cu 2:
Nhp cc thng s cn thit v tnh d.
Lp nu x<=y.
setviewport(xo,yo,xo+R,yo+R,0).
Putpixel 8 im i xng nhau qua tm O
Nu d<0 d+=4*x+6.
Ngc li d+=4*(x-y)+10 v gim y 1 n v.
Tng x ln 1 n v
Code:
Cu 1:
void Bresline(int xa,int ya,int xb,int yb,int c){
int dx,dy,e,esi,eti,x,y;
float m;
dx=xb-xa;
dy=yb-ya;
m=dy/(float)dx;
L Hu Hong Linh

Nhm 6B

Trang 4

Bo Co Ha My Tnh

if (m>1||m<-1){//doi vi tri dy va dx cho nhau


dx=dx+dy;
dy=dx-dy;
dx=dx-dy;
}
if(m<0) dy*=-1;//dy=-dy hoac dx=-dx (dx da duoc doi thanh dy truong
hop tren)
e=2*dy-dx;
esi=2*(dy-dx);
eti=2*dy;
x=xa;
y=ya;
if(m>1||m<-1)
while(y!=yb){// cho tang y vi y tang cham hon x
putpixel(x,y,c);
if (e<0) e+=eti;
else { e+=esi;
x++;
}
if(m>1) y++;
else y--;
}
else
while(x!=xb){// cho tang x vi x tang cham hon y
putpixel(x,y,c);
if (e<0) e+=eti;
else { e+=esi;
if (m>0) y++;//0<m<1
if (m<0) y--;//-1<m<0
}
x++;
}
}
Cu 2:
void Mcircle(int xo,int yo,int R){
int x,y,c,d;
setviewport(xo,yo,xo+R,yo+R,0);
d=3-2*R;
x=0;y=R;c=getcolor();
while(x<=y)
{ putpixel(x,y,c);putpixel(-x,y,c);
putpixel(x,-y,c);putpixel(-x,-y,c);
putpixel(y,x,c);putpixel(y,-x,c);
putpixel(-y,x,c);putpixel(-y,-x,c);
if(d<0) d+=4*x+6;
L Hu Hong Linh

Nhm 6B

Trang 5

Bo Co Ha My Tnh

else {d+=4*(x-y)+10;y--;}
x++;
}
}
Demo:
Cu 1: on thng A(40,50) , B(300,300)

Cu 2: ng trn tm O (300,200) bn knh 100 n v di

L Hu Hong Linh

Nhm 6B

Trang 6

Bo Co Ha My Tnh

Cu 3: Hnh hc Fractal
Vit chng trnh nhp bc n ca cc ng cong Fractal. V cc ng cong bc n:
ng cong Koch, C v Rng.
Thut ton:
#define Rad 0.017452 // 1o.
1.Cong Koch
+ Nu n>0 gi quy
K(n-1,l/3,d);d+=60;
K(n-1,l/3,d);d-=120;
K(n-1,l/3,d);d+=60;
K(n-1,l/3,d);
+ Ngc li linerel(int(l*cos(d*Rad)),int(l*sin(d*Rad)));
2. Cong C.
+ define vuong 0.7071 // 2/2
+ Nu n>0 gi quy
d+=45;
C(n-1,l*vuong,d);
d-=90;
C(n-1,l*vuong,d);
d+=45;
+ Ngc li linerel(int(l*cos(d*Rad)),int(l*sin(d*Rad)));
3. Cong Rng (Dragon)
+ Ging ng cong C nhng c s xut hin thm bin du s.
+ Li gi quy s l:
d+=45*s;
CDragon(n-1,l*vuong,d,-1);
d-=90*s;
CDragon(n-1,l*vuong,d,1);
d+=45;
Code:
Cong Koch:
void K(int n,float l,float d){
if(n>0){
K(n-1,l/3,d);d+=60;
K(n-1,l/3,d);d-=120;
K(n-1,l/3,d);d+=60;
K(n-1,l/3,d);
}
else
linerel(int(l*cos(d*Rad)),int(l*sin(d*Rad)));
}
Cong C:
L Hu Hong Linh

Nhm 6B

Trang 7

Bo Co Ha My Tnh

void C(int n,float l,float d){


if(n>0){
d+=45;
C(n-1,l*vuong,d);
d-=90;
C(n-1,l*vuong,d);
d+=45;
}
else
linerel(int(l*cos(d*Rad)),int(l*sin(d*Rad)));
}
Cong Rng:
void CDragon(int n,float l,float d,int s){
if(n>0){
d+=45*s;
CDragon(n-1,l*vuong,d,-1);
d-=90*s;
CDragon(n-1,l*vuong,d,1);
d+=45;
}
else
linerel(int(l*cos(d*Rad)),int(l*sin(d*Rad)));
}
Demo:

L Hu Hong Linh

Nhm 6B

Trang 8

Bo Co Ha My Tnh
Bi 4: Php bin i 2 chiu

Ci t cc php affine hai chiu trong h to thun nht:


a) Khai bo kiu afine
b) nh ngha cc hm cn thit: bin i nh ca 1 im, ci t cho cc php tnh
tin, php quay, php bin dng, php mo hnh, tch hai php afine.
Chng trnh v gia mn hnh mt a gic u v gi cc hm ny m phng
qut my quay bng cch cho a gic quay quanh tm ca n
Thut ton: Affine
Code:
Kiu affine
#include<math.h>
typedef float Point[2];
typedef float Affine[3][3];
void ptoa(Point A,Affine &B){
B[0][0]=A[0];
B[0][1]=A[1];
B[0][2]=1;
}
void MatMul(Affine A,Affine B,Affine &C,int m,int n){
int i,j,k;
for(i=0;i<m;i++)
for(j=0;j<n;j++){
C[i][j]=0;
for(k=0;k<n;k++)
C[i][j]+=A[i][k]*B[k][j];
}
}
void Quay(Affine &T,float fi){
T[0][0]=cos(fi);
T[0][1]=sin(fi);
T[0][2]=0;
T[1][0]=-sin(fi);
T[1][1]=cos(fi);
T[1][2]=0;
T[2][0]=0;
T[2][1]=0;
T[2][2]=1;
}
void Tinhtien(Affine &T,float x,float y){
T[0][0]=1;
L Hu Hong Linh

Nhm 6B

Trang 9

Bo Co Ha My Tnh

T[0][1]=0;
T[0][2]=0;
T[1][0]=0;
T[1][1]=1;
T[1][2]=0;
T[2][0]=x;
T[2][1]=y;
T[2][2]=1;
}
void Nghieng(Affine &T,float h,float g){
T[0][0]=1;
T[0][1]=g;
T[0][2]=0;
T[1][0]=h;
T[1][1]=1;
T[1][2]=0;
T[2][0]=0;
T[2][1]=0;
T[2][2]=1;
}
void Codan(Affine &T,float Sx,float Sy){
T[0][0]=Sx;
T[0][1]=0;
T[0][2]=0;
T[1][0]=0;
T[1][1]=Sy;
T[1][2]=0;
T[2][0]=0;
T[2][1]=0;
T[2][2]=1;
M phng qut quay = tam gic u quay quanh tm
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <graphics.h>
#include "Affine.h"
#define RAD 0.017452
void main(){
int gd=0,gm=0,n=0;
int k[50];
Point x={300,200},y;
Affine Tz,Ty,Tzz,Tx,Txx,Tyy,Tu,Tuu,T;
initgraph(&gd,&gm,"F:\\Learn\\TC\\BGI");
ptoa(x,Tx);
//ve tam giac
Tinhtien(T,-x[0],-x[1]);MatMul(Tx,T,Txx,1,3);
Tinhtien(T,0,100);MatMul(Txx,T,Ty,1,3);
L Hu Hong Linh

Nhm 6B

Trang 10

Bo Co Ha My Tnh

Quay(T,120*RAD);MatMul(Ty,T,Tz,1,3);
Quay(T,120*RAD);MatMul(Tz,T,Tu,1,3);
Tinhtien(T,x[0],x[1]);
MatMul(Txx,T,Tx,1,3);
MatMul(Ty,T,Tyy,1,3);
MatMul(Tz,T,Tzz,1,3);
MatMul(Tu,T,Tuu,1,3);
circle(int(x[0]),int(x[1]),101);
//quat quay
setwritemode(XOR_PUT);
while(!kbhit()){
//Tinhtien
Tinhtien(T,-x[0],-x[1]);
MatMul(Tyy,T,Ty,1,3);
MatMul(Tzz,T,Tz,1,3);
MatMul(Tuu,T,Tu,1,3);
//Quay
Quay(T,n*RAD);
MatMul(Ty,T,Tyy,1,3);
MatMul(Tz,T,Tzz,1,3);
MatMul(Tu,T,Tuu,1,3);
//tinhtien
Tinhtien(T,x[0],x[1]);
MatMul(Tyy,T,Ty,1,3);
MatMul(Tzz,T,Tz,1,3);
MatMul(Tuu,T,Tu,1,3);
Tyy[0][0]=Ty[0][0];Tyy[0][1]=Ty[0][1];
Tzz[0][0]=Tz[0][0];Tzz[0][1]=Tz[0][1];
Tuu[0][0]=Tu[0][0];Tuu[0][1]=Tu[0][1];
//ve tam giac
k[0]=Ty[0][0];k[1]=Ty[0][1];
k[2]=Tz[0][0];k[3]=Tz[0][1];
k[4]=Tu[0][0];k[5]=Tu[0][1];
k[6]=Ty[0][0];k[7]=Ty[0][1];
setcolor(LIGHTRED);
drawpoly(4,k);
delay(50);
drawpoly(4,k);
n+=1;
}
getch();
closegraph();
}
L Hu Hong Linh

Nhm 6B

Trang 11

Bo Co Ha My Tnh

Demo:

L Hu Hong Linh

Nhm 6B

Trang 12

Bo Co Ha My Tnh

Bi 5 Thit k ng cong v mt cong.


Vit chng trnh nhp to ca n iu khin, dng thut ton Casteljau v
ng cong qua cc im iu khin ny.
Thut ton: casteljau
+ Pir(t) = (1-t)*Pir-1(t) + t*Pi+1r-1(t)
Vi r= 1L ( L l s im iu khin).
Vi i= 0L-r
Vi t [0,1]
+ Th h cui cng P0L (t) l ng cong Bezier
+ V:
+ Khai bo struct Point{ int x; int y;}, mng Point p[50][50],
+ Chuyn gi tr t mng tham s vo mng im p.
+ Lp t t 1 n 100. (t l tham s ca phng trnh ng cong p)
Lp tng r t 1 n n ( n l s im kim sot)
Lp tng i t 1 n n-r
p[i][r].x=(1-t/100.0)*p[i][r-1].x+(t/100.0)*p[i+1][r1].x;
p[i][r].y=(1-t/100.0)*p[i][r-1].y+(t/100.0)*p[i+1][r1].y;
putpixel(p[0][n-1].x,p[0][n-1].y,LIGHTRED);// im thuc
ng cong.
Code:
void Bezier(int n,int *a){
int r,i,pn=0,t;
Point p[50][50];
// tao gia tri diem cho p
for(i=0;i<n*n-1;i+=2){
p[pn][0].x=a[i];
p[pn][0].y=a[i+1];
putpixel(p[pn][0].x,p[pn][0].y,LIGHTCYAN);
pn++;
};
// ve
for(t=1;t<100;t++){
for(r=1;r<n;r++)
for(i=0;i<n-r;i++) {
p[i][r].x=(1-t/100.0)*p[i][r-1].x+(t/100.0)*p[i+1][r-1].x;
p[i][r].y=(1-t/100.0)*p[i][r-1].y+(t/100.0)*p[i+1][r-1].y;
}
putpixel(p[0][n-1].x,p[0][n-1].y,LIGHTRED);
}
L Hu Hong Linh

Nhm 6B

Trang 13

Bo Co Ha My Tnh

}
Demo:

L Hu Hong Linh

Nhm 6B

Trang 14

You might also like