请问怎么判断一个点与三角形的位置关系

时间:2022-06-01 19:34:07
我有个想法:按逆时针方向,如果点都在三条边的左侧,则点在三角形内部;只要有一条边,点不在他的左侧,则该点就在三角形的外部(不考虑点在边上的情况)。不过我不知道该怎么具体实现。。。。。

7 个解决方案

#1


用面积计算,实现比较方便

判断PAB+PAC+PBC的面积与三角形ABC的面积  就知道P点位于哪了

#2


lz自己的方法没太明白,1#的办法还不错

#3


引用 2 楼 bragi523 的回复:
lz自己的方法没太明白,1#的办法还不错


我的意思是:按逆时针方向,如果该点在每条边的左侧,则点在三角形内部;只要有一条边,点不在他的左侧,则该点就在三角形的外部(不考虑点在边上的情况)。。。。。

#4


http://topic.csdn.net/u/20070502/11/55c9dbd0-f26f-4d98-a113-1c172441ace6.html
看3楼
a,b,c都>=0就说明在内部。

#5


引用 1 楼 degree_37 的回复:
用面积计算,实现比较方便

判断PAB+PAC+PBC的面积与三角形ABC的面积 就知道P点位于哪了

1楼的方法,不能判断点的边上这种情况!

楼主本身的方法,可以这么判断,取三角形的一条边,判断点与三角形的另外一个点是否同侧,判断3次,只要都是同侧,那么,就是在三角形内!

#6



// == 0 三点共线,但是不能确定方向。
// <  0 23在12的顺时针方向。
// >  0 23在12的逆时针方向。 
// -----------------------------------------------------------------向量叉乘
inline REAL cross_product(REAL x1, REAL y1, 
  REAL x2, REAL y2, 
  REAL x3, REAL y3)
{
return (x3 - x2) * (y2 - y1) - (y3 - y2) * (x2 - x1);
}

// -------------------------------------------------某点是否在指定的三角形内
inline bool point_in_triangle(REAL x1, REAL y1, 
  REAL x2, REAL y2, 
  REAL x3, REAL y3, 
  REAL x,  REAL y)
{
bool cp1 = cross_product(x1, y1, x2, y2, x, y) < 0.0;
bool cp2 = cross_product(x2, y2, x3, y3, x, y) < 0.0;
bool cp3 = cross_product(x3, y3, x1, y1, x, y) < 0.0;
return cp1 == cp2 && cp2 == cp3 && cp3 == cp1;
}


叉乘判断下方向关系。如果叉乘结果一致肯定在三角形内,其中一个结果=0,则在三角形上,否则三角形外。

#7


lz的想法是正确的,实现方法就看楼上的代码:)

#1


用面积计算,实现比较方便

判断PAB+PAC+PBC的面积与三角形ABC的面积  就知道P点位于哪了

#2


lz自己的方法没太明白,1#的办法还不错

#3


引用 2 楼 bragi523 的回复:
lz自己的方法没太明白,1#的办法还不错


我的意思是:按逆时针方向,如果该点在每条边的左侧,则点在三角形内部;只要有一条边,点不在他的左侧,则该点就在三角形的外部(不考虑点在边上的情况)。。。。。

#4


http://topic.csdn.net/u/20070502/11/55c9dbd0-f26f-4d98-a113-1c172441ace6.html
看3楼
a,b,c都>=0就说明在内部。

#5


引用 1 楼 degree_37 的回复:
用面积计算,实现比较方便

判断PAB+PAC+PBC的面积与三角形ABC的面积 就知道P点位于哪了

1楼的方法,不能判断点的边上这种情况!

楼主本身的方法,可以这么判断,取三角形的一条边,判断点与三角形的另外一个点是否同侧,判断3次,只要都是同侧,那么,就是在三角形内!

#6



// == 0 三点共线,但是不能确定方向。
// <  0 23在12的顺时针方向。
// >  0 23在12的逆时针方向。 
// -----------------------------------------------------------------向量叉乘
inline REAL cross_product(REAL x1, REAL y1, 
  REAL x2, REAL y2, 
  REAL x3, REAL y3)
{
return (x3 - x2) * (y2 - y1) - (y3 - y2) * (x2 - x1);
}

// -------------------------------------------------某点是否在指定的三角形内
inline bool point_in_triangle(REAL x1, REAL y1, 
  REAL x2, REAL y2, 
  REAL x3, REAL y3, 
  REAL x,  REAL y)
{
bool cp1 = cross_product(x1, y1, x2, y2, x, y) < 0.0;
bool cp2 = cross_product(x2, y2, x3, y3, x, y) < 0.0;
bool cp3 = cross_product(x3, y3, x1, y1, x, y) < 0.0;
return cp1 == cp2 && cp2 == cp3 && cp3 == cp1;
}


叉乘判断下方向关系。如果叉乘结果一致肯定在三角形内,其中一个结果=0,则在三角形上,否则三角形外。

#7


lz的想法是正确的,实现方法就看楼上的代码:)