Java: Tạo hình dạng 2 chiều (2D)


Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên

Trong bài học trước, chúng ta đã thấy ứng dụng cơ bản của JavaFX, nơi chúng ta đã học cách tạo một cửa sổ trống và cách vẽ một đường thẳng trên mặt phẳng XY của JavaFX. Ngoài đường thẳng, chúng ta cũng có thể vẽ một số hình dạng 2D khác.

Hình dạng 2D

Nói chung, hình dạng 2D là hình dạng hình học có thể được vẽ trên mặt phẳng XY, bao gồm Đường thẳng, Hình chữ nhật, Hình tròn, v.v.

Sử dụng thư viện JavaFX, bạn có thể vẽ:

  • Các hình dạng xác định trước như Đường thẳng, Hình chữ nhật, Hình tròn, Hình elip, Đa giác, Đường đa giác, Đường cong khối, Đường cong tứ giác, Vòng cung.
  • Các phần tử đường dẫn như Phần tử đường dẫn MoveTO, Đường thẳng, Đường ngang, Đường thẳng đứng, Đường cong khối, Đường cong bậc hai, Vòng cung.
  • Ngoài ra, bạn cũng có thể vẽ hình dạng 2D bằng cách phân tích cú pháp đường dẫn SVG.

Mỗi hình dạng 2D được đề cập ở trên được đại diện bởi một lớp và tất cả các lớp này thuộc về gói javafx.scene.shape. Lớp có tên Shape là lớp cơ sở của tất cả các hình dạng 2 chiều (2D) trong JavaFX.

Tạo hình dạng 2D

Để tạo biểu đồ, bạn cần:

  • Khởi tạo lớp tương ứng của hình dạng yêu cầu.
  • Đặt các thuộc tính của hình dạng.
  • Thêm đối tượng hình dạng vào nhóm.

Khởi tạo lớp tương ứng

Để tạo một hình dạng 2D, trước hết bạn cần khởi tạo lớp tương ứng của nó.

Ví dụ, nếu bạn muốn tạo một đoạn thẳng, bạn cần khởi tạo lớp có tên Line như sau:

Line line = new Line();

Đặt thuộc tính của hình dạng

Sau khi khởi tạo lớp, bạn cần thiết lập các thuộc tính cho hình dạng bằng các phương thức setter.

Ví dụ, để vẽ một đoạn thẳng, bạn cần chuyển tọa độ x và y của nó của điểm đầu và điểm cuối của đoạn thẳng. Bạn có thể chỉ định các giá trị này bằng cách sử dụng các phương thức setter tương ứng của chúng như sau:

//Setting the Properties of the Line 
line.setStartX(150.0f); 
line.setStartY(140.0f);         
line.setEndX(450.0f); 
line.setEndY(140.0f);

Thêm đối tượng hình dạng vào group

Cuối cùng, bạn cần thêm đối tượng của shape vào group bằng cách truyền nó dưới dạng tham số của hàm tạo như sau:

//Creating a Group object  
Group root = new Group(line);

Bảng sau cung cấp cho bạn danh sách các hình dạng (lớp) khác nhau được cung cấp bởi JavaFX.

Hình dạng và Mô tả
Line

Một đường là một cấu trúc hình học nối hai điểm. Lớp Line của gói javafx.scene.shape đại diện cho một đường trong mặt phẳng XY.

Rectangle

Nói chung, hình chữ nhật là một đa giác có bốn cạnh, có hai cặp cạnh đối song song và đồng quy với tất cả các góc trong là góc vuông. Trong JavaFX, một Hình chữ nhật được đại diện bởi một lớp có tên Rectangle. Lớp này thuộc về gói javafx.scene.shape.

Rounded Rectangle

Trong JavaFX, bạn có thể vẽ một hình chữ nhật với các cạnh sắc nét hoặc với các cạnh hình vòm và Hình có các cạnh hình vòm được gọi là hình chữ nhật tròn.

Circle

Đường tròn là một đường tạo thành một vòng khép kín, mọi điểm trên đó cách tâm một khoảng cố định. Trong JavaFX, một vòng kết nối được đại diện bởi một lớp có tên Circle. Lớp này thuộc về gói javafx.scene.shape.

Ellipse

Một hình elip được xác định bởi hai điểm, mỗi điểm được gọi là tiêu điểm. Nếu lấy bất kỳ điểm nào trên elip thì tổng khoảng cách đến các điểm lấy nét là không đổi. Kích thước của hình elip được xác định bằng tổng của hai khoảng cách này.

Trong JavaFX, một hình elip được đại diện bởi một lớp có tên là Ellipse. Lớp này thuộc về gói javafx.scene.shape.

Polygon

Một hình dạng khép kín được tạo thành bởi một số đoạn đường đồng phẳng được kết nối từ đầu đến cuối. Trong JavaFX, một đa giác được đại diện bởi một lớp có tên Polygon. Lớp này thuộc về gói javafx.scene.shape.

Polyline

