Tải bản đầy đủ (.doc) (571 trang)

lập trình đồ họa trên java 2d và 3d

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (3.5 MB, 571 trang )

Lập trình đồ họa trên Java 2D và 3D
Phần 1 9
Lập trình đồ họa với Java 2D 9
Chương 1 10
Tổng quan về Java 2D API 10
1.1 Enhanced Graphics, Text, and imaging 10
1.2 Rendering Model 11
1.2.1 Coordinate Systems 12
1.2.1.1 User Space 12
1.2.1.2 Device Space 13
1.2.2 Transforms 14
1.2.3 Fonts 15
1.2.4 Images 16
1.2.5 Fills and Strokes 17
1.2.6 Composites 18
Backward Compatibility and Platform independence 19
1.3.1 Backward Compatibility 19
1.3.2 Platform independence 21
1.4 The Java 2D™ API Packages 21
Chương 2: 25
Rendering with Graphics2D 25
2.1 Các lớp và giao diện 26
2.2 Rendering Concepts 27
2.2.1 Rendering Process 28
2.2.2 Controlling Rendering Quality 29
2.2.3 Stroke Attributes 31
2.2.4 Fill Attributes 32
Quá trình xử lý theo phiên 34
2.2.5 Clipping Paths 34
2.2.6 Transformations 35
2.2.6.1 Constructing an AffineTransform 37


2.2.7 Composite Attributes 38
2.2.7.1 Managing Transparency 39
2.2.7.2 Transparency and images 40
2.3 Thiết lập Graphics2Context 40
2.3.1 Setting Rendering Hints 40
2.3.2 Specifying Stroke Attributes 41
2.3.2.1 Setting the Stroke Width 41
2.3.2.2 Specifying Join and Endcap Styles 42
2.3.2.3 Setting the Dashing Pattern 42
2.3.3 Specifying Fill Attributes 44
2.3.3.1 Filling a Shape with a Gradient 44
2.3.3.2 Filling a Shape with a Texture 45
2.3.4 Setting the Clipping Path 46
2.3.5 Setting the Graphics2D Transform 48
2.3.6 Specifying a Composition Style 51
2.3.6.1 Using the Source Over Compositing Rule 51
2.3.6.2 Increasing the Transparency of Composited Objects 52
2.4 Rendering Graphics Primitives 53
2.4.1 Drawing a Shape 54
2.4.2 Filling a Shape 55

1
Lập trình đồ họa trên Java 2D và 3D
2.4.3 Rendering Text 57
2.4.4 Rendering images 57
2.5 Defining Custom Composition Rules 57
2.6 Rendering in a Multi-Screen Environment 57
Chương 3 76
Các đối tượng hình họa 76
3.1 Giao diện và lớp 76

3.2 Các khái niệm hình học: 79
3.2.1 Constructive Area Geometry 80
3.2.2 Bounds and Hit Testing 81
3.3 Combining Areas to Create New Shapes 89
Chương 4: 95
Hiển thị Font và văn bản 95
4.1.Giao diện và lớp 95
4.2.Các khái niệm về Font 97
4.3 Các khái niệm về Text Layout 99
4.3.1 Vẽ chữ 100
4.3.2 Ordering Text 102
4.3.3 Đo và định vị văn bản 104
4.3.4 Hỗ trợ thao tác với văn bản 105
4.3.4.1 Hiển thị dấu nhắc 105
4.3.4.2 Di chuyển dấu nhắc 107
4.3.4.3 Hit Testing 108
4.3.4.4 Đánh dấu vùng lựa chọn 109
4.3.5 Thực thi việc hiển thị văn bản trong ứng dụng Java™ 110
Quản lý việc hiển thị văn bản 111
4.4.1 Trình bày văn bản 112
Hiển thị dấu nhắc kép 113
4.4.3 Di chuyển dấu nhắc 114
4.4.4 Hit Testing 115
4.4.5 Đánh dấu vùng lựa chọn 116
4.4.6 Querying Layout Metrics 116
4.4.7 Vẽ văn bản trên nhiều dòng 117
Chương 5 127
Tạo ảnh 127
5.1 Các giao diện và các lớp 127
5.1.1 Các giao diện imaging (imaging interfaces) 128

