javascript - Wie kann man in js feststellen, ob ein Punkt innerhalb eines Dreiecks liegt?
巴扎黑
巴扎黑 2017-06-12 09:29:32
0
3
1392

Welche mathematische Formel wird verwendet?

巴扎黑
巴扎黑

Antworte allen(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...

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage