天天看點

C++:點 線 位置關系

一、不帶方向

C++:點 線 位置關系
C++:點 線 位置關系
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

C++:點 線 位置關系
C++:點 線 位置關系

2.2 ΔX>0

C++:點 線 位置關系

2.3 ΔX<0

C++:點 線 位置關系

分享給有需要的人,代碼品質勿噴

//點與向量的位置關系:左、點線上上、右
//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;
}
           

繼續閱讀