5.1.2 Các lớp dữ liệu ảnh(image Data Classes) 128
5.1.3 image Operation Classes 130
5.1.4 Sample Model Classes 131
Color Model Classes 132
5.1.6 Exception Classes 133
5.2 Immediate Mode imaging Concepts 134
5.2.1 Terminology 136
5.3 Using Bufferedimages 137
5.3.1 Creating a Bufferedimage 137
5.3.2 Drawing in an Offscreen Buffer 138
5.3.2.1 Creating an Offscreen Buffer 139
5.3.2.2 Drawing in an Offscreen Buffer 141
5.3.3 Manipulating Bufferedimage Data Directly 142

2
Lập trình đồ họa trên Java 2D và 3D
5.3.4 Filtering a Bufferedimage 143
5.3.5 Rendering a Bufferedimage 143
5.4 Managing and Manipulating Rasters 151
5.4.1 Creating a Raster 151
5.4.2 Parent and Child Rasters 152
5.4.4 The WritableRaster Subclass 152
5.5 Image Data and DataBuffers 153
5.6 Extracting Pixel Data from a SampleModel 154
5.7 ColorModels and Color Data 155
5.7.1 Lookup Table 156
5.8 image Processing and Enhancement 156
5.8.1 Using an image Processing Operation 159
Chương 6 163
Mầu sắc 163

6.1 Các lớp 164
6.2 Những định nghĩa về mầu sắc 164
6.2.1 Không gian mầu 165
6.2.1 Biểu diễn màu 168
Chương 7 172
In ấn 172
7.1 Các giao diện và các lớp 172
7.2.1 Supporting Printing 175
7.2.1.1 Điều khiển in (Job Control) 175
7.2.2 Page Painters 176
7.2.3 Printable Jobs and Pageable Jobs 178
7.2.4 Typical Life-Cycle of a PrinterJob 179
7.3 Printing with Printables 182
7.3.2 Printing a File 186
7.4.1 Using a Pageable Job 192
7.4.2 Using Multiple Page Painters 194
Phần 2 207
Lập trình đồ họa với Java 3D 207
CHƯƠNG 1 208
NHẬP MÔN LẬP TRÌNH TRÊN JAVA 3D 208
1.1 Tổng quan về Java 3D API ™ 208
1.2 Các vấn đề cơ bản về Java 3D API™ 209
1.3 Xây dựng đồ thị khung cảnh 209
1.3.1 Thừa kế cấp cao từ Java 3D API 215
1.4 Cách thức để viết một chương trình Java 3D 217
1.4.1 Công thức đơn giản để viết một chương trình Java 3D 217
1.5 Một vài thuật ngữ trong Java 3D 222
1.6 Ví dụ đơn giản: HelloJava3Da 224
1.6.1 Các lớp của Java 3D Classes được sử dụng trong HelloJava3Da 230
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 234

1.7 Quay hình lập phương 234
1.7.1 Sự kết hợp của các phép biến hình: HelloJava3Db 236
1.8 Khả năng và hoạt động 237
1.8.1 Dịch các nội dung 237
1.8.2 Khả năng 238
1.9 Thêm vào các hành vi animation 240

3
Lập trình đồ họa trên Java 2D và 3D
1.9.1 Định nghĩa các hành vi animation 241
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 242
1.9.3 Lập danh mục các vùng 243
1.9.4 Ví dụ về hành vi: HelloJava3Dc 244
1.9.5 Phép biến hình và kết hợp các hành vi .Ví dụ: HelloJava3Dd 247
CHƯƠNG 2 252
Tạo các hình 252
2.1 Hệ tọa độ thế giới ảo 252
2.2 Visual Object Definition Basics 253
2.2.1 An Instance of Shape3D Defines a Visual Object 253
2.2.2 Node Components 255
2.2.3 Defining Visual Object Classes 256
2.3 Các lớp tiện ích hình học 257
2.3.1 Box 258
2.3.2 Cone 260
2.3.3 Cylinder 260
2.3.4 Sphere 261
2.3.5 More About Geometric Primitives 262
2.3.6 ColorCube 262
2.3.7 Example: Creating a Simple Yo-Yo From Two Cones 262
2.4 Các lớp toán học 268

