1. Trang chủ
  2. » Công Nghệ Thông Tin

C++ và lập trình hướng đối tượng - Chương 8

20 695 5
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề C++ và lập trình hướng đối tượng - Chương 8
Trường học Trường Đại Học Công Nghệ Thông Tin
Chuyên ngành Lập Trình
Thể loại Tài liệu
Năm xuất bản 2023
Thành phố Hồ Chí Minh
Định dạng
Số trang 20
Dung lượng 193,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

C++ và lập trình hướng đối tượng - Chương

Trang 1

Chơng 8

đồ họa

Trong chơng này sẽ giới thiệu các hàm để vẽ các đờng và hình cơ

bản nh đờng tròn, cung elip, hình quạt, đờng gẫy khúc, hình đa giác,

đờng thẳng, đờng chữ nhật, hình chữ nhật, hình hộp chữ nhật,

Ngoài ra còn đề cập tới các vấn đề rất lý thú khác nh: xử lý văn bản trên màn hình đồ họa, cửa sổ và kỹ thuật tạo ảnh di động Các hàm đồ họa đợc khai báo trong tệp graphics.h Đ 1 Khái niệm đồ họa Để hiểu kỹ thuật lập trình đồ họa, đầu tiên phải hiểu các yếu tố cơ bản của đồ họa Từ trớc đến nay chúng ta chủ yếu làm việc với kiểu văn bản Nghĩa là màn hình đợc thiết lập để hiển thị 25 dòng, mỗi dòng có thể chứa 80 ký tự Trong kiểu văn bản, các ký tự hiển thị trên màn hình đã đợc phần cứng của máy PC ấn định trớc và ta không thể nào thay đổi đợc kích thớc, kiểu chữ ở màn hình đồ họa, ta có thể xử lý đến từng chấm điểm (pixel) trên màn hình và do vậy muốn vẽ bất kỳ thứ gì cũng đợc Sự bài trí và số pixel trên màn hình đợc gọi là độ phân giải (resolution) Do mỗi kiểu màn hình đồ họa có một cách xử lý đồ họa riêng nên TURBO C cung cấp một tệp tin điều khiển riêng cho từng kiểu đồ họa Bảng 8-1 cho thấy các kiểu đồ họa và các tệp tin điều khiển chúng Ngoài các tệp có đuôi BGI chứa chơng trình điều khiển đồ họa, TURBO C còn cung cấp các tệp tin đuôi CHR chứa các Font chữ để vẽ các kiểu chữ khác nhau trên màn hình đồ họa Đó là các tệp: GOTH.CHR LITT.CHR SANS.CHR TRIP.CHR Bảng 8-1 Các tệp tin điều khiển đồ họa của TURBO C++ Tên tệp tin Kiểu màn hình đồ họa ATT.BGI ATT & T6300 (400 dòng) CGA.BGI IBMCGA, MCGA và các máy tơng thích EGAVGA.BGI IBM EGA, VGA và các máy tơng thích HERC.BGI Hercules monochrome và các máy tơng thích IBM8514.BGI IBM 8514 và các máy tơng thích PC3270.BGI IBM 3270 PC Màn hình đồ họa gồm nhiều điểm ảnh đợc sắp xếp trên các đờng thẳng ngang và dọc Điều này đúng cho tất cả các kiểu màn hình đồ họa của máy tính Khác biệt chủ yếu giữa chúng là kích thớc và số các điểm ảnh Trong kiểu CGA (độ phân giải thấp), điểm ảnh có kích thớc lớn, chiều ngang có 320 điểm ảnh, còn theo chiều dọc có 200 điểm ảnh Màn hình VGA có độ phân giải cao hơn: điểm ảnh nhỏ hơn, trên mỗi hàng có 640 điểm ảnh và trên mỗi cột có 480 điểm ảnh Điểm ảnh càng nhỏ thì số điểm ảnh trên màn hình càng nhiều và chất lợng đồ họa càng cao Mỗi kiểu đồ họa dùng một hệ tọa độ riêng Hệ tọa độ cho màn hình VGA là 640 x 480 nh sau : (0,0) (639,0)

