Thứ Ba, 23 tháng 5, 2017

[Đồ họa máy tính] Đề cương ôn tập

Bài 1: Chương trình vẽ một hình tam giác có tọa độ A(3,5,1) , B(3,6,5), C(6,2,1) với việc dịch chuyển (-5,-3, -2) và xoay quanh trục ox 60:

Bài làm

void myDisplay(void){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1.0, 1.0, 1.0);
    glRotatef(60.0, 1.0,0.0,0.0);
    glTranslatef(-5.0,-3.0,-2.0 );
    glBegin(GL_TRIANGLES);
    glVertex3f(3.0, 5.0, 1.0);
    glVertex3f(3.0, 6.0, 5.0);
    glVertex3f(6.0, 2.0, 1.0);
    glEnd();
    glFlush();

}


Bài 2:  Viết code dùng thuật toán vẽ đường thẳng Bresenham. Áp dụng thuât toán Bresenham tính các điểm pixels của đoạn từ A(3,4) và B(7,10).

Bài làm

Chương trình:
void drawLine(int x0, int y0, int x1, int y1){
    int dx, dy, ax, ay, sgnx, sgny, d;

    dx = x1 - x0;        dy = y1 - y0;
    ax = abs(dx)*2;    ay = abs(dy)*2;
    sgnx = sign(dx);   sgny = sign(dy);

    int x = x0,  y = y0;

    if(ax>ay){
            d = ay - ax/2;
        while(true){
            draw(x,y);
            if(x==x1)     return;

            if(d >= 0){
                y = y + sgny;         d = d - ax;
            }
            x = x + sgnx;             d = d + ay;
        }

    }else{
        d = ax - ay/2;
        while(true){
            draw(x,y);
            if( y ==y1)    return;
       if(d >= 0){
            x = x + sgnx;     d = d - ay;
        }
        y = y + sgny;    d = d + ax;
        }
    }
}

int sign(int x){
    if(x>0)
        return 1;
    return -1;
}


Tính toán:

dx = 4
dy = 6
sgnx = sign(dx) = 1
sgny = sign(dy) = 1
ax = |dx| * 2 =  8
ay = |dy| * 2 = 12
Do ax< ay  nên d = ax - ay/2 = 2
d > 0  nên  x = x+ sgnx =  3+1 =4   ,    d = d - ay = 2 - 12 = -10
                  y = y + sgny = 4+1 = 5      ,    d = d + ax = -10 + 8 = -2
Ta được điểm (4, 5)

y = y + sgny = 5+1 = 6   ,  d = d+ ax = 6
Ta được điểm ( 4,6)

d>0 nên  x= x + sgnx = 4 + 1 = 5  ,  d = d - ay = 6 -12 = -6
               y = y + sgny =  6+ 1 = 7 ,  d  = d + ax = 2
Ta được điểm  (5, 7)


 d> 0  nên x = x + sgnx = 5 + 1 =6 , d = d -ay = 2 -12 =-10
                 y = y + sgny = 7 + 1 = 8 , d = d + ax = -10 + 8 = -2
Ta được điểm (6, 8)
y = y + sgny = 8 + 1 = 9 , d = d + ax = 6

d> 0 nên x = x + sgnx =  6 + 1= 7 , d = d -ay = 6 -12 = -6
                  y = y + sgny = 9 + 1 =10, d= d+ ax = -6 +8 = -2

Ta được điểm (7,10)

VD2:Tính nhanh với điểm đầu (1,1) ( 3,5)
dx = 2, dy = 4.
ax = 4, ay = 8
ay> ax. --> d = ax - ay /2 = 0
 d = -8, x = 2,
d = -4, y =2
(2,2)
d = 0 , y = 3
(2,3)
d = -8, x =3
d = -4, y =4
(3,4)
 d = 0, y =5
(3,5)

Điểm đặc biệt của thuật toán Bresenham:
- Là cải tiến của thuật toán DDA tuy nhiên làm cho độ phức tạp bài toán giảm hơn nhiều. Thuật toán DDA phép tính số học quá phức tạp tốn nhiều bô nhớ máy tính, còn Bresenham chỉ cần dùng các phép cộng trừ là có thể tính toán được điểm nằm trên đoạn thẳng.
- Dùng phép lấy giá trị sấp sỉ gần bằng để tính tọa độ của các điểm trên đoạn thẳng.

Bài 3: 
Viết ma trận chuyển đổi cho các phép toán sau: dịch chuyển và co giãn. Ở tọa độ mặt phẳng 2D, tính kết quả của những phép chuyển đổi sau:

xoay xung quanh gốc tọa độ 30 độ, dịch chuyển bởi (-4,-5),  xoay xung quanh gốc tọa độ góc -20 độ. Với các điểm sau A(3,4) B(6,2) C(8,7)

Bài làm


A' =       R(-20)*( T(-4,-5)*(R(30)*A))
Do đó ma trận chuyển đổi là: R(-20)*T(-4,-5)*R(30).
Số hơi lẻ nên mình không viết ở đây.
Bài 4:
Sự khác biệt giữa Phong Shading và Gorround Shadding?

Bài làm
- Gorround Shadding dùng phương pháp nội suy cường độ tại các đỉnh. hay còn gọi là nội suy màu sắc, từ các đỉnh có thể tính được cường độ của tất cả các điểm còn lại trong đa giác. Còn Phong shadding dùng phương pháp nội suy vecto pháp tuyến bề mặt.
- Phong có thể điều chỉnh kích thước  của điểm phản chiếu, còn Goraud shadding thì không hiển thị hết được một số điểm phản chiếu, các điểm phản chiếu được trải đều trên toàn bộ đa giác.
- Phong shadding phụ thuộc vào điểm nhìn, còn Goraud shadding thì không phụ thuộc vào điểm nhìn.

