梁友栋-Barsky裁剪算法

本文提供了一个使用 Cohen-Sutherland 算法实现的线段裁剪示例程序,该程序通过图形库绘制指定窗口,并判断线段是否完全或部分位于窗口内,进而裁剪掉窗口外的部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <math.h>
#include <graphics.h>
#define LEFT 1
#define RIGHT 2
#define BOTTOM 4
#define TOP 8
#define XL 150
#define XR 350
#define YB 150
#define YT 300



void LBClipLine(float x1,float y1,float x2,float y2,float xl,float xr,float yb,float yt);
int ClipT(float p,float q,float *u1,float *u2);

main()
{
	int x1,y1,x2,y2,xx,yy,xxx,yyy;
	int gdriver=DETECT,gmode;
	initgraph(&gdriver,&gmode," ");
	cleardevice();
	setcolor(12);
	line(XL,YT,XR,YT);
	line(XL,YB,XR,YB);
	line(XL,YT,XL,YB);
	line(XR,YT,XR,YB);
	setcolor(9);
	x1=50;y1=200;x2=450;y2=350;
	xx=0;yy=0;xxx=0;yyy=0;
	line(x1,y1,x2,y2);
	getch();
	setcolor(15);
	LBClipLine(x1,y1,x2,y2,XL,XR,YB,YT);
	getch();

	closegraph();
}

void LBClipLine(float x1,float y1,float x2,float y2,float xl,float xr,float yb,float yt)
{
	float dx,dy,u1,u2;
	u1=0;u2=1.0;
	dx=x2-x1;
	dy=y2-y1;
	if(ClipT(-dx,x1-xl,&u1,&u2))
	{
		if(ClipT(dx,xr-x1,&u1,&u2))
		{
			if(ClipT(-dy,y1-yb,&u1,&u2)==0)
			{
				if(ClipT(dy,yt-y1,&u1,&u2))
				{
					if(u2<1.0)
					{x2=x1+u2*dx;y2=y1+u2*dy;}

					if(u1>0.0)
					{x1=x1+u1*dx;y1=y1+u1*dy;}
					line(x1,y1,x2,y2);
					return;

				}
			}
		}
	}

}



int ClipT(float p,float q,float *u1,float *u2)
{
	float r,f;
	if(p<0.0)
	{
		r=q/p;
		if(r>*u2)
			f=0;
		else if(r>*u1)
		{
			*u1=r;
			f=1;
		}
	}

	else if(p>0.0)
	{
		r=q/p;
		if(r<*u1) f=0;
		else if(r<*u2)
		{
			*u2=r;
			f=1;
		}
	}

	else if(q<0.0)
		f=0;

	return f;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值