(0,479) (639,479) Hình 8.1 Hệ tọa độ VGA Nhờ hệ tọa độ này, ta có thể tác động hay tham chiếu đến bất kỳ điểm ảnh nào trên màn hình đồ họa Nếu dùng màn hình CGA thì góc dới phải có tọa độ (319, 199) Độc lập với kiểu đồ họa đang sử dụng, các hàm getmaxx và getmaxy bao giờ cũng cho tọa độ x và y lớn nhất trong kiểu đồ họa đang dùng Một chơng trình đồ họa thờng gồm các phần sau: - Khởi động hệ thống đồ họa - Xác định mầu nền (mầu màn hình), mầu đờng vẽ, mầu tô và kiểu (mẫu) tô - Vẽ, tô mầu các hình mà ta mong muốn - Các thao tác đồ họa khác nh cho hiện các dòng chữ

Trang 2

- Đóng hệ thống đồ họa để trở về mode văn bản.

Đ 2 Khởi động hệ đồ họa

Mục đích của việc khởi động hệ thống đồ họa là xác định thiết bị

đồ họa (màn hình) và mốt đồ họa sẽ sử dụng trong chơng trình Để

làm điều này ta dùng hàm:

void initgraph(int *graphdriver, int *graphmode,char *driverpath);

trong đó: driverpath là đờng dẫn của th mục chứa các tệp tin điều

khiển đồ họa, graphdriver, graphmode cho biết màn hình và mốt đồ

họa sẽ sử dụng trong chơng trình Bảng 8-2 cho thấy các giá trị khả

dĩ của graphdriver và graphmode

Ví dụ 1 Giả sử máy tính của ta có màn hình EGA, các tệp tin đồ

họa chứa trong th mục C: \TC, khi đó ta có thể khởi động hệ thống đồ

họa nh sau:

#include "graphics.h"

main()

{

int mh=EGA, mode= EGALO;

initgraph(&mh, &mode, "C:\TC");

}

Bảng 8-2 Các giá trị khả dĩ của graphdriver, graphmode

Detect (0)

IBM8514HI (1) 1024 x 768, 256 mầu

Chú ý 1 Bảng 8-2 cho các tên hằng và giá trị của chúng mà các

biến graphdriver, graphmode có thể nhận Chẳng hạn hằng DETECT

có giá trị 0, hằng VGA có giá trị 9, hằng VGALO có giá trị 0 Khi lập trình ta có thể dùng tên hằng hoặc giá trị tơng ứng của chúng Chẳng hạn các phép gán trong ví dụ 1 có thể viết theo một cách khác tơng đơng nh sau:

mh=3;

mode=0;

Chú ý 2 Bảng 8.2 cho thấy độ phân giải phụ thuộc cả vào màn

hình và mode Ví dụ trong màn hình EGA nếu dùng mode EGALO thì độ phân giải là 640 x 200, hàm getmaxx cho giá trị 639, hàm getmaxy cho giá trị 199 Nếu cũng màn hình EGA mà dùng mode EGAHI thì độ phân giải là 640x 350, hàm getmaxx cho giá trị 639, hàm getmaxy cho giá trị 349

Chú ý 3 Nếu không biết chính xác kiểu màn hình đang sử dụng

thì ta gán cho biến graphdriver hằng DETECT hay giá trị 0 Khi đó kết quả của hàm initgraph sẽ là:

- Kiểu của màn hình đang sử dụng đợc phát hiện, giá trị số của nó

đợc gán cho biến graphdriver

- Mode đồ họa ở độ phân giải cao nhất ứng với màn hình đang sử dụng cũng đợc phát hiện và giá trị số của nó đợc gán cho biến graphmode

Trang 3

Nh vậy việc dùng hằng số DETECT chẳng những có thể khởi

động đợc hệ thống đồ họa của màn hình hiện có theo mode có độ

phân giải cao nhất, mà còn giúp ta xác định chính xác kiểu màn hình

đang sử dụng

Ví dụ 2 Chơng trình dới đây xác định kiểu màn hình đang sử

dụng:

#include "graphics.h"

#include "stdio.h"

main()

{

int mh=0, mode= 0;

initgraph(&mh, &mode, "");

printf("\n Giá trị số của màn hình là: %d", mh);

closegraph();

}

Nếu chơng trình cho kết quả:

Giá trị số của màn hình là: 3

