tổng hợp code đồ họa máy tính cho sinh viên
Trang 1Int color = RED;
Void DDA_line(int x1,int y1,int x2,int y2)
int gd,gm=0; gd=DETECT; initgraph(&gd,&gm,"C://TC//BGI");
setbkcolor(GREEN); int xA,xB,yB,yA;
cout<<"nhap diem A\n "; cout<<"xA= ";cin>>xA; //50
Trang 21.1 Cho điểm A có tọa độ (100,50) và điểm B có tọa độ (200,130).
- Trình bày thuật toán ĐA tương ứng để vẽ đoạn thẳng AB (trình bày trường hợp hệ số góc 0<|m|<1)
- Viết hàm tương ứng để vẽ đoạn thẳng AB với màu bất kỳ
- Viết hàm main() để kiểm nghiệm
#define Round(a) long(a+0 005) // lam tron so
void ĐĂint x1, int y1, int x2, int y2, int C)
{ int x,y,dx,dy;
Randomize();
y=y1; dx = x2 - x1; dy = y2 - y1;
float m = float (y2 - y1)/(x2 - x1);
//Ve doan thang co HSG 0<m<1
Trang 31 2Cho điểm A có tọa độ (50,100) và điểm B có tọa độ (130,200).
- Trình bày thuật toán ĐA tương ứng để vẽ đoạn thẳng AB (trình bày trường hợp hệ số góc |m|≥1)
- Viết hàm tương ứng để vẽ đoạn thẳng AB với màu bất kỳ
Viết hàm main() để kiểm nghiệm
#define Round(a) long(a+0 005)
void ĐĂint x1, int y1, int x2, int y2, int C)
{ int x,y,dx,dy;
Randomize();
y=y1; dx = x2 - x1; dy = y2 - y1;
float m = float (y2 - y1)/(x2 - x1);
//Ve doan thang co HSG |m|>=1
Trang 4- Hàm vẽ đoạn thẳng AB với màu bất kỳ theo thuật toán ĐA ứng với trường hợp hệ số góc m của đườngthẳng đi qua A, B thỏa mãn |m|≥1.
- Hàm nhập tọa độ 2 điểm A, B trên màn hình sao cho đường thẳng đi qua A, B có hệ số góc m với |m|≥1
- Hàm main() nhập màu nét vẽ và vẽ đoạn thẳng AB với màu vừa nhập
#include <coniọh> #include <graphics.h> #include <math.h>
#include <iostream.h> #include <stdiọh> #include <math.h>
#define round(a) long(a+0 005)
void ĐĂint x1, int y1, int x2, int y2, int C)
{ int x,y,dx,dy;
y=y1; dx = x2 - x1; dy = y2 - y1;
float m = float (y2 - y1)/(x2 - x1);
//Ve doan thang co HSG |m|>=1
Trang 5- Hàm vẽ đoạn thẳng AB với màu bất kỳ theo thuật toán ĐA ứng với trường hợp hệ số góc m của đườngthẳng đi qua A, B thỏa mãn 0<|m|<1.
- Hàm nhập tọa độ 2 điểm A, B trên màn hình sao cho đường thẳng đi qua A, B có hệ số góc m với 0<|m|
<1
- Hàm main() nhập màu nét vẽ và vẽ đoạn thẳng AB
#include <coniọh> #include <graphics.h> #include <math.h>
#include <iostream.h> #include <stdiọh> #include <math.h>
#define round(a) long(a+0 005)
void ĐĂint x1, int y1, int x2, int y2, int C)
{ int x,y,dx,dy;
y=y1; dx = x2 - x1; dy = y2 - y1;
float m = float (y2 - y1)/(x2 - x1);
//Ve doan thang co HSG 0<m<1
Trang 6BR_ line // trường hợp tổng quát k theo m
#include <conio.h> #include <graphics.h> #include <math.h>
#include <iostream.h> #include <stdio.h> #include <math.h>
#define Round(a) long(a+0 005) // lam tron so
void Bre_line(int x1, int y1, int x2, int y2, int color)
{ int gd,gm=0; gd=DETECT; initgraph(&gd,&gm,"C://TC//BGI");
setbkcolor(GREEN); int xA,xB,yB,yA;
cout<<"nhap diem A\n ";
Trang 71.5 Cho điểm A có tọa độ (100,50) và điểm B có tọa độ (200,130).
- Trình bày thuật toán Bresenham tương ứng để vẽ đoạn thẳng AB (trình bày trường hợp hệ số góc 0<|m|
<1)
- Hãy tính tọa độ của 15 điểm đầu tiên khi vẽ đoạn thẳng AB
- Viết hàm tương ứng để vẽ đoạn thẳng AB với màu bất kỳ
- Viết hàm main() để kiểm nghiệm
#include <conio.h> #include <graphics.h> #include <math.h>
#include <iostream.h> #include <stdio.h> #include <math.h>
#define Round(a) long(a+0 005)
void Bre_line(int x1, int y1, int x2, int y2, int color)
Trang 81.6 Cho điểm A có tọa độ (50,100) và điểm B có tọa độ (130,200).
- Trình bày thuật toán Bresenham tương ứng để vẽ đoạn thẳng AB (trình bày trường hợp hệ số góc |m|≥1)
- Hãy tính tọa độ của 15 điểm đầu tiên khi vẽ đoạn thẳng AB
- Viết hàm tương ứng để vẽ đoạn thẳng AB với màu bất kỳ
- Viết hàm main() để kiểm nghiệm
#include <conio.h> #include <graphics.h> #include <math.h>
#include <iostream.h> #include <stdio.h> #include <math.h>
#define Round(a) long(a+0 005)
void Bre_line(int x1, int y1, int x2, int y2, int color)
Trang 91 7 Viết chương trình gồm:
- Hàm vẽ đoạn thẳng AB với màu bất kỳ theo thuật toán Bresenham ứng với trường hợp hệ số góc m củađường thẳng đi qua A, B thỏa mãn |m|≥1
- Hàm nhập tọa độ 2 điểm A, B trên màn hình sao cho đường thẳng đi qua A, B có hệ số góc m với |m|≥1
- Hàm main() nhập màu nét vẽ và vẽ đoạn thẳng AB với màu vừa nhập
#include <conio.h> #include <graphics.h> #include <math.h>
#include <iostream.h> #include <stdio.h> #include <math.h>
#define Round(a) long(a+0 005)
void Bre_line(int x1, int y1, int x2, int y2, int color)
Trang 10- Hàm vẽ đoạn thẳng AB với màu bất kỳ theo thuật toán Bresenham ứng với trường hợp hệ số góc m củađường thẳng đi qua A, B thỏa mãn 0<|m|<1.
- Hàm nhập tọa độ 2 điểm A, B trên màn hình sao cho đường thẳng đi qua A, B có hệ số góc m với 0<|m|
<1
- Hàm main() nhập màu nét vẽ và vẽ đoạn thẳng AB
#include <conio.h>#include <graphics.h>#include <math.h>
#include <iostream.h>#include <stdio.h>#include <math.h>
#define Round(a) long(a+0 005)
void Bre_line(int x1, int y1, int x2, int y2, int color)
{ int gd,gm=0; gd=DETECT; initgraph(&gd,&gm,"C://TC//BGI");
setbkcolor(GREEN); int xA,xB,yB,yA, mt;
cout<<"nhap diem A\n "; cout<<"xA= ";cin>>xA; //100
Trang 11MID_line // trường hợp tổng quát k theo m
1 9 Cho điểm A có tọa độ (100,50) và điểm B có tọa độ (200,130)
- Trình bày thuật toán Midpoint tương ứng để vẽ đoạn thẳng AB (trình bày trường hợp hệ số góc 0<|m|<1)
- Hãy tính tọa độ của 15 điểm đầu tiên khi vẽ đoạn thẳng AB
- Viết hàm tương ứng để vẽ đoạn thẳng AB với màu bất kỳ
Viết hàm main() để kiểm nghiệm
#include <conio.h>#include <graphics.h>#include <math.h>
#include <iostream.h>#include <stdio.h>#include <math.h>
#define Round(a) long(a+0 005)
void Mid(int x1, int y1, int x2, int y2, int color)
{ int x,y,dx,dy,d;
y=y1; dx = x2 - x1; dy = y2 - y1; d=dy-dx/2;
// Khoi tao cac gia tri ban dau
1 10 Cho điểm A có tọa độ (50,100) và điểm B có tọa độ (130,200)
- Trình bày thuật toán Midpoint tương ứng để vẽ đoạn thẳng AB (trình bày trường hợp hệ số góc |m|≥1)
Trang 12- Hãy tính tọa độ của 15 điểm đầu tiên khi vẽ đoạn thẳng AB
- Viết hàm tương ứng để vẽ đoạn thẳng AB với màu bất kỳ
- Viết hàm main() để kiểm nghiệm
#include <conio.h>#include <graphics.h>#include <math.h>
#include <iostream.h>#include <stdio.h>#include <math.h>
void Mid(int x1, int y1, int x2, int y2, int color)
{ int x,y,dx,dy,d;
y=y1; dx = x2 - x1; dy = y2 - y1; d=dy-dx/2;
// ve duong thang voi m>1
Trang 131 11 Viết chương trình gồm:
- Hàm vẽ đoạn thẳng AB với màu bất kỳ theo thuật toán Midpoint ứng với trường hợp hệ số góc m củađường thẳng đi qua A, B thỏa mãn |m|≥1
- Hàm nhập tọa độ 2 điểm A, B trên màn hình sao cho đường thẳng đi qua A, B có hệ số góc m với |m|≥1
- Hàm main() nhập màu nét vẽ và vẽ đoạn thẳng AB với màu vừa nhập
#include <conio.h>#include <graphics.h>#include <math.h>
#include <iostream.h>#include <stdio.h>#include <math.h>
void Mid(int x1, int y1, int x2, int y2, int color)
{ int gd,gm=0; gd=DETECT; initgraph(&gd,&gm,"C://TC//BGI");
setbkcolor(GREEN); int xA,xB,yB,yA, mt;
cout<<"nhap diem A\n "; cout<<"xA= ";cin>>xA; //50
Trang 14- Hàm nhập tọa độ 2 điểm A, B trên màn hình sao cho đường thẳng đi qua A, B có hệ số góc m với 0<|m|
<1
- Hàm main() nhập màu nét vẽ và vẽ đoạn thẳng AB
#include <conio.h>#include <graphics.h>#include <math.h>
#include <iostream.h>#include <stdio.h>#include <math.h>
#define Round(a) long(a+0 005)
void Mid(int x1, int y1, int x2, int y2, int color)
{ int gd,gm=0; gd=DETECT; initgraph(&gd,&gm,"C://TC//BGI");
setbkcolor(GREEN); int xA,xB,yB,yA, mt;
cout<<"nhap diem A\n "; cout<<"xA= ";cin>>xA; //100
- Trình bày thuật toán Breseham để vẽ cung số 1 của đường tròn
- Tính tọa độ của 25 điểm đầu tiên khi vẽ cung tròn này
Trang 15- Viết hàm tương ứng để vẽ cung tròn với màu bất kỳ và chương trình kiểm nghiệm (với màu nét vẽ, tọa độtâm và bán kính đường tròn nhập từ bàn phím)
#include <graphics.h>#include <conio.h>
void Bresenham_Circle(int xc, int yc, int Radius, int color)
17(66,30.79), 18(67,31.67),19(68,32.65), 20(69,33.75), 21(70,35), 22(71,36.44), 23(72,38.16), 24(73,40.2), 25(74,43)
2 1
- Trình bày thuật toán Midpoint để vẽ cung số 1 của đường tròn
- Tính tọa độ của 25 điểm đầu tiên khi vẽ cung tròn này
Trang 16- Viết hàm tương ứng để vẽ cung tròn với màu bất kỳ và chương trình kiểm nghiệm (với màu nét vẽ, tọa độtâm và bán kính đường tròn nhập từ bàn phím)
#include <graphics.h>#include <conio.h>
void CircleMidPoint (int xc, int yc,int R, int color)
{ int gr_drive = DETECT, gr_mode;
initgraph(&gr_drive, &gr_mode, "C://TC//BGI");
17(66,30.79), 18(67,31.67),19(68,32.65), 20(69,33.75), 21(70,35), 22(71,36.44), 23(72,38.16), 24(73,40.2), 25(74,43)
3.1Trình bày thuật toán Breseham để vẽ cung số 1 của Elip
- Tính tọa độ của 25 điểm đầu tiên khi vẽ cung Elip này
Trang 17- Viết hàm tương ứng để vẽ cung Elip với màu bất kỳ và chương trình kiểm nghiệm (với màu nét vẽ, tọa độtâm và các bán trục Elip nhập từ bàn phím)
#include<graphics.h> #include <conio.h>
void BR_ellipse(int xcenter,int ycenter,int xradius,int yradius, int color)
{ int x,y; float c,p;
x=0; y=yradius; c=(float)yradius/xradius; c=c*c; p=2*c-2*yradius+1;
{ int gr_drive = DETECT, gr_mode; initgraph(&gr_drive, &gr_mode, "C://TC//BGI");
BR_ellipse (getmaxx() / 2, getmaxy() / 2, 150, 80, 4);
getch(); closegraph(); }
3.2Trình bày thuật toán Midpoint để vẽ cung số 1 của đường Elip
- Tính tọa độ của 25 điểm đầu tiên khi vẽ cung Elip này
Trang 18- Viết hàm tương ứng để vẽ cung Elip với màu bất kỳ và chương trình kiểm nghiệm (với màu nét vẽ, tọa độtâm và các bán trục Elip nhập từ bàn phím)
#include<graphics.h>#include <conio.h>
#define ROUND(a) ((long)(a+0.5))
void plot(int xc, int yc, int x, int y, int color)
{ putpixel(xc+x, yc+y, color);
putpixel(xc-x, yc+y, color);
putpixel(xc+x, yc-y, color);
putpixel(xc-x, yc-y, color);
}
void Mid_ellipse(int xc, int yc, int a, int b, int color){
long x, y, fx, fy, a2, b2, p;
Trang 191 Tô màu đường biên:
Bắt đầu tù 1 điểm (x,y) trong vùng cần đk tô màu
- Xác định màu điểm : getpixel(x,y,c)
- Tô màu putpixel(x,y,c)
Kiểm tra thuộc tính màu các điểm lân cận
- Điểm lân cận đã tô màu : exit
- Trùng với màu đường biên : exit
- Nếu không thì tô màu
Các phương pháp xác định điểm lân cận
Trang 202 Giải thuật dòng quét(scanline)
- Giải thuật dừa trên ý tưởng sử dụng 1 đường quét trên trục ycuar màn hình đi từ y_max đến y_min của vùng cần đk tô màu
- Với mỗi giá trị y=yi đường thẳng quét cắt các đường biên của vùng cần tô tọa ra đoạn thẳng y=yi với x thuộc[x_min,x_max] Trên đoạn thẳng đó chúng ta tô màu các điểm tương ứng đi từ x_min đến x_max có các điểm tô (xi,yi) thuộc y=yi
Trang 21Dòng quét đa giác :
- Vùn tô đk xác định bởi 1 đa giác n đỉnh : Pi(xi,yi), i=0…n-1
- Ý tưởng thuật toán:
• Tìm giá trị y_top và y_bottom của đa giác
• Y_top = max(yi với (xi,yi)thuộc P)
• Y_bottom = min(yi với (xi,yi)thuộc P)
• Với mỗi dòng quét ngang y=k, k từ y_bottom -> y_top
- tìm tất cả các hoàng độ giao điểm với các cạnh đa giác
- sắp xếp theo thứ tự tăng dần x0,x1,x2…
- tô màu các đoạn thẳng trên đường y=k nằm trong các đoạn (x0,x1),(x2,x3),…(x2i,x2i+1)
Trang 223 Tô loang
- B1:khởi tọa 1 điểm nằm trong vùng tô
- B2:thực hiện tô loang dần theo chiều ngang(trái qua phải và phải qua trái) cho đến khi đụng biên thì dừnglại
- B3:ứng với mỗi điểm trên dòng quét ngang, thực hiện loang để tìm những điểm ảnh có hoành độ nhỏ nhấtsát với biên chưa đk tô nằm trên và dưới , sau đó lưu vào stack
- B4:lặp lại B2 nếu còn 1 điểm trong stack chưa đk tô
Trang 235.không gian 2D
5.2 Trên mặt phẳng tọa độ thực Oxy, cho hàm số y=2x+3 Giả sử cần vẽ đồ thị của hàm số trên đoạn 5,5] lên màn hình với khung nhìn (50,10)x(120,70)
[ Hãy tính tọa độ của gốc tọa độ O trên màn hình trong trường hợp này
- Vẽ đồ thị hàm số trên cùng với hệ trục tọa độ Oxy
-#include "iostream.h" -#include "stdio.h" -#include "conio.h"
#include "graphics.h" #include "dos.h" #include "math.h"
int xv1,yv1,xv2,yv2,xw1,xw2,yw1,yw2; // cac toa cua cua cua so va khung nhin
Trang 24cuaso(-pi,-1.5,pi*3,1.5); // tao cua so hien thi anh thuc
khungnhin(50,10,120,70); // khung nhin tren man hinh
Trang 26void clipline(double x1, double y1, double x2, double y2,
double xmin, double ymin, double xmax, double ymax)
if (cliptest(-dx, x1 - xmin, &u1, &u2))
if (cliptest(dx, xmax-x1, &u1, &u2))
{
dy = y2 - y1;
if (cliptest(-dy, y1 - ymin, &u1, &u2))
if (cliptest(dy, ymax - y1, &u1, &u2))
{
if (u2 < 1.0)
{x2 = x1 + u2 * dx;
y2 = y1 + u2 * dy;
}
if (u1 > 0.0)
{x1 += u1 * dx;
y1 += u1 * dy;
}setcolor(RED);
Trang 27line(oldx1, oldy1, x1, y1);
line(x2, y2, oldx2, oldy2);
double x1, y1, x2, y2;
initgraph(&gr_drive, &gr_mode, "C:\\TC\\BGI");
rectangle(100,50, getmaxx()-100, getmaxy()-50); randomize();
outtextxy(100, getmaxy()-10, "Nhan phim bat ky de sinh duong khac; ESC de thoat");
do {
x1 = random(getmaxx() / 2);
y1 = random(getmaxy());
x2 = getmaxx()/2 + random(getmaxx() / 2); y2 = random(getmaxy());
clipline(x1, y1, x2, y2, 100, 50, getmaxx()-100, getmaxy()-50);
c = getch();
} while (c != 27);
closegraph();
}
Trang 29p += 2*Dy;
else{
p += 2*(Dy - Dx);
y1 ++;
}x1 ++;
putpixel(x1,y1,c);
delay(10);
}}
Trang 30p += 2*Dx;
else{
p += 2*(Dx - Dy);
x1 ++;
}y1 ++;
putpixel(x1,y1,c);
delay(10);
}}
p += 2*(Dy + Dx);
y1 ;}x1 ++;
Trang 31if(p < 0){
p=p - 2*Dy - 2*Dx;
y1 ++;
}else
Trang 34p.x =int( getmaxx()/2+y - x*cos(RADS*45));
p.y =int( getmaxy()/2 + x*cos(RADS*45));
Trang 36printf("\nQuay quanh truc : oy goc 45");
printf("\nQuay quanh truc : ox goc 35.5");
for( i = 0 ; i< 4 ; i++)
break;
}case '2' :
{
Trang 37break;
}case '3' :
{chieumat(c,3,9) ;break;
}}
}
while( m !='4');
closegraph();
}
Trang 39initgraph(&mh,&mode,"C://TC//BGI");
// ve duong sin
cuaso(-pi,-1.5,pi*3,1.5); // tao cua so hien thi anh thuc
khungnhin(240,140,390,240); // khung nhin tren man hinh
Trang 42printf("khong the khoi dong do hoa \n");
printf("ma loi : %d \nnguyen nhan loi %s ",maloi, grapherrormsg(maloi) );
delay(200); // t?m d?ng 200 mili giây (hàm này trong thu vi?n dos.h)
}while (!kbhit()); // l?p vô h?n t?i khi ?n m?t phím b?t k? thì d?ng
getch();
closegraph();
}