2.4.1 Point Classes 272
2.4.2 Color Classes 273
2.4.3 Vector Classes 275
2.4.4 TexCoord Classes 276
2.5 Các lớp hình học 276
2.5.1 GeometryArray Class 277
2.5.2 Subclasses of GeometryArray 285
2.5.3 Subclasses of GeometryStripArray 287
2.5.4 Subclasses of IndexedGeometryArray 293
2.5.5 Axis.java is an Example of IndexedGeometryArray 296
2.6 Appearance and Attributes 297
2.6.1 Appearance NodeComponent 298
2.6.2 Sharing NodeComponent Objects 299
2.6.3 Attribute Classes 299
2.6.4 Example: Back Face Culling 310
2.7 Bounds and Scope 320
2.7.1 Bounds Node Components 321
2.7.2 BoundingLeafa Node 325
2.7.3 Scope 328
2.8 Hình học nâng cao 329
2.8.1 Multiple Geometries in a Single Shape3D 330
2.8.2 GeometryArray 332
2.8.4 AlternateAppearance <new in 1.2> 340
2.9 Clipping – Cắt xén 343
2.9.1 View Defines a Frustum 343
2.9.2 Clip Node 345
2.9.4 ModelClip Example 346
CHƯƠNG 3 350
TẠO NỘI DUNG 350


4
Lập trình đồ họa trên Java 2D và 3D
3.1 Nội dung chính 350
3.1.1 GeometryInfo 351
3.2.1 Một ví dụ đơn giản về GeometryInfo 351
3.2.2 Sử dụng GeometryInfo 352
3.2.3 Một số lớp thông dụng có liên quan đến GeometryInfo 353
Loaders 358
Một ví dụ đơn giản sử dụng leader 359
Các loader phổ biến 360
3.3.3 Giao diện của gói Loader và lớp cơ sở 361
Viết một loader 365
Công việc của một loader 365
Hàm tạo lớp Loader 366
Viết một File Loader đơn giản 368
Text2D 379
3.5.1 Ví dụ Text2D đơn giản 379
3.5.2 Lớp Text2D 380
Text3D 382
Một ví dụ Text3D 382
Những lớp liên quan để tạo ra đối tượng Text3D 384
Nền không gian đồ họa 391
Một ví dụ background 391
Lớp Background 392
CHƯƠNG 4 396
TƯƠNG TÁC 396
4.1 Hành vi: Cơ sở của tương tác và hoạt hình 397
4.1.1 Ứng dụng của hành vi 397
4.1.2 Tổng quan lớp Behaviour 399
4.2 Cơ bản về hành vi 399

4.2.1 Viết một lớp Behaviour 400
4.2.2 Sử dụng một lớp Behaviour 405
4.2.3 Các hàm API trong lớp Behaviour 409
4.3 Điều kiện kích hoạt: Cách kích hoạt các hành vi 412
4.3.1 Điều kiện kích hoạt 413
4.3.2 WakeupCriterion 414
4.3.3 Quy định lớp WakeupCriterion 414
4.3.4 Thành phần của WakeupCondition 430
4.4 Lớp Behaviour tiện ích xử lý bàn phím 432
4.4.1 Một ví dụ đơn giản 433
4.4.2 Lớp KeyNavigatorBehaviour và KeyNavigator 435
4.5 Lớp tiện ích tương tác với chuột 437
4.5.1 Sử dụng lớp MouseBehaviour 437
4.5.2 Mouse Behaviour Foundation 442
4.5.3 Các lớp MouseBehaviour 444
4.5.4 Mouse Navigation 447
4.6 Picking Object 450
4.6.1 Using Picking Utility Classes 454
4.6.2 Các hàm API cơ bản trong các lớp Picking 458
4.6.3 Các lớp picking 467
4.6.4 Các lớp Picking Behavior 471
CHƯƠNG 5 474

