Thuật toán tìm trọng tâm của tứ giác

Vậy bạn chứng minh xem sao. Toán không có nói trống không vậy được, mà sao chúng tôi phải tin bạn?

[spoiler]Bởi vì có hai ba người đang dùng GA + GB + GC + GD, nhưng đó là một sự tổng quát hóa sai lầm.[/spoiler]

2 Likes

đây là công thức tính trọng tâm của một mặt cắt ngang hình học bất kỳ, ở đây trường hợp cụ thể là tứ giác nên đơn giản hơn rất nhiều, đây là 1 nội dung nhỏ trong phần tính momen quán tính của bộ môn sức bền vật liệu của ngành xây dựng, vì trước đây mình học xây dựng nên biết công thức này, còn muốn chứng minh bạn tìm tài liệu sức bền để xem, bạn có thể xem lại công thức ở slide 23/41 https://www.slideshare.net/lntgiang16/chng-4-c-trng-hnh-hc-ca-mt-ct-ngang

1 Like

À nó ntn (sorry :smiley: ): chia 1 hình S đc bao bởi đường cong kín C bằng đường cong cắt C tại đúng hai điểm, tạo thành hai hình A và B. Ct gốc là:
xS = (S(A)xA + S(B)xB) / (S(A) + S(B))
= (S_A(xdA) / S_A(dA) * S_A(dA) + S_B(xdA) / S_B(dA) * S_B(dA)) / S(S) (công thức)
= (S_A(xdA) + S_B(xdA)) / S(S) (do hình S gồm hình A và B)
= S_S(xdA) / S(S) :slight_smile: (như trên)

Nếu cắt nhau tại 3, 4, … điểm thì ta chia thành 3, 4, … phần.

Quay lại tứ giác ABCD ta tính S(ABD) = 1/2*|xAyB + xByD + xDyA - xByA - xDyB - xAyD| và tương tự cho S(ACD).

1 Like

công thức thì đơn giản rồi, chủ yếu là giải quyết thì bài toán thớt đưa ra. Mình có nói ở trên rồi, tuy nhiên nếu mở rộng bài toán tìm trọng tâm cho một đa giác có n đỉnh bất kỳ thì sẽ rất hay và không dễ để giải tổng quát trong lập trình.

Cái khó là tính con tích phân S(x dA) và S(y dA) ấy. Để tính trong trường hợp tổng quát thì ta tham số hóa đường cong kín C và dùng Green để đổi nó qua S_C(x(t)dy) và S_C(y(t)dx). Thu được ct thì sẽ viết code dựa trên đó luôn.

mấy hình lập phương có trọng tâm ko nhỉ ? hay chỉ có mấy hình 2D mới có trọng tâm ?

Có bảng công thức cho hình đồng chất và có độ dày đồng nhất đó bạn :slight_smile:

1 Like

không nhất thiết phải tính tích phân này, với đa giác n đỉnh thì có n - 2 tam giác, ta biết được tọa độ của n đỉnh, dễ dàng tính được trọng tâm và diện tích của n - 2 tam giác này, từ đó ráp công thức tính ra thôi.

Một vật thể bất kỳ đều có trọng tâm.
Mình không tưởng tượng được 4D, nhưng 0D, 1D, 2D, 3D vật thể luôn có.

1 Like

Vậy thì ngay chỗ đa giác lõm vào thì làm ntn bạn?

chỗ đa giác lõm thì diện tích 1 tam giác sẽ là âm, bù trừ được, vẫn đúng, chừng nào các cạnh cắt nhau thì mới có vấn đề @_@

ví dụ vẽ cái hình này. ABCDEF là lục giác, thứ tự các đỉnh thuận chiều kim đồng hồ
chia ra làm 4 tam giác: ABC, ACD, ADE, AEF
tam giác ABC thuận chiều kim đồng hồ nên diện tích cùng dấu với ABCDEF
tam giác ACD thuận chiều kim đồng hồ nên diện tích cùng dấu với ABCDEF
tam giác ADE ngược chiều kim đồng hồ nên diện tích khác dấu với ABCDEF
tam giác AEF thuận chiều kim đồng hồ nên diện tích cùng dấu với ABCDEF