Một đa giác là một đường liên tục bao gồm nhiều đoạn thẳng. Trong JavaFX, một Polyline được đại diện bởi một lớp có tên là Polygon. Lớp này thuộc về gói javafx.scene.shape.

Cubic Curve

Đường cong hình khối là đường cong tham số Bezier trong mặt phẳng XY là đường cong bậc 3. Trong JavaFX, Đường cong khối được biểu diễn bởi một lớp có tên là CubicCurve. Lớp này thuộc về gói javafx.scene.shape.

QuadCurve

Đường cong bậc hai là đường cong tham số Bezier trong mặt phẳng XY là đường cong bậc 2. Trong JavaFX, QuadCurve được đại diện bởi một lớp có tên là QuadCurve. Lớp này thuộc về gói javafx.scene.shape.

Arc

Cung là một phần của đường cong. Trong JavaFX, một cung được đại diện bởi một lớp có tên là Arc. Lớp này thuộc về gói javafx.scene.shape.

Chúng ta có thể vẽ ba loại cung là Mở (Open), Đóng (Closed), Vòng (Round).

SVGPath

Trong JavaFX, chúng ta có thể tạo hình ảnh bằng cách phân tích cú pháp các đường dẫn SVG. Các hình dạng như vậy được đại diện bởi lớp có tên SVGPath. Lớp này thuộc về gói javafx.scene.shape. Lớp này có một thuộc tính có tên là nội dung của kiểu dữ liệu String. Điều này đại diện cho chuỗi được mã hóa Đường dẫn SVG, từ đó hình ảnh sẽ được vẽ.

Vẽ thêm hình dạng thông qua lớp Path

Trong phần trước, chúng ta đã biết cách vẽ một số hình dạng đơn giản được xác định trước bằng cách khởi tạo các lớp và thiết lập các tham số tương ứng.

Tuy nhiên, chỉ những hình dạng được xác định trước này không đủ để tạo ra các hình phức tạp hơn ngoài các hình dạng ban đầu được cung cấp bởi gói javafx.shape.

Ví dụ, nếu bạn muốn vẽ một phần tử đồ họa như dưới đây, bạn không thể dựa vào những hình dạng đơn giản đó.

Lớp Path

Lớp Path

Để vẽ các cấu trúc phức tạp như vậy JavaFX cung cấp một lớp có tên là Path. Lớp này đại diện cho đường viền hình học của một hình dạng.

Nó được đính kèm với một danh sách có thể quan sát được chứa các Phần tử Đường dẫn khác nhau như moveTo, LineTo, HlineTo, VlineTo, ArcTo, QuadCurveTo, CubicCurveTo.

Khi khởi tạo, lớp này xây dựng một đường dẫn dựa trên các phần tử đường dẫn đã cho.

Bạn có thể truyền các phần tử đường dẫn đến lớp này trong khi khởi tạo nó như sau:

Path myshape = new Path(pathElement1, pathElement2, pathElement3);

Hoặc, bạn có thể lấy danh sách có thể quan sát và thêm tất cả các phần tử đường dẫn bằng phương thức addAll() như sau:

Path myshape = new Path(); 
myshape.getElements().addAll(pathElement1, pathElement2, pathElement3); 

Bạn cũng có thể thêm các phần tử riêng lẻ bằng cách sử dụng phương thức add() như sau:

Path myshape = new Path();
myshape.getElements().add(pathElement1);

Di chuyển đến phần tử Đường dẫn

Phần tử đường dẫn MoveTo được sử dụng để di chuyển vị trí hiện tại của đường dẫn đến một điểm xác định. Nó thường được sử dụng để thiết lập điểm bắt đầu của một hình dạng được vẽ bằng cách sử dụng các phần tử đường dẫn.

Nó được đại diện bởi một lớp có tên LineTo của gói javafx.scene.shape. Nó có 2 thuộc tính của kiểu dữ liệu kép là:

  • X - Tọa độ x của điểm mà một đường sẽ được vẽ từ vị trí hiện tại.
  • Y - Tọa độ y của điểm mà một đường sẽ được vẽ từ vị trí hiện tại.

Bạn có thể tạo phần tử di chuyển đến đường dẫn bằng cách khởi tạo lớp MoveTo và chuyển tọa độ x, y của điểm mới như sau:

MoveTo moveTo = new MoveTo(x, y);

Nếu bạn không truyền bất kỳ giá trị nào cho hàm tạo, thì điểm mới sẽ được đặt thành (0,0).

Bạn cũng có thể đặt các giá trị thành tọa độ x, y, bằng cách sử dụng các phương thức setter tương ứng của chúng như sau:

setX(value); 
setY(value); 

Ví dụ - Vẽ một đường phức tạp

Trong ví dụ này, chúng ta sẽ chỉ ra cách vẽ hình dạng sau bằng cách sử dụng các lớp Path, MoveTo và Line.

Lớp Path

Lưu mã sau trong một tệp với tên ComplexShape.java.

package sample;

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.scene.shape.LineTo;
import javafx.scene.shape.MoveTo;
import javafx.scene.shape.Path;

