• 大小: 5KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-06-04
  • 语言: C/C++
  • 标签: 图形学  裁剪  

资源简介

进入程序后,左键点击画板生成对应点,两点自动连线,拖动右键会画出矩形框,对线段进行裁剪 裁剪算法采用的是采用Cohen-Sutherland算法

资源截图

代码片段和文件信息

//////////////////////////////////////////////////////
// 程序名称:最终版 试验3-1实现直线段的裁剪算法
// 功      能:进入程序后,左键点击画板生成对应点,两点自动连线,拖动右键会画出矩形框,对线段进行裁剪
//    裁剪算法采用的是采用Cohen-Sutherland算法
// 编译环境:Visual C++ 6.0,EasyX_2014冬至版

// 最后修改:2017-11-1 

#include       // 引用图形库头文件
#include 
#include 

#define LEFT 1//根据位运算,设置对应范围判断的参数常量
#define RIGHT 2
#define BOTTOM 4
#define TOP 8


double encode(double x double y int *codedouble Edge[]/*边的信息*/)
{ //判断端点(xy)的编码Edge数组中分别记录的是 最左边、最右边的横坐标,最上边、最下边的纵坐标,根据点位置设置端点编码
int c;
c=0;
if (x else if (x>Edge[1]) c=c|RIGHT;//判断端点是否在框的左右
if (y else if (y>Edge[3]) c=c|TOP;//判断端点是否在框的上下
*code=c; 
return 0;
}

double C_S_LineClip(double x1double y1double x2double y2double Edge[])
{//根据Cohen-Sutherland算法对之间进行裁剪,(x1y1)(x2y2)分别是被裁剪直线的两个端点,
//Edge数组中分别记录的是 最左边、最右边的横坐标,最上边、最下边的纵坐标。
int code1code2code;
double xy;
encode(x1y1&code1Edge);
encode(x2y2&code2Edge);
while (code1 !=0 || code2 != 0)
{
if ((code1 & code2) != 0)//是否显然不可见 
return 0;
code=code1;
if (code1==0) code=code2;//第一点完全可见
if ((LEFT & code) != 0)
{
x=Edge[0];
y=y1+(y2-y1)*(Edge[0]-x1)/(x2-x1);}//取新端点
else if ((RIGHT & code) != 0)//判断是否超出右边,超出则取半
{
x=Edge[1];
y=y1+(y2 -y1)*(Edge[1]-x1)/(x2-x1); }
else if ((BOTTOM & code) != 0)//是否超出下边,超出则取半
{
y=Edge[2];
x=x1+(x2-x1)*(Edge[2]-y1)/(y2-y1);}
else if ((TOP & code) != 0)//是否超出上边,超出则取半
{
y=Edge[3];
x=x1+(x2-x1)*(Edge[3]-y1)/(y2-y1); }
if (code==code1)//循环截止,即两点重合
{
x1=x; y1=y; encode(xy &code1Edge); }
else
{
x2=x; y2=y; encode(xy &code2Edge); } 
}
line(x1y1x2y2);
return 0;
}
double main()
{
void Cut_Rectangle(double Edge[]int xint ydouble linee[][4]int Num);//画裁剪方框
double Edge[4]={0};//截图方框各点信息
double linee[20][4]={0};//矩阵存点
char Help[]=“按任意键继续“;//提示消息
char Help1[]=“左键点击生成点两点自动画出一条线,右键按住拖动画出裁剪框“;
int Num=0;//已录入点的个数
int flag=0;//判断画线完成否为0时等待输入起点,为1时等待输入终点,为2时表示可以画线
int i=0;
MOUSEMSG m;//定义一个鼠标消息
printf(“程序已装载好,按任意键进入程序“);
getch();
initgraph(640 700); 
while(1)
{
outtextxy(00Help1);
m = GetMouseMsg();// 获取一条鼠标消息
switch(m.uMsg)
{
case WM_LBUTTONDOWN:

评论

共有 条评论