tổng diện tích 4 tam giác này vẫn bằng với diện tích ABCDEF @@ Vì: tam giác ADE được chia làm 2 mảnh: mảnh ngoài và mảnh trong. Mảnh ngoài và trong được cộng 1 lần vì ACD cùng dấu, trừ 1 lần vì ADE ngược dấu, và mảnh trong được cộng 1 lần nữa nhờ AEF cùng dấu. Vậy mảnh trong được cộng 1 - 1 + 1 = 1 lần, mảnh ngoài được cộng 1 - 1 = 0 lần. Vẫn đúng @@

1 Like

Anh HK boy giải thích luôn làm sao cái VP khác 0 với à?

(G1, G, G4), (G2, G, G3) là 2 bộ 3 thẳng hàng.

->

->

Mà góc giữa GG1 và GG2 không phải lúc nào cũng bằng 0 -> tổng trên không bằng 0 trong mọi trường hợp.


Nói chung là cách coi trọng tâm là điểm để tổng 4 vector = 0 là sai. Về mặt vật lý là sai.

1 Like

Thực ra mình đang trả lời ý này

và tích phân chỉ là để tìm ra công thức thôi.


Khi xem lại ct trên Wiki, ta thấy rằng có thể tính được hoành độ và tung độ cùng lúc với 4n phép nhân số thực. Trong khi mỗi lần tính diện tích tam giác đã là 3 phép nhân số thực rồi.

A post was merged into an existing topic: Topic chứa các reply được cho là off-topic - version 2

1 Like

Về tính trọng tâm Đa giác n đỉnh đồng nhất, em nghĩ thế này:

Gọi G0 là trọng tâm A0A1A2…An-1G1 là trọng tâm A1A2…An-1.
Có: Tổng_i(G0Ai) = 0, i=0,n-1Tổng_j(G1Aj)=0, j=1,n-1.

Tổng_i(G0Ai) = G0A0 + Tổng_j(G0Aj)
G0Aj = G0G1 + G1Aj
Suy ra: Tổng_i(G0Ai) = G0A0 + (n-1)G0G1 + Tổng_j(G1Aj)
Do đó: G0A0 = - (n-1)G0G1 (X)

Tức là: A0, G0, G1 thẳng hàng.
Bài toán đưa về:

  1. Tìm trọng tâm đa giác n-1 điểm.
  2. Tìm điểm nằm thỏa mãn (X)

Công thức GA + GB + … = 0 là SAI :slight_smile: bạn thử nghĩ xem, trọng tâm của tứ giác thì chỗ nào trên hình cũng có trọng lực, chứ đâu phải chỉ bốn đỉnh. Tam giác thì vô tình nó đúng thôi. (có khi nào kiềng ba chân là ct vững nhất là do sự trùng hợp này? :D)

2 Likes

nếu đa giác lõm bạn hoàn toàn có thể đưa về đa giác lồi, trước khi tính trọng tâm cần kiểm tra lồi lõm, nếu lõm ta sẽ xác định đc nó nằm ở đâu, ta sẽ tìm trọng tâm cho đa giác lồi này nhưng bị mất 1 phần tam giác (dẫn đến chỗ lõm) có 1 chút thay đổi trong công thức tính, chỗ bị mất (thiếu) sẽ là dấu - .
PS: công thức tính này hoàn toàn dựa vào công thức tích phân, 2 cái đó là 1, tuy nhiên nó là trường hợp đặc biệt của công thức kia, thay vì chia nhỏ vi phân ta chia đa giác thành các hình có trọng tâm dễ xác định, như hình chữ nhật, tam giác và cả hình tròn. Trong lập trình khó có thể chia được như vậy, nên mình chọn tam giác là đơn giản nhất để chia.
PS: mình có thể thêm vào 1 hình nào đó đơn giản để biến hình phức tạp (đa giác lõm) thành hình đơn giản ( đa giác lồi) tuy nhiên khi thêm thì trong công thức nó sẽ là dấu trừ thay vì dấu + bình thường.

Mình e là làm như bạn chỉ phù hợp với hình bạn thấy chứ không phù hợp với máy tính :slight_smile: trên máy thì for phát lấy công thức ra là xong rồi. Đây là bài code.

1 Like

đúng rồi, nhưng mình có đề xuất xác định trọng tâm của các tam giác tạo nên bởi các đỉnh của đa giác, trường hợp lồi thì đơn giản, còn trường hợp lõm thì mình có nói ở trên rồi, việc kiểm tra lồi lõm bằng code cũng đâu có khó? sử dụng kiến thức hình học phẳng lớp 10 là đủ.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?