C++求直线方程并求直线延长线上的某点的算法

C++求直线方程并求直线延长线上的某点的算法

直线方程的几种形式

1一般式:Ax+By+C=0(A、B不同时为0)【适用于所有直线】

A1/A2=B1/B2≠C1/C2←→两直线平行
A1/A2=B1/B2=C1/C2←→两直线重合
横截距a=-C/A
纵截距b=-C/B

2:点斜式:y-y0=k(x-x0) 【适用于不垂直于x轴的直线】

表示斜率为k,且过(x0,y0)的直线

3:截距式:x/a+y/b=1【适用于不过原点或不垂直于x轴、y轴的直线】

表示与x轴、y轴相交,且x轴截距为a,y轴截距为b的直线

4:斜截式:y=kx+b【适用于不垂直于x轴的直线】

表示斜率为k且y轴截距为b的直线

5:两点式:【适用于不垂直于x轴、y轴的直线】

表示过(x1,y1)和(x2,y2)的直线

直线方程求解是一个相对简单的过程,使用的是斜截式方程,先考虑特殊情况,在用斜截式的方法替换就行,pt1和pt2为起点,nLen为延长的距离可为负数,Outpt为计算的延长的点。

#include 
typedef struct Point	//二维点结构
{
	DOUBLE x,y;

	Point()
	{
		x = 0;
		y = 0;
	}

	Point(DOUBLE xx,DOUBLE yy)
	{
		x = xx;
		y = yy;
	}
}SDPoint;
BOOL ExPandLine(SDPoint pt1,SDPoint pt2,DOUBLE nLen,SDPoint& OutPt)
{
	if (pt1.x - pt2.x == 0)
	{
		OutPt.x = pt1.x;
		if (pt1.y - pt2.y > 0)
		{
			OutPt.y = pt2.y - nLen;
		}
		else
		{
			OutPt.y = pt2.y + nLen;
		}
	}
	else if (pt1.y - pt2.y == 0)
	{
		OutPt.y = pt1.y;
		if (pt1.x - pt2.x > 0)
		{
			OutPt.x = pt2.x - nLen;
		}
		else
		{
			OutPt.x = pt2.x + nLen;
		}
	}
	else
	{
		DOUBLE k = 0.0;
		DOUBLE b = 0.0;
		k = (pt1.y - pt2.y)/(pt1.x-pt2.x);
		b = pt1.y - k * pt1.x;
		DOUBLE zoom = 0.0;
		zoom = nLen/sqrt((pt2.x-pt1.x)*(pt2.x-pt1.x)+(pt2.y-pt1.y)*(pt2.y-pt1.y));

		if(k > 0)
		{
			if (pt1.x-pt2.x > 0)
			{
				OutPt.x = pt2.x - zoom * (pt1.x-pt2.x);
				OutPt.y = k*OutPt.x + b;
			} 
			else
			{
				OutPt.x = pt2.x + zoom * (pt2.x-pt1.x);
				OutPt.y = k*OutPt.x + b;
			}
		}
		else
		{
			if (pt1.x-pt2.x > 0)
			{
				OutPt.x = pt2.x - zoom * (pt1.x-pt2.x) ;
				OutPt.y = k*OutPt.x + b;
			} 
			else
			{
				OutPt.x = pt2.x + zoom * (pt2.x - pt1.x);
				OutPt.y = k*OutPt.x + b;
			}
		}
	}
	return TRUE;
}

你可能感兴趣的:(C++)