首頁  >  問答  >  主體

javascript - js怎麼判斷一個點在三角形內?

要用到什麼數學公式?

巴扎黑巴扎黑2687 天前1361

全部回覆(3)我來回復

  • 滿天的星座

    滿天的星座2017-06-12 09:31:32

    計算幾何中挺常見的題目

    △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內。


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

    回覆
    0
  • phpcn_u1582

    phpcn_u15822017-06-12 09:31:32

    可以透過 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
    }

    回覆
    0
  • 漂亮男人

    漂亮男人2017-06-12 09:31:32

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

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

    回覆
    0
  • 取消回覆