TÍNH DIỆN TÍCH ĐA GIÁC KHÔNG TỰ CẮT

Trong chương trình môn Toán ở THPT,  ta đã học khái niệm tích vô hướng và tích có hướng của 2 vector. Ở chương trình Đại học, môn Đại số tuyến tính, ta cũng đã được tổng quát hoá khái niệm tích của 2 vector trong không gian Euclide. 
Ở đây nhắc lại khái niệm tích có hướng của 2 vector trong không gian 3 chiều và các ứng dụng cơ bản nhất của nó. [1]

1) TÍCH CÓ HƯỚNG CỦA HAI VECTƠ VÀ TÍNH CHẤT

tich-co-huong

2) CÁC CÔNG THỨC DIỆN TÍCH, THỂ TÍCH CÓ LIÊN QUAN ĐẾN TÍCH VÔ HƯỚNG, TÍCH CÓ HƯỚNG

cong-thuc-the-tich-dien-tich

3) DIỆN TÍCH CỦA TAM GIÁC ABC, VỚI A, B, C LÀ CÁC ĐIỂM TRÊN KHÔNG GIAN 2 CHIỀU

Giả sử A(xa, ya); B(xb, yb); C(xc, yc) là 3 điểm trong không gian 2 chiều. Hãy lập công thức tính diện tích tam giác ABC dựa trên các toạ độ của A, B, C ở trên.

Ta xem 3 điểm trên ở trong không gian 3 chiều, khi đó toạ độ của chúng sẽ là: 

A(xa, ya, 0); B(xb, yb, 0); C(xc, yc, 0)


4) DIỆN TÍCH CỦA 1 ĐA GIÁC KHÔNG TỰ CẮT, KHI BIẾT TOẠ ĐỘ CỦA CÁC ĐỈNH

Giả sử ta có đa giác với các toạ độ như trong hình vẽ sau:

Hình trên chỉ ra cách tính theo các bước sau ([2]):

  1. Lập bảng lưu tọa độ x, y của mỗi đỉnh. Bắt đầu từ 1 đỉnh bất kỳ nào đó (trong ví dụ trên là A) và đi vòng quanh đa giác theo một trong hai hướng thuận hay ngược chiều kim đồng hồ. Thêm đỉnh bắt đầu một lần nữa vào cuối. 
  2. Kết hợp hai hàng đầu tiên bằng cách:
    1. Nhân hàng thứ nhất x với hàng thứ hai y. (màu đỏ)
    2. Nhân hàng đầu tiên y với hàng thứ hai x (xanh lam)
    3. Lấy tích thứ nhất trừ đi tích thứ hai.
  3. Lặp lại điều này cho các hàng tiếp theo, hàng 2 và 3, sau đó đến hàng 3 và 4, v.v.
  4. Cộng các kết quả này, lấy trị tuyệt đối và chia cho hai.
5) TẠI SAO LẠI CÓ THUẬT TOÁN TRÊN VÀ VỚI ĐA GIÁC LÕM CÁCH TÍNH TRÊN CÓ ĐÚNG KHÔNG?

Trong mục 3, ta dễ thấy diện tích tam giác ABC theo công thức (*) sẽ được tính theo thuật toán, với các hàng trong bảng là các dữ liệu toạ độ của các đỉnh A, B, C.

Với 1 đa giác lồi bất kỳ, thì diện tích sẽ là tổng diện tích của các tam giác, nên cách tính trên cũng đúng.

Với đa giác lõm  
Không mất tính tổng quát, ta xét đa giác lõm ABCDE sau:


Diện tích của đa giác trên sẽ là tổng các diện tích của các tam giác: ABC + ACD + ADE

Để ý phần diện tích của đa giác này tính theo cách tính trên bị trùng lắp dư ra 2 lần đó là phần tô xanh AEK và phần tô đỏ AKD, được tính 2 lần, trong đó 1 lần âm và 1 lần dương (theo lưu ý của công thức (*) trong phần tính diện tích tam giác ABC ở mục 3 nói trên).

Nên SABCDE = SABC + SACD + SADE, và cách tính ở mục 4 vẫn đúng cho đa giác lõm.

Thuật toán ở mục 4, không đúng với đa giác tự cắt, chẳng hạn

 ----------------------------------------------------------------------------------------------

(Nhờ các bạn trẻ cài đặt thuật toán trên (với Python thì hay nữa), để minh hoạ và ứng dụng trong thực tiễn tính diện tích các mảnh ruộng cho các nhân viên địa chính khi đi đo đạc đất đai tại hiện trường. 
Mình cũng đã cài đặt thuật toán trên từ những năm 1997, khi mà AutoCad còn rất chưa phổ biến ở Việt Nam, và tất nhiên mạng Internet cũng vậy. Sau này thì CAD có thể tính được nhanh chóng bài toán này. Mình đã viết thành 1 phần mềm trên Visual Basic để có thể cài đặt có pass cho hoành tráng, giúp cho 1 anh bạn đi xin việc ở Sở Địa chính, khi đó anh ta chưa có vợ, đến nay đã nghỉ hưu sớm, có 2 con đều đã gần xong Đại học).  

[1]. https://www.mathvn.com/2016/04/tich-vo-huong-tich-co-huong-cua-hai.html

[2]. https://www.mathopenref.com/coordpolygonarea.html

---------------------------------------------

Hôm nay, nhờ Gemini viết chương trình trên Python, và code nó như này:

def tinh_dien_tich_da_giac(toado_dinh):

  """

  Tính diện tích của một đa giác không tự cắt, khi biết tọa độ của các đỉnh của đa giác.

  Tham số:

    toado_dinh: Danh sách tọa độ các đỉnh của đa giác, mỗi phần tử trong danh sách là một tuple (x, y).

  Trả về:

    Diện tích của đa giác, là một số thực.

  """

  if len(toado_dinh) < 3:

    raise ValueError("Cần ít nhất 3 đỉnh để tính diện tích đa giác.")

  # Tạo bảng lưu tọa độ x, y của mỗi đỉnh

  bang_toa_do = [[diem[0], diem[1]] for diem in toado_dinh]

  # Thêm đỉnh bắt đầu vào cuối bảng

  bang_toa_do.append(bang_toa_do[0])

  # Khởi tạo biến tích lũy kế

  tich_luy_ke = 0

  # Lặp qua các hàng trong bảng

  for i in range(len(bang_toa_do) - 1):

    hang_1 = bang_toa_do[i]

    hang_2 = bang_toa_do[i + 1]

    # Tính tích đỏ và tích xanh

    tich_do = hang_1[0] * hang_2[1]

    tich_xanh = hang_1[1] * hang_2[0]

    # Cộng tích lũy kế

    tich_luy_ke += tich_do - tich_xanh

  # Lấy trị tuyệt đối và chia cho 2

  dien_tich = abs(tich_luy_ke) / 2

  return dien_tich


# Ví dụ sử dụng

toado_dinh = [(0, 0), (3, 4), (5, 2), (2, 1)]

dien_tich = tinh_dien_tich_da_giac(toado_dinh)

print("Diện tích đa giác:", dien_tich)


Nhận xét

Bài đăng phổ biến từ blog này

Bài 11: Đánh giá chéo K-Fold

Bài 1, 2. Học máy theo cách tiếp cận thống kê và minh hoạ với Python