5
Lập trình đồ họa trên Java 2D và 3D
Hoạt Hình 474
Animation - Hoạt hình: 476
Đối tượng Interpolator và Alpha với hoạt ảnh dựa thời gian 477
Alpha 477
Sử dụng các đối tượng Interpolator và Alpha: 480

Ví dụ sử dụng lớp Alpha và RotationInterpolator: 480
Alpha API: 486
Các lớp hành vi Interpolator : 489
Core Interpolator API: 504
Các lớp đối tượng nội suy đường: 513
Lớp Billboard : 522
Sử dụng đối tượng Billboard 523
Chương trình ví dụ sử dụng Billboard 525
Giao diện lập trình ứng dụng của Billboard (Billboard API) 529
OrientedShape3D 531
Giao diện lập trình ứng dụng của OrientedShape3D 532
Ví dụ sử dụng OrientedShape3D 533
Hoạt ảnh mức chi tiết (Level Of Detail Animations) 535
Sử dụng đối tượng DistanceLOD 536
Các lỗi thường gặp khi sử dụng LOD 537
Ví dụ sử dụng DistanceLOD 537
Giao diện lập trình ứng dụng DistanceLOD API 544
Morph 545
Sử dụng đối tượng Morph 546
Ví dụ sử dụng Morph 547
Giao diện lập trình ứng dụng Morph API 553
Giao diện GeometryUpdater 554
Sử dụng GeometryUpdater 555
Chương trình ví dụ hệ thống phân tử đài phun nước sử dụng GeometryUpdater
556
Lời nói đầu
Sự phát triển của khoa học, kĩ thuật, nghệ thuật, kinh doanh, và
công nghệ luôn luôn phụ thuộc vào khả năng truyền đạt thông tin của
chúng ta, hoặc thông qua các bit dữ liệu lưu trữ trong microchip hoặc
thông qua giao tiếp bằng tiế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 ảnh trong 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ên cứ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

6
Lập trình đồ họa trên Java 2D và 3D
máy tính, khả năng phát sinh hình ảnh bằng máy tính của chú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át triển
nhanh nhất của tin học. Ngay từ khi xuất hiện, đồ họa máy tính đã có sức
lô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ác nhau như công nghiệp, thương mại, quản lí, giáo dục, giải trí, … Số
lượng các chương trình đồ họa ứng dụng thật khổng lồ và phát triển liên
tục.Trong lĩnh vực công nghiệp,CAD(computer-aided design) đã được sử
dụng hầu hết trong việc thiết kế các cao ốc, ô tô, máy bay, tàu thủy, tàu vũ
trụ, máy tính,…Trong lĩ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ước hế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ất nhiề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ưng trên những thư viện đồ họa riêng,có những thế mạnh

riêng.Và khi nói về lập trình đồ họa,chúng ta không thể không nói đến
ngôn ngữ Java,một ngôn ngữ rất mạnh trong lĩnh vực này.Với mục đích
nghiên cứu,tìm hiểu và mang đến cho nhữ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âp trì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 đầu làm tài liệu tham khảo

7
Lập trình đồ họa trên Java 2D và 3D
nên chúng em không tránh khỏi sai sót.Chúng em mong thầy xem xét và
góp ý cho tài liệu này.Chúng em chân thành cảm ơn.

8
Lập trình đồ họa trên Java 2D và 3D
Phần 1
Lập trình đồ họa với Java 2D

9
Lập trình đồ họa trên Java 2D và 3D
Chươ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
Abstract Windowing 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ần mà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ép tạ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ện tạ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 Media APIs 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ưa trê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) đơn giả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

