一、圆
判断点到圆心的距离,再让距离和圆的半径比较。小于即在圆的内部,等于则再圆的的边上,大于则再圆的外部。
bool CScenes::IsPointInCir(CPoint point)//point 是从外部传来的点
{
int dis,x,y;
x = point.x - m_cirVertex.x;//m_cirVertex 是圆的圆心坐标
y = point.y - m_cirVertex.y;
dis = sqrt(pow(x,2) + pow(y,2));
if(dis <= 40)
{
return true;
}
return false;
}
二、三角形
使用面积法进行判断,给定平面上一点p(x0,y0),判断该点是否在三角形ABC中,三角形顶点坐标分别为A(xa,ya),B(xb,yb),C(xc,yc)。可以使用面积法来判断,方法如下:其中S(A,B,C)表示三角形ABC的面积。
若abs( S(A,B,C) ) = abs( S(P,B,C) ) + abs( S(A,P,C) ) + abs( S(A,B,P) ) ,则P在三角形ABC的内部或边上;如果还有abs( S(P,B,C) )、abs( S(A,P,C) ) 和abs( S(A,B,P) )全都大于0,则说明P在三角形ABC的内部,否则P在三角形ABC的边上,具体为:S(P,B,C)为0,则说明P在BC边上,S(A,P,C)为0,则说明P在AC边上,S(A,B,P)为0,则说明P在AB边上;
若abs( S(A,B,C) ) < abs( S(P,B,C) ) + abs( S(A,P,C) ) + abs( S(A,B,P) ) ,则P在三角形ABC的外部;
对abs( S(A,B,C) ) > abs( S(P,B,C) ) + abs( S(A,P,C) ) + abs( S(A,B,P) ) 情况在理论上是不存在的。
此处又引出另一个问题,如何求平面中三角形的面积?这个可以使用叉乘法来实现,即S(A,B,C)为向量AB叉乘AC所得向量模的1/2,再对该值求绝对值就是三角形ABC的面积。
bool CScenes::IsPointInTir(CPoint point)//point 是从外部传来的点
{
int tirArea = CalTirArea(m_tirVertex[0],m_tirVertex[1],m_tirVertex[2]);//m_tirVertex是三角形顶点坐标的数组
int splitTirArea = CalTirArea(m_tirVertex[0],m_tirVertex[1],point) + CalTirArea(m_tirVertex[0],point,m_tirVertex[2]) + CalTirArea(point,m_tirVertex[1],m_tirVertex[2]);
if(abs(tirArea - splitTirArea) < 10)//小于10是为了减小误差,使得效果更加明显
{
return true;
}
return false;
}
int CScenes::CalTirArea(CPoint a,CPoint b,CPoint c)//计算三角形的面积
{
int x1 = b.x - a.x;
int y1 = b.y - a.y;
int x2 = c.x - a.x;
int y2 = c.y - a.y;
return abs(x1*y2-x2*y1)/2.0;
}
三、矩形
使用向量法解决,凸多边形内部的点都在凸多边形的边所在的向量的同一侧(前提是计算边所在的向量时采用的是同一个方向,同为顺时针或者同为逆时针),利用又积求解。
假设四边形四个顶点依次为A(x1,y1 ) B(2,2),(x3,3),(X4,Y4),待判断的点为P(x,y),如果点P在四边形内部,则向量AB * AP (注意: 1.这是求叉积; 2.AB、AP均为向量,也就等于(x2-x1) * (y-y1)-(y2-y1) * (x-x1)) 的值与BCBP、CD CP、DA * DP的值同号(若有等于零的情况,则表示P在边上,可以根据自己的喜好把它当做是内部或者外部),即四个值同为正或者同为负,则点P在ABCD内部,否则在外部。
bool CScenes::IsPointInRect(CPoint point)//point 是从外部传来的点
{
CPoint A = m_rectVertex[3];//左下顶点
CPoint B = m_rectVertex[0];//左上顶点
CPoint C = m_rectVertex[1];//右上顶点
CPoint D = m_rectVertex[2];//右下顶点
int a = (B.x - A.x) * (point.y - A.y) - (B.y - A.y) * (point.x - A.x);
int b = (C.x - B.x) * (point.y - B.y) - (C.y - B.y) * (point.x - B.x);
int c = (D.x - C.x) * (point.y - C.y) - (D.y - C.y) * (point.x - C.x);
int d = (A.x - D.x) * (point.y - D.y) - (A.y - D.y) * (point.x - D.x);
if((a > 0 && b > 0 && c > 0 && d > 0) || (a < 0 && b < 0 && c < 0 && d < 0))
{
return true;
}
return false;
}