thì ta có thể khẳng định loại màn hình đang dùng là EGA

Chú ý 4 Nếu chuỗi dùng để xác định driverpath là một chuỗi

rỗng (nh trong ví dụ 2) thì chơng trình dịch sẽ tìm các tệp điều khiển

đồ họa trên th mục chủ

Đ 3 Lỗi đồ họa

Khi khởi động hệ thống đồ họa nếu máy không tìm thấy các

ch-ơng trình điều khiển đồ họa thì sẽ phát sinh lỗi đồ họa và việc khởi

động coi nh không thành Lỗi đồ họa còn phát sinh khi dùng các hàm

đồ hoạ Trong mọi trờng hợp, hàm graphresult cho biết có lỗi hay

không lỗi và đó là lỗi gì Bảng 8-3 cho các mã lỗi mà hàm này phát

hiện đợc Ta có thể dùng hàm grapherrormsg với mã lỗi do hàm

graphresult trả về để biết đợc đó là lỗi gì, ví dụ:

int maloi;

maloi = graphresult();

printf("\nLỗi đồ họa là: %d", grapherrormsg(maloi));

Bảng 8-3 Các mã lỗi của Graphresult

grNoInitGraph -1 Cha khởi động hệ đồ họa grNotDetected -2 Không có phần cứng đồ họa grFileNotFound -3 Không tìm thấy trình điều khiển đồ họa grInvalidDriver -4 Trình điều khiển không hợp lệ

grNoLoadMem -5 Không đủ RAM cho đồ họa grNoScanMem -6 Vợt vùng RAM trong Scan fill grNoFloodMem -7 Vợt vùng RAM trong flood fill grFontNoFound -8 Không tìm thấy tập tin Font grNoFontMem -9 Không đủ RAM để nạp Font grInvalidMode -10 Kiểu đồ họa không hợp lệ cho trình điều khiển

grInvalidFont -13 Tập tin Font không hợp lệ grInvalidFontNum -14 Số hiệu Font không hợp lệ

Đ 4 Mầu và mẫu

1 Để chọn mầu nền ta sử dụng hàm

void setbkcolor(int color);

2 Để chọn mầu đờng vẽ ta dùng hàm

void setcolor(int color);

3 Để chọn mẫu (kiểu) tô và mầu tô ta dùng hàm

void setfillstyle(int pattern, int color);

Trong cả 3 trờng hợp color xác định mã của mầu Các giá trị khả

dĩ của color cho trong bảng 8-4, pattern xác định mã của mẫu tô (xem bảng 8-5)

Mẫu tô và mầu tô sẽ đợc sử dụng trong các hàm pieslice, fillpoly, bar, bar3d và floodfill (xem Đ5 dới đây)

4 Chọn giải mầu

Để thay đổi giải mầu đã đợc định nghĩa trong bảng 8.4 ta dùng hàm

void setpalette(int colornum, int color);

Trang 4

Ví dụ câu lệnh

setpalette(0, Lightcyan);

biến mầu đầu tiên trong bảng mầu thành xanh lơ nhạt Các mầu khác

không bị ảnh hởng

Bảng 8-4 Các giá trị khả dĩ của color

Tên hằng Giá trị số Mầu hiển thị

5 Để nhận giải mầu hiện hành ta dùng hàm

void getpalette (struct palettetype *palette);

ở đây palettetype là kiểu đã định nghĩa trớc nh sau:

#define MAXCOLORS 15

struct palettetype

{

unsigned char size;

unsigned char colors[MAXCOLORS+1];

};

ở đây: size là số lợng mầu trong palette, colors là mảng chứa mầu với

chỉ số mảng chạy từ 0 đến size - 1

Bảng 8-5 Các giá trị khả dĩ của pattern

Tên hằng Giá trị số Mô tả kiểu tô

XHATCH_FILL 8 Tô bằng đờng gạch bóng chữ thập INTERLEAVE_FILL 9 Tô bằng đờng đứt quãng

6 Hàm getcolor trả về mầu đã xác định trớc đó bằng hàm setcolor.

7 Hàm getbkcolor trả về mầu đã xác định trớc đó bằng hàm

setbkcolor

8 Hàm getmaxcolor trả về mã mầu cực đại thuộc giải mầu hiện

