逐边裁剪法实现多边形裁剪

已经处理退化边的多边形裁剪算法

//编译环境:Visual C++ 6.0,EasyX_20190219(beta)
#include
#include
#include
#define max 30
using namespace std;

//设置裁剪框的大小和位置,裁剪多边形顶点和顶点数,以全局变量给出
double xl=5,xr=140,yt=190,yb=74;
int inlength=9;
POINT Vertex[]={ {110,84},{160,94},{90,169},{90,94},{70,90},{50,230}, {165,230},{175,89},{163,54} };
//求多边形的一条边sp和裁剪边point0 point1的交点
void Intersect(POINT S,POINT P,POINT point0,POINT point1,POINT &I)
{
	if(point0.y==point1.y)//水平裁剪边
	{
		I.y=point0.y;
		I.x=S.x+(point0.y-S.y)*(P.x-S.x)/(P.y-S.y);
	}
	else//竖直裁剪边
	{
		I.x=point0.x;
		I.y=S.y+(point0.x-S.x)*(P.y-S.y)/(P.x-S.x);
	}
}

//测试顶点与裁剪边的内外关系
bool Inside(POINT text,POINT point0,POINT point1)
{
	if(point1.x>point0.x){//裁剪边为窗口的下边
		if(text.y>=point0.y)
			return true;}

	else if(point1.xpoint0.y){//裁剪边为窗口的右边
		if(text.x<=point0.x)
			return true;}

	else if(point1.y=point0.x)
			return true;}

	return false;
}

//将新的定点加入结果多边形顶点表
void Output(POINT newpoint,int &length,POINT outps[])
{
	outps[length].x=newpoint.x;
	outps[length].y=newpoint.y;
	length++;
}

//裁剪算法
void SutherlandHodgmanPolygonClip(int inlength,POINT inpoints[],int &outlength,POINT outpoints[],POINT point0,POINT point1)
{
	POINT S,P,I;
	int j;
	outlength=0;
	S=inpoints[inlength-1];
	for(j=0;j

逐边裁剪法实现多边形裁剪_第1张图片
逐边裁剪法实现多边形裁剪_第2张图片
以上是按照右下左上的顺序进行裁剪的,当然读者可以按照自己的习惯进行调整。

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