lập trình đồ họa trên nền tảng ngôn ngữ lâp trình Java
Trang 1Phần 1 7
Lập trình đồ họa với Java 2D 7
Chương 1 8
Tổng quan về Java 2D API 8
1.1 Enhanced Graphics, Text, and imaging 8
1.2 Rendering Model 9
1.2.1 Coordinate Systems 9
1.2.1.1 User Space 9
1.2.1.2 Device Space 10
1.2.2 Transforms 10
1.2.3 Fonts 10
1.2.4 Images 11
1.2.5 Fills and Strokes 12
1.2.6 Composites 12
Backward Compatibility and Platform independence 13
1.3.1 Backward Compatibility 13
1.3.2 Platform independence 14
1.4 The Java 2D™ API Packages 14
Chương 2: 17
Rendering with Graphics2D 17
2.1 Các lớp và giao diện 17
2.2 Rendering Concepts 18
2.2.1 Rendering Process 18
2.2.2 Controlling Rendering Quality 19
2.2.3 Stroke Attributes 20
2.2.4 Fill Attributes 21
Quá trình xử lý theo phiên 21
2.2.5 Clipping Paths 22
2.2.6 Transformations 22
2.2.6.1 Constructing an AffineTransform 23
2.2.7 Composite Attributes 24
2.2.7.1 Managing Transparency 24
2.2.7.2 Transparency and images 25
2.3 Thiết lập Graphics2Context 25
2.3.1 Setting Rendering Hints 25
2.3.2 Specifying Stroke Attributes 26
2.3.2.1 Setting the Stroke Width 26
2.3.2.2 Specifying Join and Endcap Styles 26
2.3.2.3 Setting the Dashing Pattern 26
2.3.3 Specifying Fill Attributes 27
2.3.3.1 Filling a Shape with a Gradient 27
2.3.3.2 Filling a Shape with a Texture 27
2.3.4 Setting the Clipping Path 28
2.3.5 Setting the Graphics2D Transform 29
2.3.6 Specifying a Composition Style 30
2.3.6.1 Using the Source Over Compositing Rule 30
2.3.6.2 Increasing the Transparency of Composited Objects 30
2.4 Rendering Graphics Primitives 31
2.4.1 Drawing a Shape 31
2.4.2 Filling a Shape 32
Trang 22.4.3 Rendering Text 32
2.4.4 Rendering images 32
2.5 Defining Custom Composition Rules 33
2.6 Rendering in a Multi-Screen Environment 33
Chương 3 41
Các đối tượng hình họa 41
3.1 Giao diện và lớp 41
3.2 Các khái niệm hình học: 43
3.2.1 Constructive Area Geometry 43
3.2.2 Bounds and Hit Testing 43
3.3 Combining Areas to Create New Shapes 47
Chương 4: 50
Hiển thị Font và văn bản 50
4.1.Giao diện và lớp 50
4.2.Các khái niệm về Font 51
4.3 Các khái niệm về Text Layout 52
4.3.1 Vẽ chữ 52
4.3.2 Ordering Text 54
4.3.3 Đo và định vị văn bản 55
4.3.4 Hỗ trợ thao tác với văn bản 55
4.3.4.1 Hiển thị dấu nhắc 55
4.3.4.2 Di chuyển dấu nhắc 56
4.3.4.3 Hit Testing 57
4.3.4.4 Đánh dấu vùng lựa chọn 58
4.3.5 Thực thi việc hiển thị văn bản trong ứng dụng Java™ 58
Quản lý việc hiển thị văn bản 59
4.4.1 Trình bày văn bản 60
Hiển thị dấu nhắc kép 60
4.4.3 Di chuyển dấu nhắc 61
4.4.4 Hit Testing 61
4.4.5 Đánh dấu vùng lựa chọn 61
4.4.6 Querying Layout Metrics 61
4.4.7 Vẽ văn bản trên nhiều dòng 62
Chương 5 66
Tạo ảnh 66
5.1 Các giao diện và các lớp 66
5.1.1 Các giao diện imaging (imaging interfaces) 66
5.1.2 Các lớp dữ liệu ảnh(image Data Classes) 67
5.1.3 image Operation Classes 68
5.1.4 Sample Model Classes 68
Color Model Classes 69
5.1.6 Exception Classes 70
5.2 Immediate Mode imaging Concepts 70
5.2.1 Terminology 71
5.3 Using Bufferedimages 72
5.3.1 Creating a Bufferedimage 72
5.3.2 Drawing in an Offscreen Buffer 73
5.3.2.1 Creating an Offscreen Buffer 73
5.3.2.2 Drawing in an Offscreen Buffer 74
5.3.3 Manipulating Bufferedimage Data Directly 75
Trang 35.3.4 Filtering a Bufferedimage 75
5.3.5 Rendering a Bufferedimage 75
5.4 Managing and Manipulating Rasters 78
5.4.1 Creating a Raster 79
5.4.2 Parent and Child Rasters 79
5.4.4 The WritableRaster Subclass 79
5.5 Image Data and DataBuffers 79
5.6 Extracting Pixel Data from a SampleModel 80
5.7 ColorModels and Color Data 81
5.7.1 Lookup Table 81
5.8 image Processing and Enhancement 81
5.8.1 Using an image Processing Operation 83
Chương 6 85
Mầu sắc 85
6.1 Các lớp 85
6.2 Những định nghĩa về mầu sắc 86
6.2.1 Không gian mầu 86
6.2.1 Biểu diễn màu 88
Chương 7 90
In ấn 90
7.1 Các giao diện và các lớp 90
7.2.1 Supporting Printing 91
7.2.1.1 Điều khiển in (Job Control) 91
7.2.2 Page Painters 92
7.2.3 Printable Jobs and Pageable Jobs 93
7.2.4 Typical Life-Cycle of a PrinterJob 94
7.3 Printing with Printables 95
7.3.2 Printing a File 96
7.4.1 Using a Pageable Job 99
7.4.2 Using Multiple Page Painters 100
Phần 2 106
Lập trình đồ họa với Java 3D 106
CHƯƠNG 1 107
NHẬP MÔN LẬP TRÌNH TRÊN JAVA 3D 107
1.1 Tổng quan về Java 3D API ™ 107
1.2 Các vấn đề cơ bản về Java 3D API™ 107
1.3 Xây dựng đồ thị khung cảnh 108
1.3.1 Thừa kế cấp cao từ Java 3D API 111
1.4 Cách thức để viết một chương trình Java 3D 112
1.4.1 Công thức đơn giản để viết một chương trình Java 3D 112
1.5 Một vài thuật ngữ trong Java 3D 115
1.6 Ví dụ đơn giản: HelloJava3Da 116
1.6.1 Các lớp của Java 3D Classes được sử dụng trong HelloJava3Da 120
Tạo nên hình lập phương có kích thước được định ra bởi các giá trị cho trước 122
1.7 Quay hình lập phương 122
1.7.1 Sự kết hợp của các phép biến hình: HelloJava3Db 123
1.8 Khả năng và hoạt động 123
1.8.1 Dịch các nội dung 124
1.8.2 Khả năng 124
1.9 Thêm vào các hành vi animation 125
Trang 41.9.1 Định nghĩa các hành vi animation 126
1.9.2 Các hàm biến đổi về thời gian: Ánh xạ một hành vi với thời gian 126
1.9.3 Lập danh mục các vùng 127
1.9.4 Ví dụ về hành vi: HelloJava3Dc 128
1.9.5 Phép biến hình và kết hợp các hành vi Ví dụ: HelloJava3Dd 129
CHƯƠNG 2 132
Tạo các hình 132
2.1 Hệ tọa độ thế giới ảo 132
2.2 Visual Object Definition Basics 132
2.2.1 An Instance of Shape3D Defines a Visual Object 133
2.2.2 Node Components 134
2.2.3 Defining Visual Object Classes 134
2.3 Các lớp tiện ích hình học 135
2.3.1 Box 136
2.3.2 Cone 136
2.3.3 Cylinder 137
2.3.4 Sphere 137
2.3.5 More About Geometric Primitives 138
2.3.6 ColorCube 138
2.3.7 Example: Creating a Simple Yo-Yo From Two Cones 138
2.4 Các lớp toán học 142
2.4.1 Point Classes 144
2.4.2 Color Classes 144
2.4.3 Vector Classes 145
2.4.4 TexCoord Classes 146
2.5 Các lớp hình học 146
2.5.1 GeometryArray Class 147
2.5.2 Subclasses of GeometryArray 151
2.5.3 Subclasses of GeometryStripArray 152
2.5.4 Subclasses of IndexedGeometryArray 156
2.5.5 Axis.java is an Example of IndexedGeometryArray 158
2.6 Appearance and Attributes 158
2.6.1 Appearance NodeComponent 159
2.6.2 Sharing NodeComponent Objects 159
2.6.3 Attribute Classes 160
2.6.4 Example: Back Face Culling 165
2.7 Bounds and Scope 170
2.7.1 Bounds Node Components 171
2.7.2 BoundingLeafa Node 173
2.7.3 Scope 174
2.8 Hình học nâng cao 175
2.8.1 Multiple Geometries in a Single Shape3D 176
2.8.2 GeometryArray 177
2.8.4 AlternateAppearance <new in 1.2> 181
2.9 Clipping – Cắt xén 182
2.9.1 View Defines a Frustum 182
2.9.2 Clip Node 183
2.9.4 ModelClip Example 184
CHƯƠNG 3 186
TẠO NỘI DUNG 186
Trang 53.1 Nội dung chính 186
3.1.1 GeometryInfo 186
3.2.1 Một ví dụ đơn giản về GeometryInfo 187
3.2.2 Sử dụng GeometryInfo 187
3.2.3 Một số lớp thông dụng có liên quan đến GeometryInfo 188
Loaders 191
Một ví dụ đơn giản sử dụng leader 191
Các loader phổ biến 191
3.3.3 Giao diện của gói Loader và lớp cơ sở 192
Viết một loader 194
Công việc của một loader 194
Hàm tạo lớp Loader 195
Viết một File Loader đơn giản 196
Text2D 201
3.5.1 Ví dụ Text2D đơn giản 202
3.5.2 Lớp Text2D 202
Text3D 203
Một ví dụ Text3D 204
Những lớp liên quan để tạo ra đối tượng Text3D 205
Nền không gian đồ họa 209
Một ví dụ background 209
Lớp Background 210
CHƯƠNG 4 212
TƯƠNG TÁC 212
4.1 Hành vi: Cơ sở của tương tác và hoạt hình 212
4.1.1 Ứng dụng của hành vi 212
4.1.2 Tổng quan lớp Behaviour 213
4.2 Cơ bản về hành vi 213
4.2.1 Viết một lớp Behaviour 214
4.2.2 Sử dụng một lớp Behaviour 216
4.2.3 Các hàm API trong lớp Behaviour 219
4.3 Điều kiện kích hoạt: Cách kích hoạt các hành vi 220
4.3.1 Điều kiện kích hoạt 221
4.3.2 WakeupCriterion 221
4.3.3 Quy định lớp WakeupCriterion 222
4.3.4 Thành phần của WakeupCondition 230
4.4 Lớp Behaviour tiện ích xử lý bàn phím 231
4.4.1 Một ví dụ đơn giản 231
4.4.2 Lớp KeyNavigatorBehaviour và KeyNavigator 232
4.5 Lớp tiện ích tương tác với chuột 233
4.5.1 Sử dụng lớp MouseBehaviour 233
4.5.2 Mouse Behaviour Foundation 236
4.5.3 Các lớp MouseBehaviour 236
4.5.4 Mouse Navigation 238
4.6 Picking Object 239
4.6.1 Using Picking Utility Classes 242
4.6.2 Các hàm API cơ bản trong các lớp Picking 244
4.6.3 Các lớp picking 249
4.6.4 Các lớp Picking Behavior 251
CHƯƠNG 5 253
Trang 6Hoạt Hình 253
Animation - Hoạt hình: 253
Đối tượng Interpolator và Alpha với hoạt ảnh dựa thời gian 254
Alpha 254
Sử dụng các đối tượng Interpolator và Alpha: 256
Ví dụ sử dụng lớp Alpha và RotationInterpolator: 256
Alpha API: 259
Các lớp hành vi Interpolator : 261
Core Interpolator API: 268
Các lớp đối tượng nội suy đường: 272
Lớp Billboard : 277
Sử dụng đối tượng Billboard 277
Chương trình ví dụ sử dụng Billboard 279
Giao diện lập trình ứng dụng của Billboard (Billboard API) 281
OrientedShape3D 282
Giao diện lập trình ứng dụng của OrientedShape3D 282
Ví dụ sử dụng OrientedShape3D 283
Hoạt ảnh mức chi tiết (Level Of Detail Animations) 284
Sử dụng đối tượng DistanceLOD 285
Các lỗi thường gặp khi sử dụng LOD 285
Ví dụ sử dụng DistanceLOD 285
Giao diện lập trình ứng dụng DistanceLOD API 289
Morph 290
Sử dụng đối tượng Morph 290
Ví dụ sử dụng Morph 291
Giao diện lập trình ứng dụng Morph API 293
Giao diện GeometryUpdater 294
Sử dụng GeometryUpdater 294
Chương trình ví dụ hệ thống phân tử đài phun nước sử dụng GeometryUpdater .295
Trang 7Lời nói đầu
Sự phát triển của khoa học, kĩ thuật, nghệ thuật, kinh doanh, và côngnghệ luôn luôn phụ thuộc vào khả năng truyền đạt thông tin của chúng ta, hoặcthông qua các bit dữ liệu lưu trữ trong microchip hoặc thông qua giao tiếp bằngtiếng nói Câu châm ngôn từ xa xưa “một hình ảnh có giá trị hơn cả vạn lời"hay "trăm nghe không bằng một thấy" cho thấy ý nghĩa rất lớn của hình ảnhtrong việc chuyển tải thông tin Hình ảnh bao giờ cũng được cảm nhận nhanh
và dễ dàng hơn, đặc biệt là trong trường hợp bất đồng về ngôn ngữ Do đókhông có gì ngạc nhiên khi mà ngay từ khi xuất hiện máy tính, các nhà nghiêncứu đã cố gắng sử dụng nó để phát sinh các ảnh trên màn hình Trong suốt gần
50 năm phát triển của máy tính, khả năng phát sinh hình ảnh bằng máy tính củachúng ta đã đạt tới mức mà bây giờ hầu như tất cả các máy tính đều có khảnăng đồ họa.Đồ họa máy tính là một trong những lĩnh vực lí thú nhất và pháttriển nhanh nhất của tin học Ngay từ khi xuất hiện, đồ họa máy tính đã có sứclôi cuốn mãnh liệt, cuốn hút rất nhiều người ở nhiều lĩnh vực khác nhau nhưkhoa học, nghệ thuật, kinh doanh, quản lí, Tính hấp dẫn và đa dạng của đồhọa máy tính có thể được minh họa rất trực quan thông qua việc khảo sát cácứng dụng của nó
Ngày nay, đồ họa máy tính được sử dụng trong rất nhiều lĩnh vực khácnhau như công nghiệp, thương mại, quản lí, giáo dục, giải trí, … Số lượng cácchương trình đồ họa ứng dụng thật khổng lồ và phát triển liên tục.Trong lĩnhvực công nghiệp,CAD(computer-aided design) đã được sử dụng hầu hết trongviệc thiết kế các cao ốc, ô tô, máy bay, tàu thủy, tàu vũ trụ, máy tính,…Tronglĩnh vực giải trí,nghệ thuật, đồ họa máy tính giúp ta tạo ra các chương trình tròchơi,các kĩ xảo điện ảnh cho các nhà làm phim,hay ngay chính giao diện đồ họa
đã làm nâng cao khả năng giao tiếp giữa người và máy tính
Để có thể làm được những ứng dụng đồ họa hữu ích cho cuộc sống,trướchết chúng ta cần phải có một nền tảng vững chắc về lập trình đồ họa.Có rấtnhiều ngôn ngữ hỗ trợ lập trình đồ họa máy tính,mỗi ngôn ngữ được xây dưngtrên những thư viện đồ họa riêng,có những thế mạnh riêng.Và khi nói về lậptrình đồ họa,chúng ta không thể không nói đến ngôn ngữ Java,một ngôn ngữ rấtmạnh trong lĩnh vực này.Với mục đích nghiên cứu,tìm hiểu và mang đến chonhững ai muốn tìm hiều về lập trình đồ họa một tài liệu thiết thực,nhóm chúng
em đã chọn đề tài làm tutorial về lập trình đồ họa trên nền tảng ngôn ngữ lâptrình Java,dựa trên các tài liệu training trên mạng của hãng Sun.Vì là lần đầulàm tài liệu tham khảo nên chúng em không tránh khỏi sai sót.Chúng em mongthầy xem xét và góp ý cho tài liệu này.Chúng em chân thành cảm ơn
Trang 9Phần 1Lập trình đồ họa với Java 2D
Trang 10Chương 1
Tổng quan về Java 2D API
Java 2D™ API tăng cường về khả năng đồ hoạ, văn bản và ảnh của AbstractWindowing Toolkit (AWT), giúp phát triển về giao diện người sủ dụng và ứng dụng
về JAVA trong một số lĩnh vực mới.Cùng với khả năng mạnh về đồ hoạ ,phông chữ
và ảnh trong các API, thì Java 2D API còn hỗ trợ những thuộc tính và thành phầnmàu sắc đã được nâng cao, và thành công trong việc biểu diễn các bề mặt hình học tuỳ
ý và một kiểu tô trát chuẩn cho máy in và thiết bị hiển thị Java 2D API cũng cho phéptạo ra các thư viện đồ hoạ mở rộng,như các thư viện của CAD-CAM và các thư việntạo hiệu ứng đặc biệt cho ảnh và đồ hoạ, cũng như việc tạo ra các bộ lọc đọc/viết fileảnh và đồ hoạ.Khi được sử dụng kết hợp với Java Media Framework Java MediaAPIs khác ,thì Java 2D APIs có thể được sử dụng để tạo ra và hiển thị hiện thực ảo vàcác dạng đa phương tiện khác Java Animation và Java Media Framework APIs dưatrên Java 2D API để hỗ trợ việc tô trát(rendering)
1.1 Enhanced Graphics, Text, and imaging
Nếu các phiên bản trước của AWT chỉ cung cấp các gói tô trát(rendering) đơngiản chỉ phù hợp cho việc rendering các trang HTML đơn giản,mà không đáp ứng đủcho các dạng đồ hoạ,văn bản và ảnh phức tạp Thì Java 2D™ API cung cấp gói tô trátđẩy đủ các tính năng bằng cách mở rộng AWT để hỗ trợ cho đồ hoạ và các thao tácrendering Ví dụ như thông qua các lớp đồ hoạ cho phép vẽ hình chữ nhật,hình ôval,vàcác đa giác Đồ hoạ 2D tăng cường về khái niệm của phép tô trát hình học bằng cáchcung cấp một cơ chế cho phép rendering ảo của bất kì bề mặt hình học nào.Tương tưnhư vậy với Java 2D API bạn có thể vẽ các dạng đường với bất kì độ rộng và dạnghình học nào
Dạng hình học được cung cấp thông qua các phần thực thi implementations của
Shape interface trong Graphic class, như hình chữ nhật 2D và Elip 2D Các đường
cong và hình cung cũng thuộc phần implementations của Shape Các kiểu vẽ và tô cũng được cung cấp thông qua phần thực thi implementations của giao tiếp Paint và
Stroke interfaces, ví dụ BasicStroke, GradientPaint, TexturePaint,và Color AffineTransform định nghĩa các phép biến đổi trong toạ độ 2 chiều, gồm có
phép lấy tỉ lệ,phép chuyển đổi toạ độ ,phép quay và phép xén cắt
Khung nhìn được định nghĩa bởi các phương thức giống nhau của lớp Shape mà chúng được dùng để định nghĩa các khung nhìn chung,ví dụ như Rectangle2D và
Trang 111.2 Rendering Model
Kiểu tô trát đồ họa đơn giản không có gì thay đổi khi thêm vào Java 2D™ APIs
Để tô trát đồ họa thì phải thiết lập các thông số về đồ họa và gọi phương thức của đốitượng Graphics
Trong Java 2D API, lớp Graphics2D mở rộng lớp Graphics để hỗ trợ thêm nhiềuthuộc tính đồ họa và cung cấp thêm các phương thức cho quá trình tô trát
The Java 2D API tự động cân chỉnh những sai khác trong các thiết bị tô trát và cungcấp một kiểu tô trát thống nhất cho các dạng thiết bị khác nhau Tại tầng ứngdụng,quá trình tô trát là giống nhau cho dù thiết bị cuối đó là màn hình hay máy in Với Java 2 SDK, version 1.3 , Java 2D API còn hỗ trợp cho các môi trường đamàn hình (multi-screen environments)
1.2.1 Coordinate Systems
Java 2D API bao hàm hai hệ tọa độ:
1 Không gian người sủ dụng là hệ tọa độ logic và độc lập với thiết bị Các ứngdụng thường sủ dụng hệ tọa độ này,tất cả các dạng hình học được tô trát bằngJava 2D đều được xác định trong hệ tọa độ này
2 Không gian thiết bị là hệ tọa độ phụ thuộc thiết bị,ứng với từng loại thiết bịcuối mà có hệ tạo độ khác nhau
Bằng ứng dụng máy ảo một cửa sổ hiển thị có thể mở rộng thêm nhiều thiết bịhiển thị vậy lý tạo nên môi trường đa màn hiển thị, hệ tọa độ của thiết bị này được sủdụng làm hệ tọa độ của máy ảo sẽ được lấy làm hệ tọa độ cho tất cả các màn hiể thịcòn lại
Hệ thống Java 2D sẽ tự động thực hiện những phép chuyển đổi cần thiết giữakhông gian người sử dụng và không gian thiết bị Mặc dù hệ tọa độ cho màn hình rấtkhác đối với hệ tọa độ cho máy in nhưng sự khác biệt này trong suốt đối với các ứngdụng
1.2.1.1 User Space
Hệ tọa độ này được chỉ ra trong hình 1-1
y
Figure 1-1 User Space Coordinate System
Không gian người sử dụng biểu diễn một cách trừu tượng đồng nhất cho các hệtạo độ của tất cả các thiết bị có liên quan.Còn không gian thiết bị cho một thiết bị cụthể có thể có cùng gốc tọa độ và hướng của các trục hoặc là có thể không.Ngoài ra cáctọa độ của không gian người sử dụng có thể chuyển đổi một cách tự động vào khônggian thiết bị phù hợp mỗi khi một đối tượng đồ họa được tô trát,thường thì các chươngtrình driver của các thiết bị thực hiện điều này
Trang 121.2.1.2 Device Space
Java 2D API định nghĩa 3 mức thông tin cấu hình để hỗ trợ cho việc chuyển đổi
từ không gian người sử dụng sang không gian thiết bị Thông tin này được chứa trong
Lớp GraphicsEnvironment mô tả tập các thiết bị mà đựợc chấp nhận bởi các ứng
dụng Java trong một môi trường cụ thể.Các thiết bị sử dụng cho quá trình tô trát gồm
có màn hình , má in và các bộ đệm ảnh.Lớp GraphicsEnvironment cũng bao gồm
tập các font phù hợp trong môi trường đó
Lớp GraphicsDevice mô tả thiết bị tô trát như màn hình hoặc máy in.Mỗi cấu hình phù hợp của thiết bị được biểu diễn bởi lớp GraphicsConfiguration Ví dụ,một thiết
bị hiển thị SVGA có thể thực hiện trong một số chế độ màu như : 640x480x16 colors,640x480x256 colors, and 800x600x256 colors
Màn hình SVGA được biểu diễn bởi một đối tượng GraphicsDevice và ứng với
mỗi chế độ màu của màn hình SVGA sẽ được biểu diễn bởi một đối tượng
GraphicsConfiguration.Một đối tượng kiểu GraphicsEnvironment có thể bao gồm
1 hay nhiều đối tượng GraphicsDevices Ngược lại ,mỗi đối tượng GraphicsDevice
có thể có 1 hay nhiều đối tượng kiểu GraphicsConfigurations.
1.2.2 Transforms
Java 2D API có một chế độ chuyển tọa độ thống nhất Tất cả các phép chuyển tọađộ,bao gồm các phép chuyển từ không gian người sử dụng đến không gian của thiết
bị,đều được biểu diễn bởi đối tượng kiểu AffineTransform AffineTransform định
nghĩa các luật cho những thao tác trên các hệ tọa độ bằng các ma trận(các phép biếnđổi ảnh bằng các bộ lọc)
Cũng có thể thêm đối tượng AffineTransform cho các dạng đồ họa bằng các phép
xoay ,lấy tỉ lệ ,chuyển đổi hoặc cắt tọa độ cho một mặt hình học ,văn bản hay ảnh khichúng được tô trát.Các phép biến đổi được thêm vào này sẽ được ứng dụng cho cácđối tượng đồ họa được tô trát trong trường hợp đó phép bién đổi này được thực hiệnkhi chuyển từ tọa độ không gian người sử dụng sang không gian của thiết bị
1.2.3 Fonts
Một xâu thường được hiểu là tập các kí tự tao thành.Khi một xâu được vẽ, hìnhdạng của nó sẽ được xác định bởi font mà chúng ta chọn.Tuy nhiên, hình dạng màfont sử dụng để hiển thị lên màn hình xâu đó không phải lúc nào cũng giống với hìnhdáng của mỗi kí tự riêng biệt ví dụ sự kết hợp của 2 hay nhiều kí tự thường được thay
thế bởi một hình dạng kí hiêu nào đó được gọi là ligature.
Các hình dạng mà một phông chữ sử dụng để biểu diễn các kí tự trong một xâu được
gọi là glyphs Một font có thể biểu diễn một kí tự như chữ thường hoặc chữ hoa bằng cách sử dụng nhiều glyphs, hoặc biểu diễn các liên kết kí tự như fi chỉ biểu diễn bởi 1
glyph Trong Java 2D API, một glyph chỉ đơn giản là một dạng (Shape) mà có thể
đựoc thao tác và tô trát một cách giống nhau như bất kì với các dạng khác Shape.
Trang 13Một font có thể được xem như tập các glyph Một font đơn có thể có rất nhiều
kiểu khác nhau như kểi chữ đậm ,vừa,nghiêng ,gôtích…tất cả các kiểu chữ này trongmột font có cùng thiết kế in và có thể ví như chúng là các thành viên trong cùng mộtgia đình Hay nói cách khác ,một nhóm các glyphs với các kiểu riêng biệt tạo nên mộtdạng font,nhóm các dạng font tao nên môt họ font ,họ các font tạo nên một tập font và
tập này có sẵn trong một đối tượng GraphicsEnvironment cụ thể nào đó.
Trong Java 2D API, các font được xác định bởi một tên mà mô tả một dạng fontriêng biệt nào đó,ví dụ Helvetica Bold Nhưng điều này lại khác với fần mềm JDK 1.1,các font được mô tả bằng các tên lôgíc mà ánh xạ trên các dạng font khác nhau fụthuộc liệu các dạng font đó có sắn trong môi trường đang xét không.Như để tươngthích cho điều đó ; the Java 2D API hỗ trợ việc xác định các font bằng tên lôgíc cũngnhư bằng tên dạng font
Sử dụng Java 2D API, có thể soạn thảo và tô rát các xâu bao gồm nhiều fontthuộc các họ font,hình dạng,kich thước, và thâm chí cả ngôn ngữ khác nhau Các dạngcủa văn bản được lưu riêng biệt một cách lôgíc với sự sắp xếp các văn bản.Các đốitượng Font được sử dụng để mô tả các hình dạng hiển thị của font, và thông tin sắp
xếp được lưu trong đối tượng TextLayout và TextAttributeSet Việc lưu giứ các
font và thông tin sắp xếp riêng biệt nhau làm dễ dàng hơn cho việc sử dụng cùng fontchữ nhưng khác về cấu hình sắp xếp
1.2.4 Images
Ảnh được tạo nên từ tập các pixel Một điểm ảnh hay một pixel sẽ định nghĩa thể
hiện của một ảnh tại vùng quan sát của màn hình Một mảng hai chiều của điểm ảnh
được gọi là một raster.
Thể hiện của một điểm ảnh có thể được định nghĩa một cách trực tiếp hoặc như làmột chỉ số trong bảng màu dành cho ảnh
Trong ảnh màu đa màu (hơn 256 màu) các điểm ảnh thường trực tiếp biểu diễnluôn màu sắc và các đặc trưng khác cho mỗi vùng hiển thị của ảnh Những ảnh nhưvậy sẽ có kích thước lớn hơn ảnh màu mà hiển thị bằng chỉ số(indexed-color images),nhưng chúng nhìn sẽ thật hơn
Trong ảnh màu hiển thị bằng chỉ số (indexed-color image), những màu sắc củaảnh sẽ bị giới hạn bởi bảng màu , và thường số lượng màu trong bảng màu sẽ ít hơnsovới ảnh thật Tuy nhiên các ảnh khi được lưu như tập các chỉ số màu sẽ làm chokích thước ảnh nhỏ đi.Định dạng này thường được dùng cho những ảnh có 256 màu.Ảnh trong Java 2D API có hai thành phần chính
• Dữ liệu ảnh thô(các điểm ảnh)
• Những thông tin cần thiết cho quá trình chuyển đổi các điểm ảnh
Các luật cho việc chuyển đổi các điểm ảnh được lưu bởi đối tượng ColorModel.
Đối với một điểm ảnh để hiển thị cần phải đi kèm với một kiểu màu sắc
Một dải màu là một thành phần của không gian màu sắc dành cho ảnh.Ví dụ cácthành phần màu đỏ là các daỉ màu trong ảnh RGB Một điểm ảnh trong ảnh dùng màutrực tiếp có thể được hiểu như một tập
Gói java.awt.image bao gồm một số phương thức ColorModel cho các biểu diễn
thành phần điểm ảnh
Một đối tượng ColorSpace chứa các luật để sao cho tập các giá trị màu tương ứng với một màu sắc nhất định .Các phương thức của ColorSpace trong
java.awt.color sẽ biẻu diễn các không gian màu sắc thông dụng, gồm có không gian
màu RGB và gray scale Lưu ý rằng một không gian màu không phải là một tập cácmàu sắc mà tập này định nghĩ các luật để có thể chuyển đổi các giá trị màu thành cácmàu tương ứng thông dịch
Trang 14Việc chia không gian màu sắc thành các chế độ màu sẽ tạo nên sự linh hoạt hơntrong việc biểu diễn và chuyển đổi từ phép biểu diễn màu này sang một phếp biểu diẽnmàu khác.
1.2.5 Fills and Strokes
Với Java 2D API, có thể tô các hình băng cách sử dụng các kiểu but khác nhau vàcác kiểu tô khác nhau Vì các chữ xét cho cùng cũng được biểu diễn bằng tập cácglyph, nên các xâu kí tự cũng có thể được vẽ và tô
Các kiểu bút được định nghĩa băng các đối tượng kiểu Stroke.Có thể xác định độrộng cũng như các nét cho các đường thẳng và đường cong
Các kiểu tô được định nghĩa bởi các phương thức thuộc đối tượng Paint Lớp
Color có sắn trong các phiên bản trước của AWT đây là một dạng đơn giản của đối
tượng Paint được sử dụng để định nghĩa tô màu trơn (solid color) Java 2D API cung
cấp thêm hai phương thức mới cho Paint là TexturePaint và GradientPaint.
TexturePaint định nghĩa kiểu tô dùng mẩu ảnh đơn giản(simple image fragment ) mà
được lặp như nhau GradientPaint định nghĩa một kiểu tô màu loang(gradient) giữa
hai màu
Trong Java 2D, rendering một đường nét của một hình và tô hình đó bằng mộtkiểu nào đó được thực hiên hai thao tác riêng biệt:
• Sử dụng một trong các thuật toán draw để render các đường nét của hình sử
dụng các kiểu bút được xác định bởi các thuộc tính của Stroke và kiểu tô được
xác định bởi thuộc tính Paint.
• Sử dụng phương thức fill để tô các vùng trong của hình với kiểu tô đã dược
xác định
Khi một chuỗi kí tự được render,các thuộc tính hiện tại của Paint đựơc áp dụng
cho các glyphs tạo nên chuỗi đó.Lưu ý thực chất đối tượng drawString sẽ tô các
glyphs mà được render Để vẽ các nét của các glyphs trong chuỗi kí tự cần phải chọn
các đường nét và render chúng như đối với các hình sử dụng phương thức draw
1.2.6 Composites
Khi render một đối tượng mà chồng lên một đối tượng đã tồn tai trước đó cầnphải xác định làm thế nào để kết hợp màu của các đối tuợng Java 2D API có các luật
cho việc kết hợp màu trong trường hợp này trong đối tượng Composite.
Tuy nhiên có một số vấn đề trong cách tiếp cận này:
• Sẽ thật khó trong trường hợp nếu màu Red và màu Blue được thêm vào hây
không được thêm vào
• Việc kết hợp lôgíc sẽ không được hỗ trợ trong trường hợp cácmàu thuộc cáckhông gian màu khác nhau
• Sự kết hợp sẽ không có ý nghĩa trong trường hợp màu được biểu diễn bằng cácgia trị màu thì khi đó sự kết hợp hai điểm ảnh là sự kết hợp của hai giá trị màu
Java 2D API tránh các loĩi này bằng cách thực hiện các luật pha trộn alpha mà sẽđưa vào các thông tin về kiểu biểu diễn điểm ảnh mỗi khi thực hiện kết hợp màu Một
đối tượng AlphaComposite bao gồm các kiểu về màu sắc của các màu sắc của nguồn
và đích
Trang 15Backward Compatibility and Platform independence
Như đã nói,Java 2D™ API có sự tương thích đối với phần mềm JDK 1.1 VàJava 2D™ API là một kiến trúc chính vì vậy mà các ứng dụng của nó có tính độc lập
về môi trường
1.3.1 Backward Compatibility
Để tương thích với các tính năng đã tồn tại trong đồ họa JDK Java 2D API tăngcường thêm một số tính năng cho AWT bằng cách thêm các phương thức mới vàocác lớp đã tồn tại,mở rộng thêm các lớp đã tồn tại và đồng thời thêm các lớp mới vàcác interface mới mà không ảnh hưởng tới các API hợp lệ
Ví dụ,Có rất nhiều tính năng củaJava 2D API được bắt nguồn từ việc mở rộng các
thuộc tính về đồ họa trong Graphics2D Để cung cấp các thuộc tính mở rộng về đồ
họa trong đó bao gồm cả yếu tố tương thích với các phần mềm đồ họa khác,
Graphics2D mở rộng các lớp Graphics trong JDK1.1.
JDK 1.1 applet thông dịch ngữ cảnh đồ họa mà được đưa vào như là một thể hiện
của lớp Graphics Để có thể truy nhập những chức năng được thực thi trong đối tượng Graphics2D, thì một applet tương thích với Java 2D API sẽ đưa ngữ cảnh đồ họa tới đối tượng Graphics2D:
public void Paint (Graphics g) {
• Một hay nhiều lớp cha được chèn vào biểu đồ phân cấp của lớp , và các lớp thừa
kế được cập nhật để mở rộng các lớp cha mới Kĩ thuật này được sử dụng để thêm cácphương thức và các dữ liệu thể hiện cho lớp kế thừa
• Một hay nhiều triển khai các interface được thêm vào lớp kế thừa Kĩ thuật nàyđược sử dụng để thêm các phương thức ảo tổng quát(general abstract methods) cholớp kế thừa
Ví dụ, Java 2D API khái quát hóa lớp AWT Rectangle bằng cách sử dụng cả hai
kĩ thuật Sự phân cấp cho hình chữ nhật giống như:
Trang 16Trong phần mềm JDK 1.1 , Rectangle là một đối tuợng mở rộng đơn giản Bây giờ mở rộng các lớp Rectangle2D mới và triển khai cả hai interface Shape và
Serializable Hai lớp cha được thêm vào phân cấp của lớp Rectangle là RectangularShape và Rectangle2D Các Applet được viết cho phần mềm JDK 1.1
không truy cập được các lớp mới và các phần triển khai của các interface,nhưng điều
này không ảnh hưởng bởi vì lớp Rectangle vẫn bao gồm các phương thức và các
thành phần có trong các phiên bản trước
1.3.2 Platform independence
Có khả năng pháp triển các ứng dụng độc lập với môi trường Java 2D API khôngđảm đương về không gian màu sắc hay là chế độ màu của thiết bị rendering và Java2D API có bất kì định dạng ảnh cụ thể nào
Và chỉ độc lập về font khi các font đó đã được xây dựng sẵn(được cung cấp như
là một phần của phần mềm JDK ),hay là khi chúng được gởi tạo bằng lập trình Java2D API không hỗ trợ các font xây dựng sẵn và các font được tạo nên nhờ chươngtrình tạo font nhưng nó lại hỗ trợ việc định nghĩa các font thông qua tập các glyph của
nó Mỗi glyph lại có thể được định nghĩa bởi Shape mà bao gồm các đoạn đườngthẳng và các đường cong Có rất nhiều kiểu font với nhiều hình dang và kich thướcđược bắt nguồn từ tập các glyph đơn lẻ
1.4 The Java 2D ™ API Packages
Các lớp Java 2D API được tổ chức trong các package sau:
Package java.awt bao gồm các lớp Java 2D API đã đề cập ở trên và các interface
đã tồn tại trước đó và các interface fát triển thêm (Rõ dàng là không phải tất cả cáclớp trong java.awt là các lớp của Java 2D )
Trang 17Package java.awt.geom bao gồm các classe và interface có liên quan đến việc địnhnghĩa các dạng hình học nguyên thủy:
Có nhiều dạng hình học nguyên thủy ứng với các phần implementation Float và
Double
Điều này cho phép các implementation có thể ở hai mức chính xác là giá trị
single và double.
Gói java.awt.font chứa các lớp và các giao diện được sử dụng cho việc bố trí văn
bản và định nghĩa các kiểu font:
Gói java.awt.color chứa các lớp và các giao diện cho việc định nghĩa các không gianmàu và các mẫu màu:
Trang 18Các gói java.awt.image và java.awt.image.renderable chứa các lớp và các giao
diện cho việc định nghĩa và tạo bóng của ảnh
Package java.awt.image tồn tại trong các version trước đó của AWT Java 2D
API tăng cường thêm các lớp ảnh kế thừa từ AWT sau đây:
• ColorModel
• DirectColorModel
• indexColorModel
Các lớp chế độ màu sắc này vẫn tồn tại trong package java.awt.image package
cho sự tương thích Để đảm bảo tính thống nhất,các lớp cho chế độ màu mới cũng có
trong package java.awt.image
Package java.awt.print bao gồm các lớp và các interface cho phép in tất cả các
dạng văn bản ,đồ họa và ảnh dựa trên công nghệ Java 2D
Trang 19Chương 2:
Rendering with Graphics2D
Graphics2D mở rộng java.awt.Graphics để tạo ra điều khiển tinh vi hơn về
biểu diễn các hình ,văn bản và ảnh Quá trình tô trát Java 2D™ được điều khiển thông
qua đối tượng Graphics2D và các thuộc tính trạng thái của nó.
Các thuộc tính tạng thái Graphics2D , như là các kiểu đường thẳng và các phép biến
đổi,được áp dụng cho các đối tượng đồ họa khi chúng được tô trát Tập các thuộc tính
trạng thái kết hợp với Graphics2D được tham chiếu tới như là Graphics2DContext.
Để tô trát văn bản ,hình và ảnh,cần thiết lập Graphics2D context và sau đó gọi một trong các phương thức tô trát Graphics2D như draw hay fill.
2.1 Các lớp và giao diện.
Bảng cho sau đây sẽ liêt kê các giao diện và lớp trong việc kết hợp với ngữ cảnh
Graphics2D context,bao gồm các lớp biểu diễn các thuộc tính trạng thái Hầu hết các
lớp này là một phần của package java.awt.
Các giao diện và mô tả chúng:
Giao diện Mô tả
Composite Định nghĩa các phương thức cho việc kết hợp một đối tượng vẽ
gốc với cùng đồ họa được đánh dấu Được thực thi bởi phươngthức AlphaComposite
CompositeContext Định nghĩa một môi trương tối ưu và độc lập cho việc thực hiện
các phép kết hợp Việc thực hiện các luật kết hợp tùy chọn đượcthực hiện bơit người lập trình
Paint Mở rộng: Transparency
Định nghĩa các màu sắc cho việc tô hoặc vẽ Được thực thi bởiđối tượng Color,Gradient-Paint và TexturePaint
PaintContext Định nghĩa một môi trương tối ưu và độc lập cho việc vẽ.Các
thao tác vẽ được tùy chọn bởi người lập trình
Stroke Tạo ra một đối tượng Shape mà các đường viền của nó đựoc tạo
bóng.Được thực thi bởi phương thức BasicStroke
Các lớp và mô tả sơ lược về chúng:
Trang 20Lớp Mô tả
AffineTransform
(java.awt.geom) Miêu tả một phép biến đổi 2D affine ,mà thực hiện việc ánh xạtuyến tính từ tọa độ 2D này đến tọa độ 2D khác
AlphaComposite Thực thi : Composite
Thực hiện các luật kết hợp các giá trị alpha cơ bản cho các đốitượng Shape,Text và Image
BasicStroke Thực thi :Stroke
Định nghĩa kiểu bút vẽ( “pen style”) được áp dụng cho các đườngbao của đối tượng Shape
Color Thực thi: Paint
Định nghĩa một kiểu tô màu đồng nhất cho đối tượng Shape.GradientPaint Thực thi: Paint
Định nghĩa một mẫu tô màu loang tuyến tính cho đối tượngShape.Mẫu này sẽ thay đổi từ màu C1 (tại điểm P1) tới màu C2(taiđiểm P2)
Graphics2D Mở rộng: Graphics
Lớp cơ sở cho quá trình tạo bóng trong không gian 2D.Mở rộnglớp gốc java.awt.Graphics
TexturePaint Thực thi: Paint
Định nghĩa một kiểu tô theo mẫu cho đối tượng Shape.Mẫu tôđược tạo ra từu đối tượng BufferedImage
2.2 Rendering Concepts
Để tô trát một đối tượng đồ họa sử dụng Java 2D™ API, cần thiết lập ngữ cảnh
Graphics2DContext và sử dụng một trong các phương thức tô trát Graphics2D đối
với đối tượng
Có thể thay đổi các thuộc tính trạng thái mà tạo nên ngữ cảnh Graphics2D như :
• Thay đổi độ rộng của nét bút
• Thay đổi cho các nét bút kết hợp với nhau như thế nào
• Thiết lập một khung cắt để giới hạn vùng được tô trát
• Chuyển đổi tọa độ ,xoay,lấy tỉ lệ hoặc cắt cá đối tượng khi chúng đượcrender
• Định nghĩa các màu và các kiểu để tô các hình
• Xác định các đối tượng đa đồ họa(multiple graphics objects) cần phải đượctạo ra như thế nào
Graphics2D định nghĩa một số phương thức để thêm và thay đổi các thuộc tính
trong ngữ cảnh đồ họa Hầu hết những phương thức này là những đối tượng biểu diễn
các thuộc tính riêng biệt như đối tựơng Paint hay Stroke
Ngữ cảnh Graphics2D cất giữ các tham chiếu tới các đối tương thuộc tính Nếu biến đổi một đối tượng thuộc tính mà là một phần của ngữ cảnh Graphics2D ,thì cần phải
gọi phương thức thiết lập phù hợp để khai báo ngữ cảnh.Thay đổi một đối tượng trongquá trình thao tác render sẽ gây nên một số biểu hiện bất thương thường và không ổnđịnh
2.2.1 Rendering Process
Khi một đối tượng đồ họa được render, thông tin về hình học ,ảnh và thuộc tínhđược kết hợp để tính toán những giá trị điểm ảnh cần phải thay đổi trên màn hiển thị
Trang 21Quá trình render cho một đối tượng Shape có thể được chia thành 4 bước :
1 Nếu đối tượng Shape được taọ nét ,đối tượng Stroke quy vào ngữ cảnh
Graphics2D được sử dụng để tạo nên một đối tượng Shape mới bao quanh những
đường nét đó
2 Tọa độ của đường thuộc đối tượng Shape được biến đổi từ không gian người
sử dụng sang không gian của thiết bị theo các thuộc tính biến đổi trong ngữ cảng đồ
Tạo bóng (Rendering) văn bản tương đương với việc tạo bóng các đối tượng
thuộc kiểu Shape, khi đó văn bản được tạo bóng với từng glyph và mỗi glyph là một đối tượng thuộc kiểu Shape Chỉ có điều khác là Java 2D API phải xác định đối tượng
Font nào sử dụng cho văn bản và lấy kiểu glyph tương ứng từ đối tượng Font trước
khi tạo bóng
Đối với ảnh thì có sự khác biệt , sự chuyển đổi và thực hiện các phép cắt bỏ vớihộp xác định biên ảnh( image’s bounding box) Thông tin về màu sắc lấy từ chính ảnh
đó và nguồn alpha(alpha channel) được sử dụng kết hợp với thuộc tính hiện tại của
Composite khi các điểm ảnh được hợp trên bề mặt tạo bóng.
2.2.2 Controlling Rendering Quality
Java 2D API đưa ra các lựa chọn cho phép người sử dụng tạo bóng nhanh hay tạobóng với chất lượng cao Những tham chiếu của người su dụng được xác định như là
các chỉ dẫn thông qua thuộc tính của đối tượng RenderingHints trong ngữ cảnh của đối tượng Graphics2D Không phải tất cả các môi trường đều hỗ trợ việc thay đổi
chế độ tạo bóng vì vậy xác định các chỉ dẫn cho quá trình tạo bóng sẽ không đượcđảm bảo chúng sẽ được sử dụng hay không
Lớp RenderingHints hỗ trợ cá kiểu chỉ dẫn sau đây:
• Alpha interpolation - có thể thiết lập tùy chọn default, quality, speed
• Antialiasing - có thể thiết lập tùy chọn default :on hoặc off
• Color Rendering - có thể thiết lập tùy chọn default, quality, hoặc speed
• Dithering - có thể thiết lập tùy chọn default:disable, enable
• Fractional Metrics - có thể thiết lập tùy chọn default, on, hoặc off
• Interpolation- có thể thiết lập tùy chọn nearest-neighbor, bilinear, hoặc bicubic
• Rendering - có thể thiết lập tùy chọn default, quality, hoặc speed
• Text antialiasing - có thể thiết lập tùy chọn default: on hoặc off
Để thiết lập hoặc thay đổi các thuộc tính RenderingHints trong ngữ cảnh của đối tượng Graphics2D thì gọi phương thức setRenderingHints Khi một chỉ dẫn
được thiết lập măc định ,môi trường tạo bóng mặc định sẽ được sử dụng
Kĩ thuật làm trơn(Antialiasing)
Khi các thực thể cơ sở được tạo bóng trên thiết bị hiển thị ,các biên(cạnh) của
chúng có thể không trơn hay nhám là do thuộc tính aliasing Các đường cung và
đường chéo có dạng nhám bởi vì chúng được xấp xỉ bởi các điểm ảnh mà gần nhất vềhìn dạng với chúng Đây là điều mà chúng ta có thể nhận thấy với các thiết bị trướcđây với các cạnh nhám xuất hiện trái ngược hoàn toàn với các cạnh trơn của đườgnnằm ngang hay thẳng đứng
Antialiasing là một kĩ thuật được sử dụng để tạo bóng các đối tượng với các cạnh
trơn hơn Thay vì sử dụng các điểm ảnh gẩn giống với các đường chéo và đường cong
Trang 22,tăng mật độ các điểm ảnh bao quanh tới các vùng được tạo bóng Điều này làm chocách cạnh trơn hơn và trải rộng sự chuyển tiếp bật/tắt với các pixel đa điểm(multipixel) Tuy nhiên kĩ thuật antialiasing đòi hỏi nhiều về tài nguyên máy tính và làmtăng thời gian tạo bóng.
2.2.3 Stroke Attributes
Tạo nét một đối tượng thuộc kiểu Shape như đối tượng GeneralPath tương đươnng với việc sử dụng một bút lôgíc theo các đoạn của đối tượng GeneralPath Thuộc tính của Graphics2DStroke định nghĩa các tính chất của nét bút vẽ.
Đối tượng BasicStroke được sử dụng để định nghĩa các thuộc tính đường nét cho một ngữ cảnh của Graphics2D BasicStroke đinh nghĩa các thuộc tính như độ rộng
cuả nét vẽ ,mẫu tô…
Để thiết lập hay thay đổi các thuộc tính Stroke trong ngữ cảnh của Graphics2D thì gọi phương thức setStroke.
Như ví du,ảnh đầu tiên trong hình 2-3 sử dụng miter join-style,và hình thứ hai sửdụng kiểu round join-style, a round endcap style, and a dashing pattern
Các phương thức tạo bóng Graphics2D có sử dụng thuộc tính của Stroke để vẽ
như drawArc, drawLine, drawOval, drawPolygon, drawPolyline, drawRect, và
drawRoundRect.Khi một trong các phương thức được gọi thì các đường nét của đối
tượng Shape đã xác định sẽ được tậo bóng Thuộc tính Stroke định nghĩa các tính
chất của đường thẳng và các thuộc tính của Paint định nghĩa màu sắc hay mẫu của
nét bút Ví dụ phương thức draw(myRectangle) được gọi:
1 Thuộc tính của Stroke sẽ quy định cho đường nét của hình chữ nhật
2 Các đường nét này sẽ được biến đổi thành một đối tượng kiểu Shape
3 Đối tượng Paint is được áp dụngcác điểm ảnh thuộc miền giới hạn bởi đường bao của đối tựơng Shape.
Quá trình xử lý này được minh hạo trong hình 2-4:
Trang 232.2.4 Fill Attributes
Thuộc tính tô màu trong ngữ cảnh Graphics2D được biểu diễn bởi đối tượng
Paint Có thể thêm một đối tượng vào ngữ cảnh của đối tượng Graphics2D
(Graphics2D context) bằng cách gọi phương thức setPaint.
Khi một đối tượng Shape hay là các glyph được vẽ (bởi các phương thức
Graphics2D.draw, Graphics2D.drawString),
Đối tượng Paint này sẽ được áp dụng tới tất cả các pixel nằm trong đối tượng
Shape mà biểu diễn các đường nét bao quanh đối tượng Khi một đối tượng Shape
được tô màu (Graphics2D.fill), đối tượng Paint được áp dụng tới tất cả các điểm ảnh
nằm trong đường bao của đối tượng Shape
Các kiểu tô màu đồng nhất đơn giản (solid color) được khởi tạo bởi phương thức
setColor.Color là phần triển khai (implementation) đơn giản nhất của giao tiếp Paint
(Paint interface)
Để tô các hình với các kiểu tô phức tạp hơn như là tô loang(gradient) và tô dệt
( texture) bằng cách sử dụng các lớp trong Java 2D Paint là GradientPaint và
TexturePaint Các lớp này sẽ loại bỏ các công việc tiêu tốn thời gian để tạo các kiểu
tô phức tạp bằng cách sử dụng các kiểu tô mầu đồng nhất đơn giản
Khi gọi phưong thức fill để tạo bóng một đối tượng Shape,thì hệ thống sẽ:
1 Xác định các điểm ảnh nào để thể hiện đối tượng đó
2 Xác định màu cho mỗi điểm ảnh từ đối tựợng Paint
3 Chuyển các màu này tới giá trị điểm ảnh tương ứng cho các thiết bị hiểnthị
4 Ghi các điểm ảnh ra thiết bị hiển thị đó
Quá trình xử lý theo phiên
Để tổ chức hợp lý quá trình xử lý các điểm ảnh , Java 2D API tổ chức chúng theotừng phiên
Trang 24Mỗi phiên có thể là tập các điểm ảnh kề nhau trên một đường quét hay là mộtkhối (block)các điểm ảnh Quá trình xử lý theo phiên được thực hiện theo 2 bước:
1 Phương thức createContext của đối tượng paint được gọi để tạo một đối tượng
PaintContext Đối tượng PaintContext này sẽ lưu thông tin ngữ cảnh về thao tác tạo
bóng hiện thời và những thông tin cần thiết để tạo ra các màu Phương thức
createContext method is passed the bounding boxes of thegraphics object being filled
in user space and in device space,đối tượng ColorModel là nơi để tạo các màu sắc,và
thực hiện quá trình chuyển đổi để ánh xạ từ không gian người sử dụng vào không gian
của thiết bị Đối tượng ColorModel xem như một chỉ dẫn không phải tất cả các đối tượng Paint có thể hỗ trợ một đối tượng ColorModel bất kỳ.
2 Phương thức getColorModel được gọi để nhận giá trị của đối tượng
ColorModel cho màu vẽ từ đối tượng PaintContext.
Phương thức getRaster sau đó được gọi lặp lại nhiều lần để nhận giá trị của đối
tựợng Raster mà bao gồm dữ liệu màu thật cho mỗi phiên Thông tin này passed tothe next stage in the rendering pipeline, mà vẽ các màu đã được tạo bằng cách sử dụng
đối tựợng Composite hiện thời
2.2.5 Clipping Paths
Một khung nhìn sẽ xác định phần của đối tượng Shape hay Image cần được tạo bóng Khi một khung nhìn là một phần của ngữ cảnh của đối tượng Graphics2D, thì chỉ những phần của đối tượng Shape hay image nằm trong khung nhìn đó mới được
tạo bóng
Để thêm khung nhìn cho ngữ cảnh của Graphics2D thì goị phương thức setClip Bất kì đối tượng Shape cũng có thể được sử dụng để định nghĩa một khung nhìn.
Để thành đổi khung nhìn cần phải sử dụng phương thức setClip để xác định một
khung nhìn mới hay là gọi phương thức clip để thay đổi khung nhìn cho phần giao
nhau giữa khung nhìn cũ và một đối tượng Shape.
2.2.6 Transformations
Ngữ cảnh của đối tượng Graphics2D bao gồm một phép bién đổi mà được sử
dụng để biến đổi những đối tượng từ không gian người sử dụng vào không gian thiết
bị trong quá trình tạo bóng Để thực hiện các phép biến đổi khác như phép quay haylấy tỉ lệ thì cần phải thêm các phép biến đổi khác vào ngữ cảnh của đối tượng.Cácphép biến đổi được thêm vào này sẽ trở thành một phần của ống biến đổi (pipeline oftransformations) mà được ápdụng trong suôt qua trình tạo bóng
Graphics2D cung cấp một vài cách khác để thay đổi phép biến đổi trong ngữ
cảnh của đối tượng Graphics2D Cách đơn giản nhất là gọi một trong các phương
thức biến đổi trong đối tượng Graphics2D như : rotate, scale, shear, hay translate.
Xác định các tính chất của phép biến đổi để áp dụng trong suốt qúa trình tạo bóng và
Graphics2D tự động tạo ra các thay đổi phù hợp.
Cũng có thể nối một phép biến đổi AffineTransform với phép biến đổi
Graphics2D hiện tại Phép biến đổi AffineTransform thực hiện các phép biến đổi
cho đường như phép dịch,tỉ lệ ,quay và cắt bỏ với tập các hình cơ bản
Khi một phép biến đổi được nối vào phép biến đổi đã tồn tại trước đó thì phépbiến đổi sau cùng sẽ được xác định như là phép biến đổi được thực hiện đầu tiên Đểtiếp nối một phép biến đổi với phép biến đổi hiện tại , you pass an AffineTransform to
Graphics2D.transform.
Lớp Graphics2D cũng bao gồm phương thức setTransform , nhưng phương thức
này không bao giờ được sử dụng để nối với các phép biến đổi tọa độ khác của phép
biến đổi đang tồn tại Phương thức setTransform sẽ ghi đè lên phép biến đổi hiện thời
Trang 25của đối tượng Graphics2D, nhưng phương thức này cần cho môt số mục đích khác
như:
• Áp dụng phép biến đổi tỉ lệ điều chỉnh cho máy in
• Vẽ một đối tượng JComponent non-zero translation from its parent’s origin
• Phóng to một thành phần để dễ dàng quan sát
• Các tình huống khác mà người cung cấp đối tượng Graphics2D muốn chuyểnđổi cho quá trình tạo bóng hiệu quả
Phương thức setTransform method được xem như để thiết lập đối tượng
Graphics2D trở lai phép biến đổi ban đầu sau quá trình tạo bóng đồ họa ,văn bản và
ảnh đã được chuyển đổi:
trong ngữ cảnh của Graphics2D
Các phép biến đổi quan hệ(Affine Transforms)
Java 2D API cung cấp một lớp biến đổi là AffineTransform AffineTransforms
được sử dụng để biến đổi văn bản ,hình và các ảnh khi chúng được tạo bóng
Cũng có thể ứng dụng các phép biến đổi cho đối tượng Font để tạo ra các dẫn
xuất font mới(new font derivations)
Một phép biến đổi đồng nhất (affine transformation) thực hiện một phép biến đổituyến tính trên tập đồ hạo cơ bản Nó luôn biến các đường thẳng thành các đườngthẳng và các đường thẳng song song thành các đường thẳng song song,tuy nhiênkhoảng cách giữa các điểm và các góc của các đường thẳng không song song có thểthay đổi
Các phép biến đổi có thể kết hợp để tạo ra đường ống các phép biến đổi một cáchhiệu quả nhằm áp dụng cho một đối tượng nào đó Sự kết hợp này xem như là sự mócnối Khi một phép biến đổi được kết nối với một phép biến đổi đang tồn tại như với
AffineTransform.concatenate, thì phép biến đổi cuối cùng được xác định là phép
biến đổi đầu tiên được áp dụng Một phép biến đổi cũng có thể được móc nối trướcvới một phép biến đổi đang tồn tại Trong trường hợp này thì phép biến đổi cuối cùng
sẽ được thực hiện cuối cùng Phép móc nối trước được được áp dụng để thực hiệncác phép biến đổi có liên quan với không gian thiết bị thay vì không gian người sử
Trang 26• getShearinstance
Để sử dụng các phương thức này cần phải xác định các tính chất của phép biến
đổi mà cần tạo ra và lớp AffineTransform sẽ tạo ra các ma trận chuyển đổi phù hợp.
Cũng có thể xây dựng phép biến đổi đòng nhất một cách trực tiếp mà không cần thông
qua lớp AffineTransform bằng cách xác định các thành phần của phép biến đổi đó.
2.2.7 Composite Attributes
Khi hai đối tượng đồ họa trồng lên nhau thì điều cần thiết là phải xác định nhữngmàu nào sẽ được tạo bóng cho các điểm ảnh chồng lên nhau Ví dụ nếu một hình chữnhật màu đỏ và một hình chữ nhật màu xanh chồng lên nhau thì các điểm ảnh đó sẽ cómàu đỏ hoặc màu xanh hay là sự kết hợp của cả hai màu Màu của những điểm ảnhtrong vùng chồng nhau đó sẽ xác định hình chữ nhật nào nằm trên và bị che khuấtnhư thế nào Quá trình xử lý để xác định màu nào tạo bóng cho các điểm ảnh sẽ được
chia sẽ cho các đối tượng chồng (overlaping objects)được gọi compositing.
Có hai interface tạo các kiểu kết hợp cơ bản trong Java 2D là : Composite và
CompositeContext.
Để xác định các kiểu kết hợp sẽ được sử dụng thì cần phải thêm vào một đối
tượng AlphaComposite cho ngữ cảnh của đối tượng Graphics2D bằng cách gọi
phương thức setComposite AlphaComposite,và một triển khai(implementation) của
interface Composite , có hỗ trợ một số kiểu kết hợp khác nhau Mỗi đối tượng của lớpnày là một luật kết hợp để mô tả sự pha trộn một màu mới với màu đang tồn tại Một trong những luật kết hợp trong lớp AlphaComposite là SRC_OVER, luật này chỉ
ra màu mới (màu nguồn) sẽ được pha trộn với màu đang tồn tại (màu đích ) như thếnào
2.2.7.1 Managing Transparency
Giá trị alpha của một màu là giá trị đo đọ trong suôt của màu đó ,nó chỉ ra (theo
phần trăm) bao nhiêu phần trăm màu trước khi tô được hiển thị ra khi các màu chồnglên nhau Các màu tối (co giá tri alpha=1.0) thì các màu tô đè lên chúng sẽ khôngđược hiển thị, trong khi đó các màu trong suốt (có giá trị alpha=0.0) cho phép các màu
tô đè lên nó được hiển thị
Khi văn bản và hình được tạo bóng thì giá trị alpha sẽ bắt nguồn từ thuộc tính của
đối tượng Paint trong ngữ cảnh của đối tượng Graphics2D Khi các hình và văn bản được làm trơn thì giá trị alpha từ thuộc tính Paint (trong ngữ cảnh của Graphics2D)
được kết hợp với thông tin về các điểm ảnh bị che từ “rasterized path” Các ảnh lưuthông tin về giá trị alpha của chính nó
Trang 27Khi tạo một đối tượng AlphaComposite , có thể xác định được giá trị alpha được thêm vào Khi thêm đối tượng AlphaComposite này tới ngữ cảnh của Graphics2D
,giá trị alpha thêm vào này sẽ làm tăng giá trị trong suốt của bất kì đối tượng đồ họanào khi chúng được tạo bóng - giá trị alpha của mỗi đối tượng đồ họa được nhân lên
bởi giá trị alpha của đối tượng AlphaComposite.
2.2.7.2 Transparency and images
Các ảnh có thể lưu thông tin về độ trong suốt cho mỗi điểm ảnh của nó Thông tin
này đựoc gọi là kênh alpha( alpha channel,) ,nó được sử dụng kêts hợp với đối tượng
Composite trong ngữ cảnh của Graphics2D để pha trộn màu của ảnh đó các đồ họa
đang tồn tại
2.3 Thiết lập Graphics2Context
Để cấu hình ngữ cảnh Graphics2D cho quá trình tạo bóng phải sử dụng các phương thức khởi tạo cho đối tượng Graphics2D để xác định các thuộc tính như
RenderingHints, Stroke, Paint,Clipping path, Composite, and Transform
2.3.1 Setting Rendering Hints
Đối tượng RenderingHints đóng gói tất các tham chiếu để xác định một đối
tượng sẽ được tạo bóng như thế nào Để tạo các chỉ dẫn cho quá trình tạo bóng trong
ngữ cảnh Graphics2D ,thì cần tạo một đối tượng RenderingHints và chuyển nó vào
Trang 282.3.2 Specifying Stroke Attributes
Một đối tượng BasicStroke sẽ định nghĩa các tính chất đuwoc áp dụng cho đường viền bao quanh một đối tượng Shape, gồm có độ rộng và kiểu đường (dashing
pattern),để làm thế nào các đoạn thẳng được kết hợp với nhau Để khởi tạo các thuộc
tính về đường nét trong ngữ cảnh Graphics2D ,thì khởi tạo một đối tượng
BasicStroke và chuyền nó vào phương thức setStroke
2.3.2.1 Setting the Stroke Width
Để khởi tạo độ rộng đường nét thì khởi tạo đối tượng BasicStroke với độ rộng
mong muốn và sau đó gọi phương thức setStroke
Trong ví dụ cho sau đây ,độ rộng đường nét được khởi tạo với 12 điểm và giá trịmặc định được sử dụng cho việc bố trí kiểu jont và kiểu endcap
wideStroke = new BasicStroke(12.0f);
g2.setStroke(wideStroke);
2.3.2.2 Specifying Join and Endcap Styles
Để khởi tạo cho các kiểu join và endcap ,cần tạo một đối tượng BasicStroke với
các thuộc tính mong muốn
Trong ví dụ cho sau đây,độ rộng đường nét được khởi tạo với 12 điểm và các kiểujoin và endcap được sử dụng thay cho các gia tri mặc định:
roundStroke = new BasicStroke(4.0f, BasicStroke.CAP_ROUND,
BasicStroke.JOiN_ROUND);
g2.setStroke(roundStroke);
2.3.2.3 Setting the Dashing Pattern
Các kiểu đường phức tạp có thể dễ dàng được định nghĩa với một đối tượng
BasicStroke.
Khi tạo một đối tượng BasicStroke ,phải xác định 2 tham số để kiểm soát kiểu
đường:
• dash - là một mảng biểu diễn kiểu đường Các phần tử xen kẽ của mảng
biểu diễn kích thước nét gạch và khoảng cách giữa các nét gạch
Phần tử 0 biểu diễn nét gạch đầu tiên, phần tử thứ 1 biểu diễn khoảng trắng đầutiên
• dash_phase - là một offset định nghĩa nơi bắt đầu của mẫu nét gạch.
Trong ví dụ sau đây, hai mẫu nét gạch được áp dụng cho một đường thẳng Trongmẫu thứ nhất ,kích thước của các nét gạch và khoảng trống giữa chúng là không thayđổi Mẫu thứ hai thì phức tạp hơn ,sử dụng mảng sáu phần tử để định nghĩa
Trang 292.3.3 Specifying Fill Attributes
Thuộc tính cảu đối tượng Paint trong ngữ cảnh Graphics2D xác định các màu tô
hay các mẫu (kiểu )tô khi một đối tượng văn bản và Shape được tạo bóng
2.3.3.1 Filling a Shape with a Gradient
Lớp GradientPaint cung cấp một cách đơn giản để tô một hình bằng kiểu tô loang Khi khởi tạo đối tượng GradientPaint, cần xác định vị trí đầu tiên cùng với
màu tô và vị trí cuối cùng một màu tô Kiểu tô này sẽ thay đổi tỉ lệ từ màu này sangmàu khác dọc theo đường nối của hai vị trí đã chọn, minh họa trong hình 2-8
Trong ngôi sao thứ ba,cả hai điểm đều nằm trong cùng một hình.Tất cả các điểmdọc theo đường tô loang mở rộng qua điểm P1 sẽ nhận được màu ban đầu và các điểmdọc theo đường tô loang được mở rộng ngoài điểm P2 sẽ nhận màu kết thúc
Các bước cần thực hiện để tô loang theo hai màu:
1 Khởi tạo đối tượng GradientPaint
2 Gọi phương thức Graphics2D.setPaint.
3 Khởi tạo đối tượng Shape.
Trong ví dụ sau đây, một hình chữ nhật được tô với mẫu dệt đơn giản từ một đốitượng buffered image
GradientPaint gp = new GradientPaint(50.0f, 50.0f, Color.blue
Trang 30Lớp TexturePaint cung cấp một cách đơn giản để tô hình bằng mẫu lặp Khi tạo mộtđối tượng Bufferedimage để sử dụng như là một mẫu tô Cần chuyển hàm khởi tạomột hình chữ nhật để định nghĩa tần số lặp cho mẫu ,được chi ra trong hình 2-9.
Để tô hình theo mẫu dệt:
1 Tạo đối tượng TexturePaint
2 Gọi phương thức Graphics2D.setPaint.
3 Tạo đối tượng Shape.
4 Gọi phương thức Graphics2D.fill(shape).
Trong ví dụ sau đây, một hình chữ nhật được tô với mẫu dệt đơn giản từ
một đối tượng bufferedimage.
// Create a buffered image texture patch of size //5x5
Bufferedimage bi = new Bufferedimage(5, 5,
// Create a texture paint from the buffered image
Rectangle r = new Rectangle(0,0,5,5);
TexturePaint tp = new
TexturePaint(bi,r,TexturePaint.NEAREST_NEiGHBOR);
// Add the texture paint to the graphics context g2.setPaint(tp); // Create and render a rectangle filled with the texture g2.fillRect(0,0,200,200);
}
2.3.4 Setting the Clipping Path
Để định nghĩa một khung nhìn:
1 Khởi tạo một đối tượng Shape mà biểu diễn vùng muốn tạo bóng.
2 Gọi phương thức Graphics2D.setClip để sử dụng đối tuợng shape như là
một khung nhìn cho ngữ cảnh Graphics2D
Để thu hẹp khung nhìn:
1 Khởi tạo đối tượng Shape mà giao với khung hnìn hiện tại.
2 Gọi phương thức clip để thay đổi khung nhìn cho phần giao nhau của
khung nhìn hiện tại và đối tượng Shape mới.
Trong ví dụ cho sau đây, một khung nhìn được tạo ra từ một elip và sau đó được
thay đổi băng cách gọi phương thức clip.
public void paint(Graphics g) {
Trang 31// Change the clipping path, setting it to the intersection of
// the current clip and a new rectangle.
Rectangle r = new Rectangle(w/4+10,h/4+10,w/2-20,h/2-20);
2.3.5 Setting the Graphics2D Transform
Để biến đổi đối tượng Shape,xâu văn bản, hay ảnh cần phải thêm vào một phép biến đổi mới AffineTransform cho đường ống phép biến đổi tronh ngữ cảnh của
Graphics2D trước khi tạo bóng phép biến đổi được áp dụng khi đối tượng đồ họa
được tạo bóng
Ví dụ để vẽ một hình chữ nhật nghiêng 45 độ:
1 Lấy một phép biến đổi Graphics2D trước khi thực hiện bất kì phép biến
đổi nào Luôn gọi phương thức getTransform trong đối tượng
Graphics2D trước khi thêm vào một phép biến đổi cho ngữ cảnh đồ họa
bởi vì ngữ cảnh đồ họa có thể đã tồn tại một phép biến đổi cho một lí dokhác ,định vị Swing và các thành phần trong một cửa sổ
2 Lấy phép quay bằng cách gọi AffineTransform getRotateinstance.
3 Gọi phương thức Graphics2D.transform để thêm vào các phép biến đổi
mới cho đường ống biến đổi Không được sử dụng phương thức
setTransform để thêm một phép biến đổi tọa độ mới,bởi vì setTransform
sẽ ghi đè lên phép biến đổi hiện tại trong ngữ cảnh đồ họa
1 4.Tạo đối tượng Rectangle2D.Float
4 Gọi phươn thức Graphics2D.draw để tạo bóng hình chữ nhật.
5 Sau khi tạo bóng cho hình chữ nhật đã được biến đổi , thì reset phép biến
đổi của Graphics2D trở về phép biến đổi ban đầu mà đã lưu trong bước 1
bằng cách gọi phương thức setTransform cho phép biến đổi ban đầu
Trong ví dụ sau đây, một thể hiện của AffineTransform được sử dụng để quay
hình chữ nhật đi 45 độ khi nó được tạo bóng
Còn trong ví dụ này,một đối tượng AffineTransform được sử dụng để quay các
câu text xung quang một điểm trung tâm
// Define the rendering transform
AffineTransform at = new AffineTransform();
Trang 32// Apply a translation transform to make room for the
Có thể biến đổi ảnh trong cách tương tự -phép biến đổi trong ngữ cảnh
Graphics2D được áp dụng trong quá trình tạo bóng mà không cần quan tâm đến kiểu
đối tượng đồ hạo đang được tạo bóng
Để áp dụng phép biến đổi cho ảnh mà không cần thay đổi phép biến đổi trong ngữ
cảnh Graphics2D , thì chuyển AffineTransform sang drawimage:
AffineTransform rotate45 =
AffineTransform.getRotateinstance(Math.Pi/4.0,0.0,0.0)
g2.drawimage(myimage, rotate45);
Các phép biến đổi cũng được áp dụng cho đối tượng Font để tạo ra một kiểu
2.3.6 Specifying a Composition Style
Một đối tượng AlphaComposite chứa các luật kết hợp để xác định các màu sẽ
được tạo bóng như thế nào khi đối tượng nàu đè lên đối tượng khác Để xác định các
kiểu kết hợp cho ngữ cảnh Graphics2D , cần tạo một đối tượng AlphaComposite và chuyền nó vào phương thức setComposite Kiểu thông dụng nhất là SRC_OVER.
2.3.6.1 Using the Source Over Compositing Rule
Luật kết hợp SRC_OVER sẽ kết hợp các điểm ảnh nguồn (source pixel) với cácđiểm ảnh đích (destination pixel) Ví dụ ,nếu tạo bóng một hình chữ nhật màu xanhnước biển (blue) và sau đó tạo bóng một hình chữ nhật màu đỏ mà đè lên một phầncủa hình chữ nhật kia,thì vùng giao nhau đó sẽ có màu đỏ Hay nói cách khác ,đốitương mà được tạo bóng cuối cùng sẽ xuất hiện ở trên cùng
Trang 332.3.6.2 Increasing the Transparency of Composited Objects
AlphaComposite cho phép xác định một giá trị hằng số alpha thêm vào mà được
nhân với giá trị alpha của các điểm ảnh nguồn để tăng độ trong suốt
Ví dụ ,để khởi tạo một đối tượng AlphaComposite mà tạo bóng đối tượng nguồn có
độ trong suốt là 50% ,xác định một giá trị alpha là 5:
2.4 Rendering Graphics Primitives
Graphics2D cung cấp các phương thưc tạo bóng cho các cơ sở đồ họa như Shapes, Text, và images:
• draw—tạo nét cho đường viền của đối tựợng Shape bằng cách sử dụng các đối
tượng Stroke và Paint trong ngữ cảnh Graphics2D
• fill—tô một đối tượng Shape bằng cách sử dụng đối tượng Paint trong ngữ cảnh
Graphics2D
• drawString—tạo bóng các xâu văn bản đã dược xác định bằng cách sư dụng đối
tượng Paint trong ngữ cảnh Graphics2D
• drawimage—tạo bóng các ảnh đã được xác định
2.4.1 Drawing a Shape
Đường biên của bất kì đối tượng Shape cũng được tạo bóng bằng phương thức
Graphics2D.draw.
Phương thức vẽ từ các phiên bản trước cũng được hỗ trợ : drawLine, drawRect,
drawRoundRect, drawOval, drawArc,drawPolyline, drawPolygon, draw3DRect.
Trang 34Khi một đối tượng Shape được vẽ , thì đường biên của nó sẽ được tạo nét bằng đối tượng Stroke trong ngữ cảnh Graphics2D
Bằng việc thiét lập đối tượng BasicStroke phù hợp trong ngữ cảnh Graphics2D
,thò có thể vẽ đường thẳng với độ rộng và mẫu nét gạch bất kì Đối tượng
BasicStroke cũng định nghĩa các thuộc tính endcap và join của đường thẳng
Để tạo bóng cho các đường biên của đối tượng shape:
1 Khởi tạo cho đối tượng BasicStroke
2 Gọi phương thức Graphics2D.setStroke
3 Khởi tạo cho đối tượng Shape.
4 Gọi phương thức Graphics2D.draw(shape).
Trong ví dụ sau,đối tượng GeneralPath được sử dụng để định nghĩa một ngôi sao và một đối tượng BasicStroke được thêm vào ngữ cảnh Graphics2D để định
nghĩa cho các cạnh của ngôi sao với các thuộc tính join
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
// create and set the stroke g2.setStroke(new BasicStroke(4.0f));
// Create a star using a general path object
GeneralPath p = new GeneralPath(GeneralPath.NON_ZERO);
Phương thức Graphics2D.fill có thể được sử dụng để tô bất kì đối tượng Shape.
Khi một đối tượng Shape được tô, thì phần bị giới hạn bởi đương bao của đối tượng
sẽ được tạo bóng với ngữ cảnh Graphics2D của thuộc tính Paint attribute—như
Color, TexturePaint, or GradientPaint.
Phương thức tô từ các phiên bản trước đó của phần mềm JDK cũng được hỗ trợ:
fillRect, fill3DRect, fillRoundRect, fillOval, fillArc, fillPolygon,clearRect.
Để tô một đối tượng Shape:
1 Xác định màu tô và kiểu tô trong ngữ cảnh đồ họa bằng cách sử dụng
Graphics2D.setColor hay Graphics2D.setPaint.
1 Khởi tạo đối tượng Shape.
2 Gọi phương thức Graphics2D.fill để tạo bóng đối tựơng Shape.
Trong ví dụ sau đây ,phương thức setColor được gọi để định nghĩa màu tô là
green fill cho một đối tượng Rectangle2D.
Trang 35public void paint(Graphics g) {
2.5 Defining Custom Composition Rules
Có thể tạo một kiểu mới hoàn toàn của phép kết hợp băng cách thực thi các
interface Composite và CompositeContext Một đối tượng Composite cung cấp một đối tượng CompositeContext mà thực chất là lưu trạng thái và thưc hiện công việc kết hợp Nhiều đối tượng CompositeContext có thể được tạo từ một đối tượng
Composite để lưu các trạng thái riêng biệt trong môi trường đa luồng (multithreaded
environment.)
2.6 Rendering in a Multi-Screen Environment
TrongJavaTM 2 SDK, version 1.3, Java 2DTM API hỗ trợ những cấu hình đamàn hiển thi khác nhau mà có thể được cấu hình bởi một môi trường mà :
• Có hai hoặc nhiều màn hình độc lập
• Có hai hoặc nhiều màn hình nơi chỉ có một màn hình chính và các màn hiểnthị khác sẽ copy những hình ảnh xuát hiện trên màn hình chính
• Hai hoặc nhiều màn hình mà có dạng như một máy ảo và nó cho phép gọicác thiết bị ảo
Java 2D API cho phép tạo các đối tượng Frame, JFrame, Window, hoặc
Jwindow Với một đối tượng GraphicsConfiguration để xác định các thiết bị hiển
thị cho quá trình tạo bóng Trong cả ba cấu hình,mỗi thiết bị hiển thị được biểu diễn
bởi một đối tượng GraphicsDevice.Một đối tượng GraphicsDevice có nhiều đối tượng GraphicsConfiguration kết hợp với nó
Khi hai hoặc nhiều màn hình được sử dụng để tạo một thiết bị ảo ,hệ tọa độ ảo(mà tồn tại độc lập với thiết bị hiển thị vật lý )được sử dụng để biểu diễn thiết bị ảo đó
Các biên cảu mỗi đối tượng GraphicsConfiguration trong cấu hình đa màn hiển thị
có quan hệ với hệ tọa độ ảo Một màn hiển thị trong môi trường này được xác địnhnhư là màn hiển thị chính và tạ vị trí (0, 0) của hệ tọa độ ảo Dựa trên vị trí của mànhiển thị chính ,thiết bị ảo có thể có tọa độ âm ,như trong hình 2-10:
Trang 36Để xác định nếu là môi trường thiết bị ảo nơi mà một đối tượng Window
hay Frame có thể xuất hiện trên hai hay nhiều màn hình vật lý ,thì gọi phương thức
getBounds trên mỗi đối tượng GraphicsConfiguration trong hệ thống và kiểm tra
nếu gốc tọa độ khác vị trí (0, 0) Phương thức getBounds của đối tượng
GraphicsConfiguration trả về một đối tượng hình Rectangle trong hệ tọa độ ảo Vì
vậy ,nếu một gốc tọa độ không phải vị trí (0, 0), thì môi trường đó chính là môi trườngảo
Trong môi trường thiết bị ảo ,các tọa độ của các đối tượng
GraphicsConfiguration có quan hệ với hệ tọa độ ảo Vì vậy, phải sử dụng tọa độ ảo
khi gọi phương thức setLocation của đối tượng Frame hay Window Cho ví dụ,Đoạn
mã này sẽ lấy đường bao của một đối tượng GraphicsConfiguration và sử dụng các đường bao để thiết lập vị trí của đối tượng Frame tại tọa độ (10, 10) trong hệ tọa độ
của màn hiển thị vật lý
Frame f = new Frame(GraphicsConfiguration gc);
Rectangle bounds = gc.getBounds();
f.setLocation(10 + bounds.x, 10 + bounds.y);
Nếu các đường bao của đối tượng GraphicsConfiguration không được tính đến , thì đối tượng Frame được hiển thị tại vị trí (10, 10) trên mà hình vật lý chính , điều này có thể khác với mà hình vật lý của đối tượng GraphicsConfiguration đã được
xác định
Phương thức getBounds có thể được sử dụng để xác định các đường biên cảu thiết
bị ảo Gọi phương thức getBounds trên mỗi đối tượng GraphicsConfiguration trong
hệ thống Để xác dịnh các đường bao cảu thiết bị ảo , tính toán sự kết hợp của cácđường bao Kĩ thuật này được sử dụng trong ví dụ sau
Rectangle virtualBounds = new Rectangle();
Trang 37virtualBounds = virtualBounds.union(gc[i].getBounds());
}
}
Applet sau sẽ tạo một đối tượng JFrame với mỗi đối tượng
GraphicsConfiguration của mỗi đối tượng GraphicsDevice trong đối tượng GraphicsEnvironment Mỗi đối tượng JFrame hiển thị một tập các vạch đỏ, xanh
đậm ,xanh nhạt,số lượng các màn hiển thị số lượng các đối tượng
GraphicsConfiguration và các đường bao cuả đối tượng GraphicsConfiguration.
Đoạn mã sau phải được chạy với JavaTM 2 SDK, version 1.3 hoặc cao hơn
static JComboBox primitive, line, paint, trans, stroke;
JButton redraw;
public static boolean no2D = false;
public void init() {
GridBagLayout layOut = new GridBagLayout();
Trang 38transLabel = new JLabel();
transLabel.setText("Các phép biến đổi");
Trang 39trans = new JComboBox(new Object[] { "identity", "Quay", "Tỉ lệ",
stroke = new JComboBox(new Object[] { "Đường nét", "Tô đầy",
"Đường nét va Tô đầy" });
public static void main(String[] argv) {
if (argv.length > 0 && argv[0].equals("-no2d")) {
Transform.no2D = true;
} JFrame frame = new JFrame("Các phép chuyển đổi");
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
} });
JApplet applet = new Transform();
frame.getContentPane().add(BorderLayout.CENTER, applet);
applet.init();
Trang 40class TransPanel extends JPanel {
AffineTransform at = new AffineTransform();
shapes[0] = new Rectangle(0, 0, 100, 100);
shapes[1] = new Ellipse2D.Double(0.0, 0.0, 100.0, 100.0);
TextLayout textTl = new TextLayout("Brother Hood", new Font("Tomaha",
1, 76), new FontRenderContext(null, false, false));
AffineTransform textAt = new AffineTransform();
textAt.translate(0, (float) textTl.getBounds().getHeight()); shapes[2] = textTl.getOutline(textAt);
}
public void setTrans(int transindex) {
switch (transindex) { case 0:
public void renderShape() {