30/09/2018, 16:10
Cách xác định một điểm có nằm trong tam giác?
Hôm nay dạo facebook thấy có câu hỏi khá hay, làm sao xác định một điểm có thuộc về tam giác hay không? Đạt nhớ lúc học cấp 3 có học một loại công thức có tính được cái này. Và Đạt đã từng làm bài này nhưng lâu quá quên mất. Ai làm thử bài này không? Có thể làm bằng bất kỳ ngôn ngữ gì, có thể google thoải mái
Bài liên quan
Ta sẽ viết được phương trình đi qua 3 cạnh:
=> điểm đó cùng phía với trọng tâm ở cả 3 phương trình đường thẳng
Một cách
@Gio mới học cấp 3 xong hay sao mà nhớ cái vị cùng phía vậy
À. Nếu không nhớ cách đó thì có thể dùng diên tích:
F(A,B,C) giả sử là diện tích tam giác ABC
nếu M nằm trong tam giác thì
s=f(a,b,m)+f(b,c,m)+f(c,a,m)=f(a,b,c)
nếu m nằm ngoài thì s lớn hơn
mình thích cái cách này
Chính xác, cách này là cách mà hồi trước Đạt dùng để làm
Google thì thấy cách này, cách này là sao @Gio?
How to determine if a point is in a 2D triangle?
sáng dậy đọc thấy cái topic của a Đạt , lên trường loằng ngoằng 1 lúc ra cái code này . . e nghĩ dùng kiến thức cấp 3 là tính tương đối của điểm với đường thẳng cũng ngon a ạ … .
đây là code của e . a và mọi người xem thử rồi góp ý cho e nhé …
P/s : nếu nhập lung tung thi toàn là điểm nằm ngoài thôi …
vậy cho luôn cái input ví dụ đi cho nó máu
Điểm A, B, C và điểm cần test ấy
@ltd làm sao cho điểm chắc chắn nằm trong tam giác đc ạ , e chưa cho tam giác đó là tam giác nào cả . e viết để có thể kiểm tra với nhiều tam giác a ạ … . tức là mỗi lần chạy phải nhập 3 phương trình 3 cạnh + điểm cần xét ạ . nhưng phải biết phương trình tổng quát của 3 cạnh của tam giác đó + tọa độ điểm cần xét thì ct mới chạy được , e đang nghiên cứu cho cái nhập tọa độ 3 đỉnh của tam giác cơ mà hơi phức tạp chút ạ .
Cái này là cross clock wise thường dc dùng trong thuật toán hình học. Nếu hàm sign này âm hoặc dương thì nó luôn cùng chiều hoặc ngược chiều kim đồng hồ
bạn nói rõ hơn về cái hàm sign này đi
Cái này cũng dễ hiểu mà:
Bỏ qua th đặc biệt thì đường thẳng đi qua P1,P có dạng
(x-px)/(p1x-px)=(y-py)/(p1y-py)
quy đồng và đưa về pt tổng quát=> xét điêm P2 thay vào pt
=> ta có hàm sign như trên
cách xét diện tích của 3 tam giác con rất hay @Gio . tối nay e phải thử code theo kiểu đó xem có ngắn ko , vì e mới học nên code rất dài và chưa có tối ưu được , e vẫn theo kiểu xét tương đối giữa 1 điểm vs phương trình 3 cạnh của tam giác nhưng e đã sửa lại code để có thể nhập 1 tam giác dưới dạng 3 đỉnh hoặc phương trình 3 cạnh của nó . trong quá trình code e lại thấy xuất hiện các trường hợp đặc biệt là nếu mình nhập lung tung hoặc mình nhập sai thì có thể xảy ra trường hợp đặc biệt là không có 1 tam giác nào cả . thế nên e đã thêm phần phân biệt xem có phải là tam giác hay ko . sau đây là code của e , khá dài ạ . e cũng ko biết có thể tối ưu nó theo cách nào nữa . e đã test thử và thấy ok rồi …
P/s : @ltd @Gio , các a có cách nào khiến code e ngắn hơn mà vẫn giữ được ý tưởng ko ạ .
cái này là a làm theo pp diện tích ạ ?
http://www.blackpawn.com/texts/pointinpoly/default.html
Em tìm được cái này mà hơi khó hiểu. Em làm thì chạy ra kq sai.
Cách giải @genius_hcmus đưa ra có giống cách @Gio nói không ta. Đọc lướt qua thì có vẻ giống. Nhưng chưa vào xem
Em không có viết phương trình, em làm theo cách trên stackoverflow mà sao ra kq chưa đúng.
Em viết tọa độ vector ra rồi nhân theo định thức đó a.
Hình như công thức của bác bị sai nêu mà yB - yA = 0 thì không tính đc e có thử rồi
Lấy lần lượt từng cặp 2 điểm của tam giác ta có 1 đường thẳng. Thay toạ độ điểm còn lại và điểm cần kiểm tra ta được 2 giá trị y. Nếu tích 2 y âm thì điểm check nằm ngoài tam giác.
ở đây ko ai học computer graphics hết à
chuyển về Barycentric coordinate: P = uA + vB + wC, với u + v + w = 1. Nếu P nằm trong tam giác ABC thì u,v,w >= 0. Bản chất của nó cũng y hệt kiểm tra diện tích PAB PBC PCA cộng lại có bằng diện tích ABC.
ta có 3 phương trình:
uA.x + vB.x + wC.x = P.x
uA.y + vB.y + wC.y = P.y
u + v + w = 1
3 phương trình 3 ẩn, giải ra u,v,w dễ dàng. Có u,v,w rồi thì kiểm tra xem u,v,w >= 0 hết thì P nằm trong ABC.
nhưng mỗi lần giải hệ pt vậy rất là mất công, wiki có giải sẵn:
(sao cái hình bị thu nhỏ lại vậy @_@)
tuy có phép chia nhưng nhìn kĩ thì mẫu của u và v đều giống nhau và ko liên quan tới P.x, P.y, như vậy cho tam giác ABC ta có thể tính trước 1/mẫu này. Lần kiểm tra đầu tiên cần 8 phép nhân, các lần kiểm tra sau đó chỉ cần 6 phép nhân.
SO cũng có câu hỏi này:
stackoverflow.com
How to determine if a point is in a 2D triangle?
top answer cũng chỉ cần 6 phép nhân mà còn bị chê đòi xài Barycentric coord