đang có hiệu lực Trên 256 K EGA, hàm getmaxcolor luôn cho giá trị 15

Đ 5 Vẽ và tô mầu

Có thể chia các đờng và hình thành bốn nhóm chính:

- Đờng tròn và ellipse

- Đờng gấp khúc và hình đa giác

- Đờng thẳng

- Hình chữ nhật

A Đờng tròn và hình tròn

Nhóm này gồm cung tròn, đờng tròn, cung ellipse và hình quạt

1 Cung tròn Để vẽ một cung tròn ta dùng hàm

void arc(int x, int y, int gd, int gc, int r);

ở đây:

Trang 5

(x, y) là tọa độ của tâm cung tròn,

r là bán kính

gd là góc đầu

gc là góc cuối

Chú ý: Trong tất cả các hàm dới đây, góc tính theo độ và có giá

trị từ 0 đến 360

2 Đờng tròn Để vẽ một đờng tròn ta dùng hàm

void circle(int x, int y, int r);

ở đây:

(x, y) là tọa độ của tâm;

r là bán kính đờng tròn

3 Cung ellipse Để vẽ một cung Ellipse ta dùng hàm

void ellipse(int x,int y,int gd,int gc,int xr,int yr);

ở đây:

(x, y) là tọa độ của tâm cung Ellipse

gd là góc đầu

gc là góc cuối

xr là bán trục ngang

yr là bán trục đứng

4 Hình quạt Để vẽ và tô màu một hình quạt ta dùng hàm

void pieslice(int x,int y,int gd,int gc,int r);

ở đây:

(x,y) là tọa độ tâm hình quạt

gd là góc đầu

gc là góc cuối

r là bán kính

Ví dụ 1 Chơng trình dới đây sẽ vẽ: một cung tròn ở góc phần t

thứ nhất, một cung ellipse ở góc phần t thứ ba, một đờng tròn và một

hình quạt quét từ 90 đến 360 độ

#include <graphics.h>

main()

{

int mh, mode;

// Khởi động đồ họa, màn hình EGA, mode EGALO

mh=EGA;

mode=EGALO;

initgraph(&mh, &mode,"");

// Mầu nền Green, mầu đờng vẽ //White, mầu tô Red, kiểu tô SlashFill setbkcolor (GREEN);

setcolor (WHITE);

setfillstyle (SLASH_FILL, RED);

// Vẽ: một cung tròn ở góc phần t thứ nhất, // một cung Ellipse ở góc phần t thứ ba, // một đờng tròn, một quạt tròn

arc(160, 50, 0, 90, 45);

ellipse(480, 50, 180, 270, 150, 45);

circle(160, 150, 45);

pieslice(480, 150, 90, 360, 45);

// Kết thúc chế độ đồ họa closegraph();

}

B Đờng gấp khúc và đa giác

5 Muốn vẽ một đờng gấp khúc đi qua n điểm: (x1,y1), , (xn,yn)

thì trớc hết ta phải đa các tọa độ vào một mảng a nào đó kiểu int Nói một cách chính xác hơn, cần gán x1 cho a[0], y1 cho a[1], x2 cho a[2], y2 cho a[3], Sau đó ta viết lời gọi hàm:

drawpoly(n, a);

Khi điểm cuối (xn, yn) trùng với điểm đầu (x1, y1) ta nhận đợc một đờng gấp khúc khép kín

6 Giả sử a là mảng đã nói trong điểm 5, khi đó lời gọi hàm

fillpoly(n, a);

sẽ vẽ và tô mầu một đa giác có đỉnh là các điểm (x1, y1), ,(xn, yn)

Ví dụ 2 Chơng trình dới đây sẽ vẽ một đờng gấp khúc và hai hình

tam giác

#include <graphics.h>

Trang 6

// Xây dựng các mảng chứa tọa độ các đỉnh

int poly1[]={5,200,190,5,100,300};

int poly2[]={205,200,390,5,300,300};

int poly3[]={405,200,590,5,500,300,405,200};

main()

