C++:点 线 位置关系

一、不带方向

         

分享给有需要的人,代码质量勿喷

//点与线的位置关系:左上、点在线上、右下
//p:待确定位置的点
//SP:线上某点
//EP:线上某点,与SP不重合
//返回值:LeftTop、PL、RightBottom
string xjSpatialLocationRelationPointLine(LPoint p, LPoint SP, LPoint EP)
{
	string xjLocation="";

	double xp=p.x, yp=p.y;
	double sx=SP.x, sy=SP.y;
	double ex=EP.x, ey=EP.y;
	double deltaY=ey-sy;
	double deltaX=ex-sx;
	double yl = deltaY * (xp-sx) / deltaX + sy;

	//竖线
	if(deltaX==0)
	{
		if(xp<sx)
			xjLocation="Left";
		else if(xp==sx)
			xjLocation="PL";
		else
			xjLocation="Right";
	}
	else
	{
		if(yp>yl)
			xjLocation="Top";
		else if(yp==yl)
			xjLocation="PL";
		else
			xjLocation="Bottom";
	}
	
	return xjLocation;
}

二、带方向  左右位置

2.1 ΔX=0

          

2.2 ΔX>0

2.3 ΔX<0

分享给有需要的人,代码质量勿喷

//点与向量的位置关系:左、点在线上、右
//p:待确定位置的点
//SP:线上某点
//EP:线上某点,与SP不重合
//返回值:Left、PL、Right
string xjSpatialLocationRelationPointLineLR(LPoint p, LPoint SP, LPoint EP)
{
	string xjLocation="PL";

	double xp=p.x, yp=p.y;
	double sx=SP.x, sy=SP.y;
	double ex=EP.x, ey=EP.y;
	double deltaY=ey-sy;
	double deltaX=ex-sx;
	double yl = deltaY * (xp-sx) / deltaX + sy;

	if(deltaX==0)
	{
		if(deltaY>0)
		{
			if(xp<sx)
				xjLocation="Left";
			else if(xp>sx)
				xjLocation="Right";
		}
		else if(deltaY<0)
		{
			if(xp<sx)
				xjLocation="Right";
			else if(xp>sx)
				xjLocation="Left";
		}
	}
	else if(deltaX>0)
	{
		if(yp>yl)
			xjLocation="Left";
		else if(yp<yl)
			xjLocation="Right";
	}
	else
	{
		if(yp>yl)
			xjLocation="Right";
		else if(yp<yl)
			xjLocation="Left";
	}
	
	return xjLocation;
}
发布了63 篇原创文章 · 获赞 58 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/xinjiang666/article/details/89378578