滿天的星座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内。
个人比较喜欢这个方法,因为只含有四则运算和大小判断,不涉及三角函数和平方开方等运算,速度较快。如果有更好的方法,欢迎指教。
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
}
漂亮男人2017-06-12 09:31:32
这还不简单
比如x点 三角形 a、b、c三个角
x为一个角的顶点 如果
axb bxc cxa 三个角和是360度 那么 x点在三角形内
很多文章的
搜索一下咯
http://www.cnblogs.com/baie/a...