{

int mh=0, mode=0;

initgraph(&mh, &mode, "");

// Mầu nền CYAN, mầu đờng vẽ

// YELLOW, mầu tô MAGENTA, mẫu tô SolidFill

setbkcolor (CYAN); Setcolor (YELLOW);

setfillstyle (SOLID_FILL, MAGENTA);

drawpoly (3, poly1); // Đờng gấp khúc

fillpoly (3, poly2); // Hình đa giác

fillpoly(4, poly3); // Hình đa giác

closegraph();

}

C Đờng thẳng

7 Hàm

void line(int x1,int y1,int x2,int y2);

vẽ đờng thẳng nối hai điểm (x1, y1) và (x2, y2) nhng không làm thay

đổi vị trí con chạy

8 Hàm

void lineto(int x,int y);

vẽ đờng thẳng từ điểm hiện tại tới điểm (x, y) và chuyển con chạy

đến điểm (x, y)

9 Hàm

void linerel(int dx,int dy);

vẽ một đờng thẳng từ vị trí hiện tại (x, y) của con chạy đến điểm (x

+ dx,y + dy) Con chạy đợc di chuyển đến vị trí mới

10 Hàm

void moveto(int x,int y);

sẽ di chuyển con chạy tới vị trí (x, y)

Ví dụ 3 Chơng trình dới đây tạo lên một đờng gấp khúc bằng các

đoạn thẳng Đờng gấp khúc đi qua các đỉnh: (20, 20), (620, 20), (620, 180), (20, 180) và (320, 100)

#include <graphics.h>

main() { int mh=0, mode=0;

initgraph(&mh, &mode, "");

setbkcolor(GREEN);

setcolor(YELLOW);

moveto(320,100);

line(20,20,620,20);

linerel(-300,80);

lineto(620,180);

lineto(620,20);

closegraph();

}

D Hình chữ nhật

11 Hàm

void rectangle(int x1,int y1,int x2,int y2);

sẽ vẽ một đờng chữ nhật có các cạnh song song với các cạnh của màn hình Tọa độ đỉnh trên bên trái của hình chữ nhật là (x1,y1) và điểm dới bên phải là (x2,y2)

12 Hàm

void bar(int x1,int y1,int x2,int y2);

sẽ vẽ và tô mầu một hình chữ nhật Các giá trị x1,y1,x2 và y2 có ý nghĩa nh đã nói trong điểm 11

13 Hàm

void bar3d(int x1,int y1,int x2,int y2,int depth,int top);

sẽ vẽ một khối hộp chữ nhật, mặt ngoài của nó là hình chữ nhật xác

định bởi các tọa độ x1,y1,x2,y2 (nh đã nói trong điểm 12) Hình chữ

nhật này đợc tô mầu Tham số depth ấn định số điểm ảnh trên bề sâu của khối 3 chiều Tham số top có thể nhận trị 1 (TOPON) hay 0 (TOPOFF) và khối 3 chiều sẽ có nắp hay không nắp (xem hình vẽ)

Trang 7

TOPON TOPOFF

Ví dụ 4 Chơng trình dới đây sẽ vẽ một đờng chữ nhật, một hình

chữ nhật và một khối hộp chữ nhật có nắp

#include <graphics.h>

main()

{

int mh=0, mode=0;

initgraph(&mh, &mode, "");

setbkcolor(GREEN);

setcolor(RED);

setfillstyle(CLOSE_DOT_FILL,YELLOW);

rectangle(5,5,300,160);

bar(5,175,300,340);

bar3d(320,100,500,340,100,1);

closegraph();

}

Đ 6 Chọn kiểu đờng

1 Hàm

void setlinestyle(int linestyle,int pattern,int thickness);

tác động đến nét vẽ của các thủ tục line, lineto, rectange, drawpoly,

circle, Hàm này cho phép ta ấn định 3 yếu tố của đờng thẳng là

dạng, bề dầy và mẫu tự tạo

+ Dạng đờng do tham số linestyle khống chế Sau đây là các giá

trị khả dĩ của linestyle và dạng đờng thẳng tơng ứng

SOLID_LINE = 0 Nét liền

DOTTED_LINE = 1 Nét chấm

CENTER_LINE = 2 Nét chấm gạch

DASHED_LINE = 3 Nét gạch

USERBIT_LINE = 4 Mẫu tự tạo + Bề dầy do tham số thickness khống chế Giá trị này có thể là:

