TÍNH DIỆN TÍCH ĐA GIÁC KHÔNG TỰ CẮT
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
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)
Hình trên chỉ ra cách tính theo các bước sau ([2]):
- 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.
- Kết hợp hai hàng đầu tiên bằng cách:
- Nhân hàng thứ nhất x với hàng thứ hai y. (màu đỏ)
- Nhân hàng đầu tiên y với hàng thứ hai x (xanh lam)
- Lấy tích thứ nhất trừ đi tích thứ hai.
- 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.
- Cộng các kết quả này, lấy trị tuyệt đối và chia cho hai.
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
[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
Đăng nhận xét