1、 点与三角形的三点连线 形成三个新的三角形,如果这三个新三角形的面积大于原三角形的面积,则点在三角形外http://s7/middle/a401a1eatc58a1f7c8b56&690点与三角形的关系 的几种方法" TITLE="判断 点与三角形的关系 的几种方法" />
2、
利用向量叉乘
p1p2叉乘p1p
p2p3叉乘p2p
p3p2叉乘p3p
如果结果向量的Z分量都为正(或负)
则点在三角形中http://s3/middle/a401a1eatc58a3922d2a2&690点与三角形的关系 的几种方法" TITLE="判断 点与三角形的关系 的几种方法" />
3、
与第二种方法差不多 也是利用叉乘, 但原理不一样
http://s1/middle/a401a1eatc58a63422db0&690点与三角形的关系 的几种方法" TITLE="判断 点与三角形的关系 的几种方法" />
得到三个向量
以向量1为中间向量, 判断向量2
向量3是否在其同一侧,如果在同一侧则点在三角形外,如果不在,继续以向量2为中间向量,判断向量1 向量3
是否同一侧...........
最后 如果以任何向量为中间向量
其前后两个向量在其两侧,则点在三角形内
代码:
int inside4(Point3D
* p1,Point3D * p2,Point3D *
p3, double px,double
py)
{
Point2D
arr[3],tr[3];
arr[0].x = p1->x;
arr[0].y = p1->y;
arr[1].x = p2->x;
arr[1].y = p2->y;
arr[2].x = p3->x;
arr[2].y = p3->y;
memcpy(tr,arr,sizeof(arr));
int i = 0;
for(i=0;i<3;i++)
//
求三个向量
{
arr[i].x
=
tr[i].x
-
px;
arr[i].y
=
tr[i].y
-
py;
}
for(i=0;i<3;i++)
//
判断是否在边界上
{
int
j=(i+1)%3;
if(
arr[i].x*arr[j].y-arr[i].y*arr[j].x==0
)
//点在边界上,向量对称
{
if(
arr[i].x*arr[j].x>0
||
arr[i].y*arr[j].y>0
)
return
0;//
同方向
return
1;
//
方向相反
}
}
for(i=0;i<2;i++)
//
判断在内还是外,在此只需判断两个向量,下有说明【注1】
{
int
front
=
(i+2)%3,
next
=
3-i-front;
int
cnt
=
0;
double
t1
=
arr[i].y*arr[front].x
-
arr[front].y*arr[i].x;
double
t2
=
arr[i].y*arr[next].x
-
arr[next].y
*arr[i].x;
if(
(t1>0)+(t2>0)!=1
)
return
0;
//向量分布在同一侧,则在外;否则不能确定
}
return
1;
//
三个向量都在不同两侧,则在内
//
【注1】:如果三个向量分布在同一侧,则必定有两个向量使得另外的两个向量在该向量的同一侧
//
a
b
c
// 如 |/
三条线,b,c在a的一边,
a,b在c的一边,所以a,b,c中有两条线都可以判断
//
a,b,c三个向量对应的三个顶点在三个向量原点的一个方向,所以该点不在此三角形中
}
4、
求点在该三角形中的重心坐标
如果
0<=u<=1 0<=v<=1
0<=u+v<=1
则在三角形上
5、 过点做水平射线,通过看射线与多边形的交点个数,来判断点与多边形的关系,现在把情况特殊化,用于判断点与三角形的关系
int CCW(CPointData p0, CPointData p1, CPointData p2)
{
double dx1, dx2, dy1, dy2;
dx1 = p1.x - p0.x;
dx2 = p2.x - p0.x;
dy1 = p1.y - p0.y;
dy2 = p2.y - p0.y;
if (dx1 * dy2 > dy1 * dx2)
return 1;
else
return -1;
}
bool Intersect(CPointData p1,CPointData p2,CPointData
p3,CPointData p4)
{
return (((CCW(p1, p2, p3) * CCW(p1, p2, p4)) <=
0)
& ((CCW(p3, p4, p1) * CCW(p3, p4, p2)
<= 0)));
}
bool IsPointInPolyPolyGon(CPointData
pointData,CAreaData * tagPointArray)
{
CPointData ptTest=pointData;
CPointData pt1, pt2, tempPP1, tempPP2;
int wnumintsct;
int iFromNo, iToNo;
pt1 = ptTest;
pt2 = pt1;
// Now go through each of the lines in the polygon and see if
it
// intersects
wnumintsct=0;
iFromNo=0;
iToNo =tagPointArray->nPoint-1;
for (int j = iFromNo; j < iToNo - 1; j++)
{
tempPP1 =
tagPointArray->points[j];
tempPP2 = tagPointArray->points[j + 1];
pt2.x = max(tempPP1.x, tempPP2.x) + 100;//射线
if (Intersect(pt1, pt2, tempPP1, tempPP2))
wnumintsct++;
}
// And the last line
tempPP1 = tagPointArray->points[iToNo - 1];
tempPP2 = tagPointArray->points[iFromNo];
pt2.x = max(tempPP1.x, tempPP2.x) + 100;//射线
if (Intersect(pt1, pt2, tempPP1, tempPP2))
wnumintsct++;
return ((wnumintsct & 1) > 0);
}
加载中,请稍候......