Bài 5: 
Mô hình ánh sáng Phong?






Bài 6:

Cho cường độ tại điểm A là 1.0, B là 0.8 và C là 0.5 . Tính cường độ tại điểm D và điểm E dựa trên thuât toán Goraud shading:
Bài làm

Cường độ tại E = (3*C+A )/4 = (3*0.5 + 1.0)/4 = 0.625
Cường độ tại I trung điểm A và C là:
(A + C)/2 = 0.75
Cường độ tại D là :
(B+I)/2 = (0.8+ 0.75)/2 = 0.775

Bài 7:
Mô tả thuật toán cắt xén Cohen - Sutherland

Bài làm

Đây là bảng mã hóa các khu vực trong thuât toán. Các xác định như sau:

  • Mỗi ô sẽ có 4 bit, mỗi bit có thể là 0 hoặc 1 đại diện cho vị trí của các khu vực theo thứ tự Phải-Trên- Trái- Dưới.
  • Nếu nằm ở ô bottom-right sẽ có giá trị : 1001.
Thuật toán như sau:
Bước 1: Mã hóa P1 và P2. Đặt c1 = c(P1) và c2 = c(P2)
Bước 2:
Kiểm tra nếu một đoạn có thể loại bỏ một cách dễ dàng sử dụng toán tử AND và OR bit để kiểm tra xem
a) c1 OR c2 = 0 . Trường hợp P1 , P2 cùng nằm trong cửa sổ cắt.
b) c1 AND c2 # 0. Trường hợp P1, P2 nằm bên ngoài cửa sổ cắt.

Bước 3: 
Nếu một đoạn không bị loại bỏ một cách đơn giản, chúng ta sẽ chia nhỏ đoạn đó ra. Sau đó chúng ta lại quay lại bước 1 với những đoạn với quy trình như sau:
a) Tìm điểm đầu mút P sẽ xác định đường sẽ sử dụng để cắt:
  • Nếu c1 =0000, thì P1 không cần phải clip và đặt P là P2 và Q là P1.
  • Nếu c1 # 0000, thì đặt P là P1 và Q là P2.
b)Đường thẳng dùng để clip được xác định bằng bit bên trái nhất mà khác không trong c(p). Ví dụ nếu bit bên trái nhất khác 0 là bit đầu tiên : 1000 thì dùng đường ngang phía dưới.
c) Lặp lại Bước 1-3 cho đoạn mới.

Bài 8:
Mô tả view volume của phép chiếu phối cảnh

Bài làm
Là khối nhìn vô hạn được tạo ra từ các tia xuất phát từ điểm nhìn đến các điểm trong cửa sổ. Để giới hạn các đối tượng ra, người ta dùng mặt phẳng cắt gần ( near plane ) , và mặt phẳng cắt xa (far plane)
Cảnh vật được chiếu lên một mặt phẳng nhìn từ điểm nhìn nơi đặt máy quay đến mặt phẳng nhìn ( view plane).



Bài 9: 
Code Vẽ một điểm sáng với giá trị ambient, diffuse, specular như sau:

GLfloat amb0[]= {0.2, 0.4, 0.6, 1.0};
GLfloat  diff0[] = {0.8, 0.9, 0.5, 1.0};
GLfloat spec0[] ={ 1.0, 0.8, 1.0, 1.0};
glLightfv(GL_LIGHT0, GL_AMBIENT, amb0);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diff0);
glLightfv(GL_LIGHT0, GL_SPECULAR, spec0);

Ngoài ra để setup Material thì dùng những lệnh sau:
 glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
 glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
 glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
 glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

Bài 10:
Các thành phần của mô hình sáng?

Thành phần môi trường (ambient), thành phần khuếch tán (diffuse), thành phần phản chiếu (specular).

Thành phần môi trường là một thiết lập ánh sáng có cường độ không đổi trong một cảnh vât, là tổng của tất cả các ánh sáng gián tiếp trong cảnh vật đó. Nói một cách  khác ánh sáng môi trường là một kiểu mô hình tự phát sáng để bắt chước sự phản quang vật thể. Ánh sáng môi trường có cường độ độc lập, không phụ thuộc vào các vật thể trong một cảnh vật.

Thành phần khuếch tán là thành phần sáng khi có ánh sáng đến thì nó được phản xạ ra mọi hướng với cường độ như nhau.

Thành phần phản chiếu là thành phần khi ánh sáng đến được phản xạ lại theo quy luật góc tới bằng góc phản xạ, cường độ tại góc phản xạ là lớn nhất và giảm dần với các tia xung quanh.

Bài 11:
Thuật toán Cyris-Bus:


Bài 12: Các câu lệnh cần nhớ
glLookAt(eye.x, eye.y, eye.z, look.x, look.y, look.z, up.x, up.y, up.z)

Thay đổi eye.x, eye.y, eye.z giữ nguyên các tham số còn lại thì sẽ thay đổi vị trí camera, nên sẽ thay đổi góc nhìn.

Thay đổi look.x, look.y, look.z giữ nguyên các tham số còn lại thì camera bị xoay quanh trục x,y do đó điểm nhìn bị thay đổi.

Thay đổi up thì camera thay đổi theo trục z do đó ảnh hiển thị sẽ bị quay theo.

Không có nhận xét nào:

Đăng nhận xét