NORM_WIDTH = 1 Bề dầy bình thờng THICK_WIDTH = 3 Bề dầy gấp ba + Mẫu tự tạo: Nếu tham số thứ nhất là USERBIT_LINE thì ta có thể tạo ra mẫu đờng thẳng bằng tham số pattern Ví dụ xét đoạn

ch-ơng trình:

int pattern= 0x1010;

setlinestyle(USERBIT_LINE, pattern, NORM_WIDTH);

line(0,0,100,200);

Giá trị của pattern trong hệ 16 là 0x1010 hay trong hệ 2 là

0001 0000 0001 0000 Chỗ nào có bit 1 điểm ảnh sẽ sáng, bit 0 làm tắt điểm ảnh

2 Để nhận các giá trị hiện hành của 3 yếu tố trên ta dùng hàm:

void getlinesettings(struct linesettingstype *lineinfo);

với kiểu linesettingstype đã đợc định nghĩa trớc nh sau:

struct linesettingstype {

int linestyle;

unsigned int upattern;

int thickness;

};

Ví dụ 1 Chơng trình dới đây minh họa cách dùng các hàm

setlinestyle và getlinesettings để vẽ đờng thẳng

// kiểu đờng

#include <graphics.h>

#include <conio.h>

main() { struct linesettingstype kieu_cu;

int mh=0, mode=0;

initgraph(&mh, &mode, "");

if (graphresult!= grOk) exit(1);

setbkcolor(GREEN); setcolor(RED);

Trang 8

// Lu lại kiểu hiện tại

getlinesettings(kieu_cu);

// Thiết lập kiểu mới

setlinestyle(DOTTED_LINE,0,THICK_WIDTH);

line(0,0,100,10);

// Phục hồi kiểu cũ

setlinestyle(kieu_cu.linestyle,

kieu_cu.upattern, kieu_cu.thickness);

Line(0,20,100,20);

getch();

closegraph();

}

3 Hàm

void setwritemode( int writemode);

sẽ thiết lập kiểu thể hiện đờng thẳng cho các hàm line, drawpoly,

linerel, lineto, rectangle Kiểu thể hiện do tham số writemode khống

chế:

- Nếu writemode bằng COPY_PUT = 0, thì đờng thẳng đợc viết đè

lên dòng đang có trên màn hình

- Nếu writemode bằng XOR_PUT = 1, thì mầu của đờng thẳng

định vẽ sẽ kết hợp với mầu của từng chấm điểm của đờng hiện có

trên màn hình theo phép toán XOR (chơng 3, Đ3) để tạo lên một

đ-ờng thẳng mới

Một ứng dụng của XOR_PUT là: Khi thiết lập kiểu writemode

bằng XOR_PUT rồi vẽ lại đờng thẳng cùng mầu thì sẽ xóa đờng

thẳng cũ và khôi phục trạng thái của màn hình

Chơng trình dới đây minh họa cách dùng hàm setwritemode Khi

thực hiện ta sẽ thấy hình chữ nhật thu nhỏ dần vào tâm màn hình

Ví dụ 2:

// Thu hình;

#include <graphics.h>

#include <conio.h>

main()

{

struct linesettingstype kieu_cu;

int mh=0, mode=0, x1, y1, x2, y2;

initgraph(&mh, &mode, "");

if (graphresult!= grOk) exit(1);

setbkcolor(GREEN);

setcolor(RED);

setfillstyle(CLOSE_DOT_FILL, YELLOW);

x1=0; y1=0;

x2=getmaxx(); y2=getmaxy();

setwritemode(XOR_PUT);

tt: rectangle(x1,y1,x2,y2); // Vẽ hình chữ nhật

if ( (x1+1)<(x2-1) && (y1+1)<(y2-1) ) {

rectangle(x1,y1,x2,y2); // xóa hình chữ nhật x1=x1+1; y1=y1+1; co hình chữ nhật

x2=x2-1; y2=y2-1;

goto tt;

} setwritemode(COPY_PUT); // Trở về overwrite mode closegraph();

}

Đ 7 Cửa sổ (Viewport)

1 Viewport là một vùng chữ nhật trên màn hình đồ họa tựa nh

window trong textmode Để thiết lập viewport ta dùng hàm

