首页  >  问答  >  正文

javascript - js怎么判断一个点在三角形内?

用到什么数学公式?

巴扎黑巴扎黑2687 天前1357

全部回复(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
  • 取消回复