10
Lập trình đồ họa trên Java 2D và 3D
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ác rendering. 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ách cung 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ạng hì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à GeneralPath.

Thành phần màu sắc được cung cấp bởi các phương thức của lớp
Composite, ví dụ AlphaComposite.
Một kiểu Font chữ thì được định nghĩa bởi các collection của Glyphs.
1.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 đối tượng Graphics.
Trong Java 2D API, lớp Graphics2D mở rộng lớp Graphics để hỗ trợ
thêm nhiều thuộc tính đồ họa và cung cấp thêm các phương thức cho quá
trình tô trát.

11
Lập trình đồ họa trên Java 2D và 3D
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à cung cấ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 ứng dụ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 đa mà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 ứng dụ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ằng Java 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ữa khô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ất khá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 ứng dụng.
1.2.1.1 User Space
Hệ tọa độ này được chỉ ra trong hình 1-1.
(0,0)
x

12
Lập trình đồ họa trên Java 2D và 3D
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ác tọ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ông gian 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ương trình driver
của các thiết bị thực hiện điều này.
1.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 3 lớp :
• GraphicsEnvironment
• GraphicsDevice
• GraphicsConfiguration
Hai trong số chúng sẽ biểu diễn tất cả các thông tin cần thiết cho việc
xác định thiết bi tô trát và cho việc chuyển đổi tọa độ từ không gian người


13
Lập trình đồ họa trên Java 2D và 3D
sử dụng sang không gian thiết bị. Ứng dụng có thể truy cập thông tin này
nhưng không nhất thiết phải thực hiện bất kì phép chuyển đổi nào giũa hai
hệ tọa độchuyển .
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

14
Lập trình đồ họa trên Java 2D và 3D
,văn bản hay ảnh khi chú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ện khi 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ình dạ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ình dá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.
Mộ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 trong mộ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ột gia đì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ột dạ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 font riê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

15
Lập trình đồ họa trên Java 2D và 3D
môi trường đang xét không.Như để tương thí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ũng như 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 font thuộ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ạng củ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 đối tượ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 font chữ
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ễn luô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ơn sovớ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 cho kí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)

16
Lập trình đồ họa trên Java 2D và 3D
• 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ác thành phần màu đỏ là các daỉ màu trong ảnh RGB . Một
điểm ảnh trong ảnh dùng màu trự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ác mà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ác màu tương ứng
thông dịch.
Việ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ơn trong 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ẽn mà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ác glyph, 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

17
Lập trình đồ họa trên Java 2D và 3D
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ột kiể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ần phả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ác không gian màu khác nhau.

18
Lập trình đồ họa trên Java 2D và 3D
• 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ác gia 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.
Backward 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ăng cườ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ào cá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.
• paint

• paintAll
• update
• print

19
Lập trình đồ họa trên Java 2D và 3D
• printAll
• getGraphics
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) {
Graphics2D g2 = (Graphics2D) g;


g2.setTransform (t);
}
Trong môt vài trường hợp , hay đúng hơn là mở rộng một lớp thừa kế,
Java 2D API khái quat hóa nó. Có hai kĩ thuật đã được sử dụng để khái
quat hóa các lớp kế thừa:
• 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ác phươ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) cho lớ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ư:


20
Lập trình đồ họa trên Java 2D và 3D
Trong 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à Java 2D 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. Java 2D 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ương trì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 đường thẳ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:

21
Lập trình đồ họa trên Java 2D và 3D
• java.awt
• java.awt.geom

• java.awt.font
• java.awt.color
• java.awt.image
• java.awt.image.renderable
• java.awt.print
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ác lớp trong java.awt là các lớp của Java 2D )
Package java.awt.geom bao gồm các classe và interface có liên quan đến
việc định nghĩa các dạng hình học nguyên thủy:


22
Lập trình đồ họa trên Java 2D và 3D
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 gian màu và các mẫu màu:
Cá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.

23
Lập trình đồ họa trên Java 2D và 3D
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.

24
Lập trình đồ họa trên Java 2D và 3D
Chươ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.

25

×