void setviewport(int x1,int y1,int x2,int y2,int clip);

trong đó (x1,y1) là tọa độ góc trên bên trái và (x2,y2) là tọa độ góc dới bên phải Bốn giá trị này phải thỏa mãn:

0 <= x1 <= x2

0 <= y1 <= y2 Tham số clip có thể nhận một trong hai giá trị:

clip = 1 không cho phép vẽ ra ngoài viewport clip = 0 Cho phép vẽ ra ngoài viewport

Ví dụ câu lệnh

Trang 9

setviewport(100,50,200,150, 1);

sẽ thiết lập viewport Sau khi lập viewport ta có hệ tọa độ mới mà góc

trên bên trái của viewport sẽ có tọa độ (0,0)

2 Để nhận viewport hiện hành ta dùng hàm

void getviewsettings(struct viewporttype *vp);

ở đây kiểu viewporttype đã đợc định nghĩa nh sau:

struct viewporttype

{

int left, top, right, bottom;

int clip;

};

3 Để xóa viewport ta dùng hàm

void clearviewport(void);

4 Để xóa màn hình và đa con chạy về tọa độ (0,0) của màn hình

ta dùng hàm

void cleardevice(void);

Chú ý: Câu lệnh này sẽ xóa mọi thứ trên màn hình

5 Tọa độ âm dơng

Nhờ sử dụng Viewport có thể viết các chơng trình đồ họa theo tọa

độ âm dơng Muốn vậy ta thiết lập viewport sao cho tâm tuyệt đối

của màn hình là góc trên bên trái của viewport và cho clip = 0 để có

thể vẽ ra ngoài giới hạn của viewport Sau đây là đoạn chơng trình

thực hiện công việc trên

int xc, yc;

xc= getmaxx()/2; yc= getmaxy()/2;

setviewport(xc, yc, getmaxx(), getmaxy(), 0);

Nh thế màn hình sẽ đợc chia làm 4 phần với tọa độ âm dơng nh

sau:

Phần t trái trên: x âm, y âm

Phần t trái dới: x âm, y dơng

Phần t phải trên: x dơng, y âm

Phần t phải dới: x dơng, y dơng

Chơng trình dới đây vẽ đồ thị hàm sin(x) trong hệ trục tọa độ âm

dơng Hoành độ x lấy các giá trị từ -4*PI đến 4*PI Trong chơng

trình có dùng hai hàm mới là: outtextxy và putpixel (xem các mục sau)

Ví dụ 1:

// đồ thị hàm sin

#include <graphics.h>

#include <conio.h>

#include <math.h>

#define SCALEX 20

#define SCALEY 60 main()

{ int mh=0, mode=0, x, y, i;

initgraph(&mh, &mode, "");

if (graphresult!= grOk) exit(1);

setviewport(getmaxx()/,getmaxy()/2, getmaxx(),getmaxy(), 0);

// Kẻ hệ trục tọa độ setcolor(BLUE);

line(-(getmaxx()/2),0,getmaxx()/2,0);

line(0,-(getmaxy()/2),0,getmaxy()/2);

settextjustify(1,1); setcolor(RED);

outtextxy(0,0,"(0,0)");

for (i=-400;i<=400;++i) {

x=round(2*M_PI*i*SCALEX/200);

y=round(sin(2*M_PI*i/200)*SCALEY);

putpixel(x,y,YELLOW);

} getch();

}

Ví dụ 1 tạo lên một đồ thị từ các chấm điểm Bây giờ ta sửa ví dụ

1 đôi chút: giữ nguyên từ đầu đến outtextxy, thay phần cuối bởi đoạn chơng trình dới đây Ta sẽ đợc đồ thị từ các đoạn thẳng rất ngắn ghép lại

Trang 10

Ví dụ 2:

// Phần đầu giống ví dụ 1

setcolor(YELLOW);

for (i=-400;i<=400;++i)

{

x=round(2*M_PI*i*SCALEX/200);

y=round(sin(2*M_PI*i/200)*SCALEY);

if(i= -400) moveto(x,y);

else lineto(x,y);

}

getch();

}

Đ 8 Tô điểm, tô miền

1 Hàm

void putpixel(int x, int y, int color);

sẽ tô điểm (x,y) theo mầu xác định bởi color

