面试高频算法题补充系列:如何判断一个点是否在三角形内?
前言
了解更多常考高頻算法題可以關(guān)注
公眾號:一個搬磚的胖子
企業(yè)面試題庫:https://codetop.cc/
小程序:CodeTop
該題曾出現(xiàn)在字節(jié)跳動、騰訊、網(wǎng)易、美團(tuán)、小馬智行等公司的面試中。如果你面試的是游戲相關(guān)崗位,那就更得需要掌握了。
- 如何判斷一個點(diǎn)在三角形內(nèi)部,回答了用向量叉乘判斷。——2020.7 字節(jié)跳動-游戲
- 手撕:判斷一個點(diǎn)是否在三角形內(nèi)部——2020.9 美團(tuán)-買菜
- 如何判斷一個點(diǎn)在三角形內(nèi)還是外—— 2019.8 阿里巴巴-游戲
- 怎么判斷一個點(diǎn)在不在三角形內(nèi)——2020.03 騰訊-游戲
題目描述
給定三角形3個點(diǎn)的坐標(biāo),在給定一個點(diǎn)(x,y),判斷該點(diǎn)是否在三角形中。
ps:坐標(biāo)值均為double型
題目分析
方法一:面積比較
判斷△ABO+△BOC+△COA的面積與△ABC是否相等。若相等則O在內(nèi)部,反之則在外部。
點(diǎn)O分別在△ABC內(nèi)外的圖示
如何計算三角形的面積呢?通過坐標(biāo),很容易計算三角形的邊長。再由海倫公式計算面積。
由于double類型計算時有精度問題,因此這種方法存在誤差,在牛客上無法通過全部測試用例。
方法二:向量叉乘
若點(diǎn)O在三角形內(nèi)部,則沿著三角形的邊逆時針走,點(diǎn)O一定保持在邊的左側(cè)。如圖示,點(diǎn)在逆時針行走時,在AB,BC,CA的左側(cè)。
如何判斷點(diǎn)在一個邊的左側(cè)呢?
可以借助向量叉乘來判斷O是否在向量AB的哪一側(cè)。若計算向量AO與向量AB的叉乘的值為正,則表示O在AB的左側(cè),反之為右側(cè)。
(理解最好,理解不了也不要糾結(jié),把叉乘公式記一下就ok)
本題的核心思路就是這樣。如果要讓手撕代碼,題目可能沒有說輸入的3個點(diǎn)是逆時針順序的。比如,上圖中如果依次輸入的是A,C,B的坐標(biāo),那就不行了。
怎么解決呢?假設(shè)依次輸入的點(diǎn)分別是p1,p2,p3。
我們判斷若p3在的右側(cè),則表示輸入的點(diǎn)的順序是順時針的,即A,C,B式的輸入,將p2,p3調(diào)換位置即可保證順序是逆時針。
個人建議:這個解法涉及數(shù)學(xué),如果不太了解向量知識的可能會花費(fèi)很長時間。比如我,說多了都是淚…如果對你來說也很難,這道題可以先只掌握解法一,把準(zhǔn)備面試的寶貴時間花在其他高頻題上,性價比會更高。但如果你面的是游戲相關(guān)業(yè)務(wù),又或者是美團(tuán)買菜部門,我還是建議你花點(diǎn)時間學(xué)學(xué)解法二。
參考鏈接
https://mp.weixin.qq.com/s/qnVUJq4lmnLsXJgyHCXngA
總結(jié)
以上是生活随笔為你收集整理的面试高频算法题补充系列:如何判断一个点是否在三角形内?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 随着计算机技术的快速发展,随着计算机技术
- 下一篇: 空间射线与三角形相交算法的两种实现