public class ComplexShape extends Application {
  @Override
  public void start(Stage stage) {
    //Creating a Path
    Path path = new Path();

    //Moving to the starting point
    MoveTo moveTo = new MoveTo(108, 71);

    //Creating 1st line
    LineTo line1 = new LineTo(321, 161);

    //Creating 2nd line
    LineTo line2 = new LineTo(126, 232);

    //Creating 3rd line
    LineTo line3 = new LineTo(232, 52);

    //Creating 4th line
    LineTo line4 = new LineTo(269, 250);

    //Creating 4th line
    LineTo line5 = new LineTo(108, 71);

    //Adding all the elements to the path
    path.getElements().add(moveTo);
    path.getElements().addAll(line1, line2, line3, line4, line5);

    //Creating a Group object
    Group root = new Group(path);

    //Creating a scene object
    Scene scene = new Scene(root, 600, 300);

    //Setting title to the Stage
    stage.setTitle("Drawing an arc through a path");

    //Adding scene to the stage
    stage.setScene(scene);

    //Displaying the contents of the stage
    stage.show();
  }

  public static void main(String args[]) {
    launch(args);
  }
}

Biên dịch và thực thi tệp java đã lưu từ dấu nhắc lệnh bằng các lệnh sau.

javac ComplexShape.java 
java ComplexShape

Khi thực thi, chương trình trên tạo ra một cửa sổ JavaFX hiển thị một cung tròn, được vẽ từ vị trí hiện tại đến điểm được chỉ định như hình dưới đây:

Vẽ vòng cung qua đường dẫn

Sau đây là các phần tử (lớp) đường dẫn khác nhau được cung cấp bởi JavaFX. Các lớp này tồn tại trong gói javafx.shape. Tất cả các lớp này kế thừa lớp PathElement.

Hình dạng và Mô tả
LineTo

Phần tử đường dẫn line được sử dụng để vẽ một đường thẳng đến một điểm trong tọa độ xác định từ vị trí hiện tại. Nó được đại diện bởi một lớp có tên là LineTo. Lớp này thuộc về gói javafx.scene.shape.

HlineTo

Phần tử đường dẫn HLineTo được sử dụng để vẽ một đường ngang đến một điểm trong tọa độ xác định từ vị trí hiện tại. Nó được đại diện bởi một lớp có tên là HLineTo. Lớp này thuộc về gói javafx.scene.shape.

VLineTo

Phần tử đường thẳng đứng được sử dụng để vẽ một đường thẳng đứng đến một điểm trong tọa độ xác định từ vị trí hiện tại. Nó được đại diện bởi một lớp có tên là VLineTo. Lớp này thuộc về gói javafx.scene.shape.

QuadCurveTo

Phần tử đường dẫn QuadCurveTo được sử dụng để vẽ một đường cong bậc hai đến một điểm trong tọa độ xác định từ vị trí hiện tại. Nó được đại diện bởi một lớp có tên là QuadraticCurveTo. Lớp này thuộc về gói javafx.scene.shape.

CubicCurveTo

Phần tử đường dẫn CubicCurveTo được sử dụng để vẽ một đường cong hình khối đến một điểm trong tọa độ xác định từ vị trí hiện tại. Nó được đại diện bởi một lớp có tên là CubicCurveTo. Lớp này thuộc về gói javafx.scene.shape.

ArcTo

Phần tử đường dẫn Arc được sử dụng để vẽ một cung đến một điểm trong tọa độ xác định từ vị trí hiện tại. Nó được đại diện bởi một lớp có tên là ArcTo. Lớp này thuộc về gói javafx.scene.shape.

Thuộc tính của đối tượng 2D

Đối với tất cả các đối tượng 2D, bạn có thể đặt các thuộc tính khác nhau như tô màu, nét vẽ, StrokeType, v.v. Sau đây là một số các thuộc tính khác nhau của các đối tượng 2D:

Hoạt động trên các đối tượng 2D

Nếu chúng ta thêm nhiều hơn một hình vào một nhóm, hình đầu tiên sẽ được chồng lên bởi hình thứ hai như được hiển thị bên dưới.

Hoạt động trên các đối tượng 2D

Ngoài các phép biến đổi (xoay, chia tỷ lệ, dịch, v.v.), chuyển tiếp (hoạt ảnh), bạn cũng có thể thực hiện ba thao tác trên các đối tượng 2D là: Union, Subtraction và Intersection.

Thao tác và Mô tả
Thao tác Union

Thao tác này lấy hai hoặc nhiều hình dạng làm đầu vào và trả về khu vực bị chiếm bởi chúng.

Hoạt động Giao lộ

Thao tác này lấy hai hoặc nhiều hình dạng làm đầu vào và trả về vùng giao nhau giữa chúng.

Phép toán trừ

Thao tác này lấy hai hoặc nhiều hình dạng làm đầu vào. Sau đó, nó trả về diện tích của hình đầu tiên trừ diện tích bị hình thứ hai chồng lên.

» Tiếp: Vẽ đoạn thẳng 2D
« Trước: Cấu trúc ứng dụng JavaFX và ví dụ
Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên
Copied !!!