BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC CÔNG NGHỆ TP HCM ĐỒ ÁN MÔN HỌC ĐỒ HỌA MÁY TÍNH JAVA GRAPHIC 2D Ngành CÔNG NGHỆ THÔNG TIN Giảng viên hướng dẫn Ths NGUYỄN THỊ ANH THƯ Sinh viên thực hiện NGUYỄN QU[.]
Trang 1ĐỒ ÁN MÔN HỌC
ĐỒ HỌA MÁY TÍNH
JAVA GRAPHIC 2D
Giảng viên hướng dẫn : Ths NGUYỄN THỊ ANH THƯ
Sinh viên thực hiện : NGUYỄN QUANG HUY
MSSV: 16111060130 Lớp: 16DTHA1 Sinh viên thực hiện : PHẠM ĐẶNG ĐỨC HUY
MSSV: 16111060132 Lớp: 16DTHA1 Sinh viên thực hiện : ĐOÀN QUANG KHẢI
MSSV: 16111060136 Lớp: 16DTHA1 Sinh viên thực hiện : NGUYỄN LÊ HOÀNG HUY
MSSV: 16111060459 Lớp: 16DTHA2 Sinh viên thực hiện : TRƯƠNG MINH HUY
MSSV: 16111060133 Lớp: 16DTHA2
TP Hồ Chí Minh, 2019
Trang 2MỤC LỤC
Trang bìa
MỤC LỤC 2
LỜI MỞ ĐẦU 3
CHƯƠNG 1 GIỚI THIỆU VỀ GRAPHICS 2D TRONG JAVA 4
1.1 Định nghĩa về graphics 2D 4
1.2 Thao tác 4
1.3 Hình ảnh hai mô hình 4
CHƯƠNG 2 GIỚI THIỆU VỀ SHAPES TRONG JAVA 5
2.1 Định nghĩa về shapes trong java 5
2.2 Gói Java java.awt.geom 5
2.3 Lớp Line 2D 6
2.4 Lớp Point2D 6
2.5 Các lớp khác của java.awt.geom 7
2.6 Lớp Path2D 8
2.7 Thêm hình img trong java 9
CHƯƠNG 3 GIỚI THIỆU VỀ STROKE AND FILL 10
3.1 Định nghĩa 10
3.2 BasicStroke 11
CHƯƠNG 4 GIỚI THIỆU VỀ TRANSFORMS 12
4.1 Định nghĩa: 12
CHƯƠNG 5 GIỚI THIỆU VỀ BUFFEREDIMAGE AND PIXEL 15
5.1 Định nghĩa 15
CHƯƠNG 6 DEMO 18
6.1 java2d/GraphicsStarter.java 18
6.2 java2d/AnimationStarter.java 19
6.3 java2d/EventsStarter.java 19
6.4 java2d/PaintDemo.java 20
6.5 java2d/JavaPixelManipulation.java 20
CHƯƠNG 7 KẾT LUẬN RÚT RA 20
CHƯƠNG 8 PHÂN CÔNG CÔNG VIỆC VÀ TÀI LIỆU THAM KHẢO 21
Trang 4LỜI MỞ ĐẦU
Theo xu hướng của thời đại cộng nghệ 4.0 hiện nay, ngành công nghệ thông tin là một trong những ngành hết sức quan trọng trên con đường hội nhập và phát triển Sản phẩm công nghệ hiện nay càng chịu sự đánh giá khắc khe hơn từ phía những người dùng, đặc biệt là về sản phầm đồ họa được nhận rất nhiều sự đánh giá từ những người dùng
Xuất phát từ những lý do trên, cùng với sự hướng dẫn của cô Nguyễn Thị AnhThư, chúng em thực hiện nghiên cứu về graphics 2D để vận dụng những kiến thức đã
tự tìm hiểu từ những nguồn tài nguyên có sẵn, xây dựng một tự Games giải trí
Do chưa có nhiều kinh nghiệm thực tiễn, nên đề tài thực hiện của em còn nhiềuthiếu sót, em mong nhận được sự đánh giá và nhận xét của thầy để đề tài được hoànthiện hơn
Chúng em xin chân thành cảm ơn!
Trang 5CHƯƠNG 1 GIỚI THIỆU VỀ GRAPHICS 2D TRONG JAVA
1.1 Định nghĩa về graphics 2D
Graphics2d là hình thức đồ họa trực quan sử dụng hình ảnh để trình bày thôngtin, dữ liệu hoặc kiến thức những thông tin phức tạp nhanh chóng và rõ ràng giúpngười đọc dễ hiểu
Java là một ngôn ngữ hướng đối tượng API của nó được định nghĩa là một tậphợp lớn các lớp, Thực tế các thao tác vẽ trong API đồ họa ban đầu hầu hết được chứatrong lớp có tên Đồ họa Trong API mới hơn, các thao tác vẽ là các phương thức trongmột lớp có tên Graphics2D, là một lớp con của Đồ họa, do đó tất cả các hoạt động vẽban đầu vẫn có sẵn
1.2 Thao tác
Một hệ thống đồ họa cần một nơi để vẽ Trong Java, bề mặt vẽ thường là mộtđối tượng của lớp JPanel, đại diện cho một khu vực hình chữ nhật trên màn hình LớpJPanel có một phương thức có tên paintComponent () để vẽ nội dung của nó Để tạomột bề mặt vẽ, bạn có thể tạo một lớp con của JPanel và cung cấp định nghĩa chophương thức paintComponent () của nó
Tất cả các vẽ nên được thực hiện bên trong paintComponent (); khi cần thay đổinội dung của bản vẽ, bạn có thể gọi phương thức Bảng điều khiển repaint () để kíchhoạt lệnh gọi paintComponent ()
1.3 Hình ảnh hai mô hình
Phương thức paintComponent () có tham số loại Đồ họa, nhưng tham số đó làđược truyền cho phương thức này thực sự là một đối tượng của loại Graphics2D và nó
có thể được truyền kiểu
Graphics2D để có quyền truy cập vào các khả năng đồ họa tiên tiến hơn Vìvậy, định nghĩa của
Phương thức paintComponent () thường trông giống như thế này:
Bảo vệ void paintComponent (Đồ họa g)
{
Đồ họa2D g2;
Trang 6g2 = (Đồ họa2D) g; // Nhập kiểu tham số vào Graphics2D.
g2.setRenderingHint (RenderingH gợi ý.KEY ANTIALIASING,
RenderingH gợi ý.VALUE ANTIALIAS ON);
Đối với các ví dụ đơn giản về đồ họa trong các chương trình Java hoàn chỉnh,bạn có thể xem mẫu:
Ví dụ :
Các chương trình java2d / GraphicsStarter.java và java2d /AnimationStarter java Khung tối thiểu để vẽ hình ảnh tĩnh và hoạt hình, tươngứng, sử dụng Graphics2D
Chương trình java2d / EventsStarter.java là một khung tương tự để làm việc vớichuột và khóa
CHƯƠNG 2 GIỚI THIỆU VỀ SHAPES TRONG JAVA
2.1 Định nghĩa về shapes trong java
Đồ họa ban đầu được thực hiện bằng cách sử dụng tọa độ nguyên, với phép đo bằng pixel Điều này hoạt động tốt trong hệ tọa độ chuẩn, nhưng không phù hợp khi sửdụng tọa độ số thực, vì đơn vị đo trong hệ tọa độ như vậy sẽ không bằng pixel Chúng
ta cần có thể chỉ định hình dạng bằng cách sử dụng số thực
Gói Java java.awt.geom cung cấp hỗ trợ cho các hình dạng được xác định bằng cách sử dụng tọa độ số thực Ví dụ, lớp Line2D trong gói đó đại diện cho các phân đoạn dòng có điểm cuối được cho là cặp số thực
2.2 Gói Java java.awt.geom
Java có hai kiểu số thực: double và float
Trang 7Kiểu double có thể biểu thị một phạm vi số lớn hơn số float, với số chữ số có
nghĩa lớn hơn và gấp đôi là loại được sử dụng phổ biến hơn Trong thực tế, giá trị double đơn giản là dễ sử dụng hơn trong Java
Kiểu float thường có đủ độ chính xác cho các ứng dụng đồ họa và chúng có lợi
thế là chiếm ít không gian hơn trong bộ nhớ Hơn nữa, phần cứng đồ họa máy tính thường sử dụng giá trị float bên trong
Từ những kiểu trên, gói java.awt.geom thực sự cung cấp hai phiên bản của mỗi hình dạng, một sử dụng tọa độ của kiểu float và một sử dụng tọa độ của kiểu double
Line2D.Double hoặc Line2D.Float:
Line2D line1, line2;
line1 = new Line2D.Double(1,2,5,7); // Line from (1.0,2.0) to (5.0,7.0)
line2 = new Line2D.Float(2.7F,3.1F,1.5F,7.1F); // (2.7,3.1) to (1.5,7.1)
Lưu ý rằng khi sử dụng các hằng số kiểu float trong Java, bạn phải thêm “F” làm hậu tố cho giá trị Đây là một lý do tại sao Double dễ dàng hơn trong Java Để đơngiản, bạn có thể muốn sử dụng Line2D.Double Tuy nhiên, Line2D.Float có thể cho hiệu suất tốt hơn một chút
2.4 Lớp Point2D
Lớp trừu tượng Point2D, với các lớp con cụ thể Point2D.Double và
Point2D.Float, biểu thị một điểm theo hai chiều, được chỉ định bởi hai tọa độ số thực Một điểm không phải là hình dạng; bạn không thể điền vào hoặc thay đổi nó Một điểm có thể được xây dựng từ hai số thực:
new Point2D.Double(1.2,3.7)
Trang 8Nếu p là biến loại Point2D, bạn có thể sử dụng p.getX () và p.getY () để truy xuất tọa độ của nó và bạn có thể sử dụng p.setX (x), p.setY (y) hoặc p.setLocation (x, y) để đặt tọa độ của nó
Nếu pd là một biến loại Point2D.Double, bạn cũng có thể tham chiếu trực tiếp đến tọa độ là pd.x và pd.y (và tương tự cho Point2D.Float) Các lớp khác trong
java.awt.geom cung cấp nhiều cách tương tự để thao túng các thuộc tính của chúng và tôi đã thắng cố gắng liệt kê tất cả chúng ở đây
2.5 Các lớp khác của java.awt.geom
Có một loạt các lớp đại diện cho các hình dạng hình học, bao gồm Line2D, Oval2D, RoundRonymous2D, Ellipse2D, Arc2D và Path2D Tất cả đều là các lớp trừutượng và mỗi lớp chứa một cặp các lớp con, chẳng hạn như Rectangle2D.Double and Rectangle2D.Float
Một số hình dạng, chẳng hạn như hình chữ nhật, có nội thất có thể được lấp đầy; hình dạng như vậy cũng có những phác thảo có thể được xây dựng Một số hình dạng, chẳng hạn như đường, hoàn toàn là một chiều và chỉ có thể được xây dựng Bên cạnh các dòng, hình chữ nhật có lẽ là hình dạng đơn giản nhất
Rectangle2D có một điểm góc (x, y), chiều rộng và chiều cao và có thể được xây dựng từ dữ liệu đó
new Rectangle2D.Double(x,y,w,h)
Điểm góc (x, y) chỉ định giá trị x - và y tối thiểu trong hình chữ nhật Đối với hệtọa độ pixel thông thường, (x, y) là góc trên bên trái Tuy nhiên, trong một hệ tọa độ trong đó giá trị tối thiểu của y nằm ở dưới cùng, (x, y) sẽ là góc dưới bên trái Các
Một biến r có kiểu Rectangle2D.Double có các biến thể hiện công khai r.x, r.y, r.width, và r.height Nếu chiều rộng hoặc chiều cao nhỏ hơn hoặc bằng 0, sẽ không có
gì được vẽ khi hình chữ nhật được lấp đầy hoặc xây dựng Một nhiệm vụ phổ biến là xác định một hình chữ nhật từ hai điểm góc (x1, y1) và (x2, y2)
Điều này có thể được thực hiện bằng cách tạo một hình chữ nhật có chiều cao
và chiều rộng bằng 0 và sau đó thêm điểm thứ hai vào hình chữ nhật
Thêm một điểm vào hình chữ nhật làm cho hình chữ nhật phát triển vừa đủ để bao gồm điểm đó:
Trang 9Rectangle2D.Double r = new Rectangle2D.Double(x1,y1,0,0);
r.add(x2,y2);
Các lớp Line2D, Ellipse2D, RoundRonymous2D và Arc2D tạo ra các hình dạng
cơ bản khác và hoạt động tương tự như Rectangle2D Bạn có thể kiểm tra tài liệu API Java để biết chi tiết
2.6 Lớp Path2D
Nó đại diện cho các đường dẫn chung được tạo thành từ các phân đoạn có thể làcác đường và đường cong Bezier Các đường dẫn được tạo bằng các phương thức tương tự như các chương trình con moveTo và lineTo Để tạo một đường dẫn, bạn bắt đầu bằng cách xây dựng một đối tượng có kiểu Path2D.Double (hoặc Path2D.Float):
Path2D.Double p = new Path2D.Double();
Đường dẫn p trống khi lần đầu tiên được tạo Bạn xây dựng đường dẫn bằng cách di chuyển một cây bút tưởng tượng dọc theo đường dẫn mà bạn muốn tạo
Phương thức p.moveTo (x, y) di chuyển bút đến điểm (x, y) mà không cần vẽ
gì Nó được sử dụng để xác định điểm ban đầu của đường dẫn hoặc điểm bắt đầu của một đoạn mới của đường dẫn
Phương thức p.lineTo (x, y) vẽ một đường từ vị trí bút hiện tại đến (x, y), để bút
p.curveTo( cx1, cy1, cx2, cy2, x, y );
Trang 10Điều này thêm một đoạn đường cong bắt đầu tại vị trí bút hiện tại và kết thúc tại(x, y), sử dụng (cx1, cy1) và (cx2, cy2) làm hai điểm kiểm soát cho đường cong
Phương pháp để thêm một đoạn đường cong Bezier bậc hai vào một đường dẫn
là quadTo Nó chỉ yêu cầu một điểm kiểm soát duy nhất:
p.quadTo( cx, cy, x, y );
Khi một đường tự giao nhau, phần bên trong của nó được xác định bằng cách nhìn vào số quanh co Có hai quy tắc có thể để xác định xem một điểm có phải là bên trong hay không: hỏi xem số quanh co của đường cong về điểm đó có khác không hay không, hoặc hỏi xem nó có phải là số chẵn hay không
Có thể đặt quy tắc quanh co được sử dụng bởi Path2D p với
p.setWindingRule( Path2D.WIND NON ZERO );
p.setWindingrule( Path2D.WIND EVEN ODD );
Mặc định là WIND_NON_ZERO
2.7 Thêm hình img trong java
Cuối cùng, có lưu ý rằng có thể vẽ một bản sao của hình ảnh vào bối cảnh đồ họa Hình ảnh có thể được tải từ một tập tin hoặc được tạo bởi chương trình Tôi thảo luận về khả năng thứ hai sau trong phần này Một hình ảnh được đại diện bởi một đối tượng của loại hình ảnh
Trong thực tế, giả sử ở đây rằng đối tượng thuộc kiểu BufferedImage, là một lớp con của Image Nếu img là một đối tượng như vậy, thì :
g2.drawImage( img, x, y, null );
Nó sẽ vẽ hình ảnh với góc trên bên trái của nó tại điểm (x, y) (Tham số thứ tư khó giải thích, nhưng nên được chỉ định là null cho BufferedImages.) Điều này vẽ hìnhảnh ở chiều rộng và chiều cao tự nhiên của nó, nhưng có thể chỉ định chiều rộng và chiều cao khác nhau trong phương thức:
g2.drawImage( img, x, y, width, height, null );
Ngoài ra còn có một phương pháp để vẽ một chuỗi văn bản Phương thức chỉ định chuỗi và cơ sở của chuỗi (Basepoint là góc dưới bên trái của chuỗi, bỏ qua các
“phần thụt” như đuôi trên chữ “g” (Ý chỗ này là nó sẽ bỏ qua cái dấu móc xuống của chữ g ý , kiểu v ) Ví dụ:
Trang 11g2.drawString( "Hello World", 100, 50 );
Hình ảnh và chuỗi có thể biến đổi theo cùng một cách với các hình dạng khác Chuyển đổi là cách duy nhất để có được văn bản và hình ảnh xoay Ví dụ, đây là những gì có thể xảy ra khi bạn áp dụng xoay cho một số văn bản và hình ảnh:
Nguồn: sách Introduction to Computer Graphics
CHƯƠNG 3 GIỚI THIỆU VỀ STROKE AND FILL
Trong đó g2 là tên của hàm graphic2d
Shape có thể là dạng bất kỳ trong các dạng sau: Path2d,line2d, rectangle2d hoặccác định dạng shape khác
Hai cái cú pháp này thường dùng để tạo một đối tượng mới khi đối tượng đó là hình ảnh mà chỉ được vẽ một lần
Ví dụ: g2.draw( new Line2D Double (-5, -5, 5, 5 ))
Và đương nhiên cũng có thể tạo một đối tượng hình dạng và sử dụng lại nhiều lần
Trang 12Công cụ "pen" thường dùng để khoanh vùng những cái shape có định dạng
3.2 BasicStroke
Mặc định của Stroke là đường thẳng có độ rộng bằng 1
Và được tính trong tọa độ đang dùng chứ không phải là 1 pixel
Để vẽ đường thẳng có độ rộng khác có thể cài đặt lại bằng cú pháp:
Ví dụ: g2.setStroke ( new BasicStroke ( width ) )
Biến (width) là dạng float Và cũng có thể giới hạn biến để điều khiển shape trong cái khoanh vùng tại điểm cuối của nó và nơi mà 2 đối tượng giao nhau
Ví dụ: g2.setStroke ( new BasicStroke ( 5.OF, BasicStroke.CAP_ROUND,
BasicStroke.JOIN_BEVEL ) )
Stroke và fill ở đây có nghĩa là đặt màu cho những pixel cố định
Trong java luật dùng để tô màu pixel là "paint"
Paint có thể là 1 màu đơn,1 gradients hoặc 1 bản màu
Giống như những thứ khác trong java Paint đc diễn tả là đối tượng, nếu paint là
đối tượng thì : g2.setPaint(paint) sẽ set paint dùng trong hàm g2 để giới hạn điều
hành việc vẽ, cho đến khi pain đc thay đổi (Và cũng có 2 phương pháp khác là
g2.setColor(c) chỉ hoạt động khi tô màu và tương tự là g2.setPaint(c).
Màu khối (solid color) đc diễn tả là 1 đối tượng dạng Color Đc thể hiện bên trong như là 1 RGBA color
Màu mờ (làm mờ) được tạo thành toàn diện nhất bằng cú pháp: New
color(r,g,b) Trong đó, R,g,b là số nguyên từ 0 đến 255 thể hiện các màu đc hợp thành
từ đỏ, vàng và xanh dương Để có được độ làm mờ phải thêm biến alpha
New color(r,g,b,a) Trong đó a cũng là số nguyên từ 0~255.
Và cũng có hàm Color.getHSBcolor(h,s,b), để tạo 1 cái màu lấy từ HSB color
mode Trong trường hợp màu nền, sự bão hòa, độ sáng của cái color đó có giá trị dạng float Và nó cũng diễn tả được màu được trộn từ nhiều màu như là color.WHITE , color.RED ,và color.YELLOW
Ví du:
Ngoài màu khối Java còn class GradientPaint để điên tả các đường gradient và TexturePaint để diễn tả các bản màu.(Hình ảnh bản màu đc sử dụng giống như cách
Trang 13trong 3d graphic đc gọi là texture) Trong những trường hợp này color đuợ nạp vào pixel tùy thuộc vào tọa độ của pixel.
Để tạo TexturePaint, bạn cần phải có đối tượng bufferedImage để chỉ rõ hình ảnh đó được dùng như là 1 bảng màu (patterns) Bạn sẽ thắc mắc là làm sao để tọa độ của cái image đó được map và hiển thị lên tọa độ của màn hình
Bằng cách chỉ định 1 hình chữ nhật trong đó giữ lại 1 bản copy của Image dùng
cú pháp sau:
New texturePaint ( image, rect).
Trong đó image là BufferedImage, Rect là Rectangle2D
Bên ngoài hình chữ nhật đó image sẽ tiếp tục theo chiều ngang và chiều dọc
CHƯƠNG 4 GIỚI THIỆU VỀ TRANSFORMS
4.1 Định nghĩa:
Java thực hiện các phương thức biến đổi hình học trong lớp Graphics2D Ví dụ,Gọi g2 là một Graphics2D, thì khi gọi g2.translate(1,3) sẽ thực hiện phép dịch chuyển theo tọa độ là (1,3) cho các đối tượng được vẽ sau khi gọi phương thức này được gọi
Đây là các phương thức tương tự đã được nói trong Phần 2.3:
• g2.scale (sx, sy) – co dãn hệ số sx theo chiều ngang và sy theo chiều dọc
• g2.rotate (r) – r sẽ là góc cố định và đơn vị góc của phương thức này phải là radian Một góc dương quay trục x dương theo hướng của trục y dương
• g2.rotate (r, x, y) – quay góc r hướng về 2 điểm (x, y)