javascript - js怎麼判斷一個點在三角形內?
巴扎黑
巴扎黑 2017-06-12 09:29:32
0
3
1353

要用到什麼數學公式?

巴扎黑
巴扎黑

全部回覆(3)
滿天的星座

計算幾何中挺常見的題目

△ABC,以及點O(x, y),設三角形頂點座標為:A(x1,y1)、B(x2,y2)、C(x3,y3)

點O在△ABC中,點O和點C在直線AB的同一側,則有:

[(x-x1)(y2-y1) - (y-y1)(x2-x1)][(x3-x1)(y2-y1) - (y3-y1)(x2-x1)] > 0

同理,點O和點B在直線AC的同一側;點O和點A在直線BC的同一側。

滿足以上三個條件,點O就在△ABC內。


個人比較喜歡這個方法,因為只含有四則運算和大小判斷,不涉及三角函數和平方開方等運算,速度較快。如果有更好的方法,歡迎指教。

phpcn_u1582

可以透過 Barycentric coordinate system (重心座標)去處理。
參考連結:https://en.wikipedia.org/wiki...

設要測的點為 (x0, y0),三角形三點分別為 (x1, y1),(x2, y2),(x3, y3)

根據重心座標的定義:

x0 = a * x1 + b * x2  + c * x3
y0 = a * y1 + b * y2 + c * y3
a + b + c = 1

其中 a b c 分別為三個係數。 當且僅當 a b c 均大於等於 0 且小於等於 1 時,點 (x0, y0) 在由點 (x1, y1)、點 (x2, y2) 和點 (x3, y3) 構成的三角形內

由上面的定義可得出 a b c 的解:

a = ((y2 - y3)*(x0 - x3) + (x3 - x2)*(y0 - y3)) / ((y2 - y3)*(x1 - x3) + (x3 - x2)*(y1 - y3))
b = ((y3 - y1)*(x0 - x3) + (x1 - x3)*(y0 - y3)) / ((y2 - y3)*(x1 - x3) + (x3 - x2)*(y1 - y3))
c = 1 - a - b

寫成 JS 方法:

function pointInTriangle(x0, y0, x1, y1, x2, y2, x3, y3) {
  var pisor = (y2 - y3)*(x1 - x3) + (x3 - x2)*(y1 - y3);
  var a = ((y2 - y3)*(x0 - x3) + (x3 - x2)*(y0 - y3)) / pisor;
  var b = ((y3 - y1)*(x0 - x3) + (x1 - x3)*(y0 - y3)) / pisor;
  var c = 1 - a - b;

  return a >= 0 && a <= 1 && b >= 0 && b <= 1 && c >= 0 && c <= 1
}
漂亮男人

這還不簡單
例如x點 三角形 a、b、c三個角
x為一個角的頂點 如果
axb bxc cxa 三個角和是360度 那麼 x點在三角形內

很多文章的
搜尋一下咯
http://www.cnblogs.com/baie/a...

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!