2 Hàm

unsigned getpixel(int x, int y);

sẽ trả về số hiệu mầu của điểm ảnh ở vị trí (x,y) Chú ý: nếu điểm

này cha đợc tô mầu bởi các hàm vẽ hoặc putpixel (mà chỉ mới đợc

tạo mầu nền bởi setbkcolor) thì hàm cho giá trị bằng 0 Vì vậy có thể

dùng hàm này theo mẫu dới đây để xác định các nét vẽ trên màn hình

đồ hoạ và vẽ ra giấy

if (getpixel(x,y)!=0)

{

// Điểm (x,y) đợc vẽ , đặt một chấm điểm ra giấy

}

3 Tô miền

Để tô mầu cho một miền nào đó trên màn hình ta dùng hàm

void floodfill(int x, int y, int border);

ở đây:

(x,y) là tọa độ của một điểm nào đó gọi là điểm gieo

tham số border chứa mã của một mầu

Sự hoạt động của hàm floodfill phụ thuộc vào giá trị của x,y, border và trạng thái màn hình

a) Khi trên màn hình có một đờng (cong hoặc gấp khúc) khép kín

mà mã mầu của nó bằng giá trị của border thì:

+ Miền giới hạn bởi đờng kín sẽ đợc tô mầu nếu điểm gieo (x,y) nằm bên trong miền này

+ Nếu điểm gieo (x,y) nằm bên ngoài thì phần màn hình bên ngoài miền đóng nói trên đợc tô màu

b) Khi trên màn hình không có một đờng nào nh vậy, thì cả màn hình đợc tô màu

Ví dụ 1 Chơng trình dới đây sẽ vẽ một đờng tròn đỏ trên màn

hình xanh Tọa độ (x,y) của điểm gieo đợc nạp vào từ bàn phím Tùy thuộc vào giá trị cụ thể của x,y, chơng trình sẽ tô mầu vàng cho hình tròn hoặc phần màn hình bên ngoài hình tròn

#include <graphics.h>

#include <stdio.h>

main() { int mh=0, mode=0, x, y;

initgraph(&mh, &mode, "");

if (graphresult!= grOk) exit(1);

setbkcolor(GREEN);

setcolor(RED);

setfillstyle(11,YELLOW);

circle(320,100,50);

moveto(1,150);

outtext(" Toa do diem gieo x,y ");

scanf("%d%d",&x,&y); flooddfill(x,y,RED);

}

Ví dụ 2 Minh họa cách dùng hàm Putpixel và hàm getpixel để vẽ

các điểm ảnh và sau đó xóa các điểm ảnh Muốn kết thúc chơng trình bấm ESC

Ngày đăng: 14/11/2012, 16:34

HÌNH ẢNH LIÊN QUAN

Bảng 8-1. Các tệp tin điều khiển đồ họa của TURBO C++ - C++ và lập trình hướng đối tượng - Chương 8
Bảng 8 1. Các tệp tin điều khiển đồ họa của TURBO C++ (Trang 1)
Chú ý 1. Bảng 8-2 cho các tên hằng và giá trị của chúng mà các - C++ và lập trình hướng đối tượng - Chương 8
h ú ý 1. Bảng 8-2 cho các tên hằng và giá trị của chúng mà các (Trang 2)
Hình và mode. Ví dụ trong màn hình EGA nếu dùng mode EGALO thì độ phân giải là 640 x 200, hàm getmaxx cho giá trị 639, hàm getmaxy cho giá trị 199 - C++ và lập trình hướng đối tượng - Chương 8
Hình v à mode. Ví dụ trong màn hình EGA nếu dùng mode EGALO thì độ phân giải là 640 x 200, hàm getmaxx cho giá trị 639, hàm getmaxy cho giá trị 199 (Trang 2)
Bảng 8-3. Các mã lỗi của Graphresult - C++ và lập trình hướng đối tượng - Chương 8
Bảng 8 3. Các mã lỗi của Graphresult (Trang 3)
Bảng 8-5. Các giá trị khả dĩ của pattern - C++ và lập trình hướng đối tượng - Chương 8
Bảng 8 5. Các giá trị khả dĩ của pattern (Trang 4)

TỪ KHÓA LIÊN QUAN

w